summaryrefslogtreecommitdiff
path: root/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java
diff options
context:
space:
mode:
authorJean-Baptiste Queru <jbq@google.com>2013-02-08 15:14:04 -0800
committerJean-Baptiste Queru <jbq@google.com>2013-02-08 15:14:04 -0800
commit9edc8f6b58f71ec510ba36b838f115718d9a174d (patch)
tree06f6df92024fa534ff27e1c0b5fc8b2002848093 /java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java
parentb56ea2a18f232d79481e778085fd64e8ae486fc3 (diff)
downloadidea-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.java62
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() {