From 22ea68a041744137d20528586a54696d3a4229be Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Tue, 21 Feb 2017 15:32:43 +0100 Subject: [PATCH] [groovy] delay computation of argument types until needed --- .../processors/GroovyResolverProcessor.java | 15 ++++++++------- .../processors/GroovyResolverProcessorImpl.java | 7 ++++--- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyResolverProcessor.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyResolverProcessor.java index 60d794f0e25e..2a275cda2919 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyResolverProcessor.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyResolverProcessor.java @@ -18,6 +18,7 @@ package org.jetbrains.plugins.groovy.lang.resolve.processors; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.NotNullComputable; import com.intellij.openapi.util.NotNullLazyValue; +import com.intellij.openapi.util.NullableLazyValue; import com.intellij.psi.*; import com.intellij.psi.scope.ElementClassHint; import com.intellij.psi.scope.JavaScopeProcessorEvent; @@ -61,8 +62,8 @@ public abstract class GroovyResolverProcessor implements PsiScopeProcessor, Elem protected final @Nullable PsiType myThisType; protected final @NotNull PsiType[] myTypeArguments; - private final @Nullable PsiType[] myArgumentTypesNonErased; - protected final @Nullable PsiType[] myArgumentTypes; + private final @NotNull NullableLazyValue myArgumentTypesNonErased; + protected final @NotNull NullableLazyValue myArgumentTypes; private final NotNullLazyValue myPropertySubstitutorComputer = new NotNullLazyValue() { @NotNull @@ -75,7 +76,7 @@ public abstract class GroovyResolverProcessor implements PsiScopeProcessor, Elem @NotNull @Override protected SubstitutorComputer compute() { - return new SubstitutorComputer(myThisType, myArgumentTypesNonErased, myTypeArguments, myRef, myRef.getParent()); + return new SubstitutorComputer(myThisType, myArgumentTypesNonErased.getValue(), myTypeArguments, myRef, myRef.getParent()); } }; private final List myAccessorProcessors; @@ -98,11 +99,11 @@ public abstract class GroovyResolverProcessor implements PsiScopeProcessor, Elem myThisType = PsiImplUtil.getQualifierType(ref); myTypeArguments = ref.getTypeArguments(); if (kinds.contains(GroovyResolveKind.METHOD) || myIsLValue) { - myArgumentTypesNonErased = PsiUtil.getArgumentTypes(ref, false, myUpToArgument); - myArgumentTypes = eraseTypes(myArgumentTypesNonErased); + myArgumentTypesNonErased = NullableLazyValue.createValue(() -> PsiUtil.getArgumentTypes(ref, false, myUpToArgument)); + myArgumentTypes = NullableLazyValue.createValue(() -> eraseTypes(myArgumentTypesNonErased.getValue())); } else { - myArgumentTypes = myArgumentTypesNonErased = null; + myArgumentTypes = myArgumentTypesNonErased = NullableLazyValue.createValue(() -> null); } myAccessorProcessors = calcAccessorProcessors(); @@ -172,7 +173,7 @@ public abstract class GroovyResolverProcessor implements PsiScopeProcessor, Elem if (kind == GroovyResolveKind.METHOD || kind == GroovyResolveKind.PROPERTY) { final PsiMethod method = (PsiMethod)namedElement; final boolean isApplicable = kind == GroovyResolveKind.PROPERTY && !myIsLValue - || isApplicable(myArgumentTypes, method, substitutor, myRef, true); + || isApplicable(myArgumentTypes.getValue(), method, substitutor, myRef, true); final NotNullComputable substitutorComputer; if (kind == GroovyResolveKind.METHOD) { diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyResolverProcessorImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyResolverProcessorImpl.java index 0b2c5b65a397..5e5fe2c72073 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyResolverProcessorImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyResolverProcessorImpl.java @@ -146,11 +146,12 @@ class GroovyResolverProcessorImpl extends GroovyResolverProcessor implements GrM } private List filterCorrectParameterCount(Collection candidates) { - if (myArgumentTypes == null) return ContainerUtil.newArrayList(candidates); + PsiType[] argumentTypes = myArgumentTypes.getValue(); + if (argumentTypes == null) return ContainerUtil.newArrayList(candidates); final List result = ContainerUtil.newSmartList(); for (GroovyResolveResult candidate : candidates) { if (candidate instanceof GroovyMethodResult) { - if (((GroovyMethodResult)candidate).getElement().getParameterList().getParametersCount() == myArgumentTypes.length) { + if (((GroovyMethodResult)candidate).getElement().getParameterList().getParametersCount() == argumentTypes.length) { result.add(candidate); } } @@ -197,7 +198,7 @@ class GroovyResolverProcessorImpl extends GroovyResolverProcessor implements GrM @Nullable @Override public PsiType[] getArgumentTypes() { - return myArgumentTypes; + return myArgumentTypes.getValue(); } @Nullable