diff --git a/java/java-impl/src/com/intellij/psi/resolve/JavaMethodResolveHelper.java b/java/java-impl/src/com/intellij/psi/resolve/JavaMethodResolveHelper.java index 2b3191611767..cd88e48ba124 100644 --- a/java/java-impl/src/com/intellij/psi/resolve/JavaMethodResolveHelper.java +++ b/java/java-impl/src/com/intellij/psi/resolve/JavaMethodResolveHelper.java @@ -15,6 +15,7 @@ */ package com.intellij.psi.resolve; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.infos.CandidateInfo; import com.intellij.psi.infos.MethodCandidateInfo; @@ -25,6 +26,7 @@ import com.intellij.psi.scope.conflictResolvers.DuplicateConflictResolver; import com.intellij.psi.scope.processor.MethodCandidatesProcessor; import com.intellij.psi.scope.processor.MethodResolverProcessor; import com.intellij.psi.util.MethodSignature; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; @@ -45,12 +47,14 @@ public class JavaMethodResolveHelper { public JavaMethodResolveHelper(final PsiElement argumentList, @Nullable final PsiType[] parameterTypes) { myParameterTypes = parameterTypes; + final LanguageLevel languageLevel = PsiUtil.getLanguageLevel(argumentList); final PsiConflictResolver resolver = parameterTypes == null ? DuplicateConflictResolver.INSTANCE : new JavaMethodsConflictResolver(argumentList, parameterTypes); myProcessor = new MethodResolverProcessor(argumentList, new PsiConflictResolver[]{resolver}) { protected MethodCandidateInfo createCandidateInfo(final PsiMethod method, final PsiSubstitutor substitutor, final boolean staticProblem, final boolean accessible) { - return new MethodCandidateInfo(method, substitutor, !accessible, staticProblem, argumentList, myCurrentFileContext, parameterTypes, PsiType.EMPTY_ARRAY); + return new MethodCandidateInfo(method, substitutor, !accessible, staticProblem, argumentList, myCurrentFileContext, parameterTypes, + PsiType.EMPTY_ARRAY, languageLevel); } @Override diff --git a/java/java-impl/src/com/intellij/psi/scope/processor/MethodCandidatesProcessor.java b/java/java-impl/src/com/intellij/psi/scope/processor/MethodCandidatesProcessor.java index 4e4c7aa53af5..3f13e40c4cef 100644 --- a/java/java-impl/src/com/intellij/psi/scope/processor/MethodCandidatesProcessor.java +++ b/java/java-impl/src/com/intellij/psi/scope/processor/MethodCandidatesProcessor.java @@ -62,7 +62,7 @@ public class MethodCandidatesProcessor extends MethodsProcessor{ final boolean staticProblem, final boolean accessible) { return new MethodCandidateInfo(method, substitutor, !accessible, staticProblem, getArgumentList(), myCurrentFileContext, - getArgumentList().getExpressionTypes(), getTypeArguments()); + getArgumentList().getExpressionTypes(), getTypeArguments(), getLanguageLevel()); } protected boolean isAccepted(final PsiMethod candidate) { diff --git a/java/java-impl/src/com/intellij/psi/scope/processor/MethodsProcessor.java b/java/java-impl/src/com/intellij/psi/scope/processor/MethodsProcessor.java index fc9b4d9ed687..73cd192fda70 100644 --- a/java/java-impl/src/com/intellij/psi/scope/processor/MethodsProcessor.java +++ b/java/java-impl/src/com/intellij/psi/scope/processor/MethodsProcessor.java @@ -16,6 +16,7 @@ package com.intellij.psi.scope.processor; import com.intellij.openapi.util.Key; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.filters.ElementFilter; import com.intellij.psi.infos.CandidateInfo; @@ -23,6 +24,7 @@ import com.intellij.psi.scope.ElementClassFilter; import com.intellij.psi.scope.ElementClassHint; import com.intellij.psi.scope.JavaScopeProcessorEvent; import com.intellij.psi.scope.PsiConflictResolver; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.SmartList; /** @@ -41,6 +43,7 @@ public abstract class MethodsProcessor extends ConflictFilterProcessor implement protected PsiClass myAccessClass = null; private PsiExpressionList myArgumentList; private PsiType[] myTypeArguments; + private LanguageLevel myLanguageLevel; public MethodsProcessor(PsiConflictResolver[] resolvers, SmartList container, final PsiElement place) { super(null, ourFilter, resolvers, container, place); @@ -52,6 +55,11 @@ public abstract class MethodsProcessor extends ConflictFilterProcessor implement public void setArgumentList(PsiExpressionList argList) { myArgumentList = argList; + myLanguageLevel = PsiUtil.getLanguageLevel(myArgumentList); + } + + protected LanguageLevel getLanguageLevel() { + return myLanguageLevel; } public void obtainTypeArguments(PsiCallExpression callExpression) { diff --git a/java/openapi/src/com/intellij/psi/infos/MethodCandidateInfo.java b/java/openapi/src/com/intellij/psi/infos/MethodCandidateInfo.java index 70e33bcc70a7..fdaeb1f7b9a0 100644 --- a/java/openapi/src/com/intellij/psi/infos/MethodCandidateInfo.java +++ b/java/openapi/src/com/intellij/psi/infos/MethodCandidateInfo.java @@ -15,6 +15,7 @@ */ package com.intellij.psi.infos; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.Nullable; @@ -28,6 +29,7 @@ public class MethodCandidateInfo extends CandidateInfo{ private final PsiType[] myArgumentTypes; private final PsiType[] myTypeArguments; private PsiSubstitutor myCalcedSubstitutor = null; + private final LanguageLevel myLanguageLevel; public MethodCandidateInfo(PsiElement candidate, PsiSubstitutor substitutor, @@ -37,10 +39,24 @@ public class MethodCandidateInfo extends CandidateInfo{ PsiElement currFileContext, @Nullable PsiType[] argumentTypes, PsiType[] typeArguments) { + this(candidate, substitutor, accessProblem, staticsProblem, argumentList, currFileContext, argumentTypes, typeArguments, + PsiUtil.getLanguageLevel(argumentList)); + } + + public MethodCandidateInfo(PsiElement candidate, + PsiSubstitutor substitutor, + boolean accessProblem, + boolean staticsProblem, + PsiElement argumentList, + PsiElement currFileContext, + @Nullable PsiType[] argumentTypes, + PsiType[] typeArguments, + final LanguageLevel languageLevel) { super(candidate, substitutor, accessProblem, staticsProblem, currFileContext); myArgumentList = argumentList; myArgumentTypes = argumentTypes; myTypeArguments = typeArguments; + myLanguageLevel = languageLevel; } public boolean isApplicable(){ @@ -50,7 +66,7 @@ public class MethodCandidateInfo extends CandidateInfo{ private int getApplicabilityLevelInner() { if (myArgumentTypes == null) return ApplicabilityLevel.NOT_APPLICABLE; - int level = PsiUtil.getApplicabilityLevel(getElement(), getSubstitutor(), myArgumentTypes, PsiUtil.getLanguageLevel(myArgumentList)); + int level = PsiUtil.getApplicabilityLevel(getElement(), getSubstitutor(), myArgumentTypes, myLanguageLevel); if (level > ApplicabilityLevel.NOT_APPLICABLE && !isTypeArgumentsApplicable()) level = ApplicabilityLevel.NOT_APPLICABLE; return level; }