diff options
author | Jean-Baptiste Queru <jbq@google.com> | 2013-02-08 15:14:04 -0800 |
---|---|---|
committer | Jean-Baptiste Queru <jbq@google.com> | 2013-02-08 15:14:04 -0800 |
commit | 9edc8f6b58f71ec510ba36b838f115718d9a174d (patch) | |
tree | 06f6df92024fa534ff27e1c0b5fc8b2002848093 /java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java | |
parent | b56ea2a18f232d79481e778085fd64e8ae486fc3 (diff) | |
download | idea-9edc8f6b58f71ec510ba36b838f115718d9a174d.tar.gz |
Snapshot of commit 84dc01e773388c2c72a1fc437f313dd5747e7809
from branch master of git://git.jetbrains.org/idea/community.git
Diffstat (limited to 'java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java')
-rw-r--r-- | java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java | 62 |
1 files changed, 28 insertions, 34 deletions
diff --git a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java index 8126582654f0..8c6f4c4ed477 100644 --- a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java +++ b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java @@ -41,7 +41,6 @@ public class MethodCandidateInfo extends CandidateInfo{ private final PsiType[] myTypeArguments; private PsiSubstitutor myCalcedSubstitutor = null; private final LanguageLevel myLanguageLevel; - private static final Object LOCK = new Object(); public MethodCandidateInfo(PsiElement candidate, PsiSubstitutor substitutor, @@ -99,27 +98,11 @@ public class MethodCandidateInfo extends CandidateInfo{ PsiSubstitutor incompleteSubstitutor = super.getSubstitutor(); PsiMethod method = getElement(); if (myTypeArguments == null) { - Map<PsiElement, Pair<PsiMethod, PsiSubstitutor>> map; - synchronized (LOCK) { - map = CURRENT_CANDIDATE.get(); - if (map == null) { - map = new ConcurrentWeakHashMap<PsiElement, Pair<PsiMethod, PsiSubstitutor>>(); - CURRENT_CANDIDATE.set(map); - } - } - map.put(myArgumentList, Pair.create(getElement(), incompleteSubstitutor)); - try { - - final Set<PsiParameterList> lists = LambdaUtil.ourParams.get(); - if (lists != null && !lists.isEmpty()) { + final Set<PsiParameterList> lists = LambdaUtil.ourParams.get(); + if (lists != null && !lists.isEmpty()) { return inferTypeArguments(DefaultParameterTypeInferencePolicy.INSTANCE); - } - - myCalcedSubstitutor = inferTypeArguments(DefaultParameterTypeInferencePolicy.INSTANCE); - } - finally { - map.remove(myArgumentList); - } + } + myCalcedSubstitutor = inferTypeArguments(DefaultParameterTypeInferencePolicy.INSTANCE); } else { PsiTypeParameter[] typeParams = method.getTypeParameters(); @@ -165,21 +148,32 @@ public class MethodCandidateInfo extends CandidateInfo{ } public PsiSubstitutor inferTypeArguments(final ParameterTypeInferencePolicy policy, final PsiExpression[] arguments) { - PsiMethod method = getElement(); - PsiTypeParameter[] typeParameters = method.getTypeParameters(); - - JavaPsiFacade javaPsiFacade = JavaPsiFacade.getInstance(method.getProject()); - if (!method.hasModifierProperty(PsiModifier.STATIC)) { - final PsiClass containingClass = method.getContainingClass(); - if (containingClass != null && PsiUtil.isRawSubstitutor(containingClass, mySubstitutor)) { - return javaPsiFacade.getElementFactory().createRawSubstitutor(mySubstitutor, typeParameters); - } + Map<PsiElement, Pair<PsiMethod, PsiSubstitutor>> map = CURRENT_CANDIDATE.get(); + if (map == null) { + map = new ConcurrentWeakHashMap<PsiElement, Pair<PsiMethod, PsiSubstitutor>>(); + CURRENT_CANDIDATE.set(map); } + final PsiMethod method = getElement(); + final Pair<PsiMethod, PsiSubstitutor> alreadyThere = map.put(myArgumentList, Pair.create(method, super.getSubstitutor())); + try { + PsiTypeParameter[] typeParameters = method.getTypeParameters(); + + JavaPsiFacade javaPsiFacade = JavaPsiFacade.getInstance(method.getProject()); + if (!method.hasModifierProperty(PsiModifier.STATIC)) { + final PsiClass containingClass = method.getContainingClass(); + if (containingClass != null && PsiUtil.isRawSubstitutor(containingClass, mySubstitutor)) { + return javaPsiFacade.getElementFactory().createRawSubstitutor(mySubstitutor, typeParameters); + } + } - final PsiElement parent = getParent(); - if (parent == null) return PsiSubstitutor.EMPTY; - return javaPsiFacade.getResolveHelper() - .inferTypeArguments(typeParameters, method.getParameterList().getParameters(), arguments, mySubstitutor, parent, policy); + final PsiElement parent = getParent(); + if (parent == null) return PsiSubstitutor.EMPTY; + return javaPsiFacade.getResolveHelper() + .inferTypeArguments(typeParameters, method.getParameterList().getParameters(), arguments, mySubstitutor, parent, policy); + } + finally { + if (alreadyThere == null) map.remove(myArgumentList); + } } public boolean isInferencePossible() { |