From 6adc409d1f4704eb92bf435aafd35e4e7de713fe Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 27 Feb 2015 15:31:46 +0100 Subject: [PATCH] overload resolution optimization: reuse calculated substitutor --- .../psi/infos/MethodCandidateInfo.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 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 8a63eabe16e2..9b57ab5d4aa4 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 @@ -116,7 +116,7 @@ public class MethodCandidateInfo extends CandidateInfo{ return getApplicabilityLevel(); } @ApplicabilityLevelConstant int level; - PsiSubstitutor substitutor = getSubstitutor(false); + final PsiSubstitutor substitutor = getSubstitutor(false); Map map = CURRENT_CANDIDATE.get(); if (map == null) { map = ContainerUtil.createConcurrentWeakMap(); @@ -143,7 +143,12 @@ public class MethodCandidateInfo extends CandidateInfo{ map.put(getMarkerList(), alreadyThere); } } - if (level > ApplicabilityLevel.NOT_APPLICABLE && !isTypeArgumentsApplicable(false)) { + if (level > ApplicabilityLevel.NOT_APPLICABLE && !isTypeArgumentsApplicable(new Computable() { + @Override + public PsiSubstitutor compute() { + return substitutor; + } + })) { level = ApplicabilityLevel.NOT_APPLICABLE; } return level; @@ -206,17 +211,21 @@ public class MethodCandidateInfo extends CandidateInfo{ public boolean isTypeArgumentsApplicable() { - return isTypeArgumentsApplicable(false); + return isTypeArgumentsApplicable(new Computable() { + @Override + public PsiSubstitutor compute() { + return getSubstitutor(false); + } + }); } - public boolean isTypeArgumentsApplicable(boolean includeReturnConstraint) { + private boolean isTypeArgumentsApplicable(Computable computable) { final PsiMethod psiMethod = getElement(); PsiTypeParameter[] typeParams = psiMethod.getTypeParameters(); if (myTypeArguments != null && typeParams.length != myTypeArguments.length && !PsiUtil.isLanguageLevel7OrHigher(psiMethod)){ return typeParams.length == 0 && JavaVersionService.getInstance().isAtLeast(psiMethod, JavaSdkVersion.JDK_1_7); } - PsiSubstitutor substitutor = getSubstitutor(includeReturnConstraint); - return GenericsUtil.isTypeArgumentsApplicable(typeParams, substitutor, getParent()); + return GenericsUtil.isTypeArgumentsApplicable(typeParams, computable.compute(), getParent()); } protected PsiElement getParent() {