compute language level less times

This commit is contained in:
peter
2011-03-23 21:03:30 +01:00
parent 9ece4ea5bd
commit 92bcbec2cd
4 changed files with 31 additions and 3 deletions
@@ -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
@@ -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) {
@@ -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<CandidateInfo> 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) {
@@ -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;
}