enum constants resolution cached (IDEA-183841)

This commit is contained in:
Anna.Kozlova
2017-12-18 10:12:25 +01:00
parent b755bbb683
commit 15020a138d
3 changed files with 83 additions and 10 deletions

View File

@@ -29,6 +29,9 @@ import com.intellij.psi.impl.java.stubs.PsiFieldStub;
import com.intellij.psi.impl.source.tree.ChildRole;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.PsiModificationTracker;
import com.intellij.ui.RowIcon;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
@@ -148,21 +151,19 @@ public class PsiEnumConstantImpl extends JavaStubPsiElement<PsiFieldStub> implem
@Override
public PsiMethod resolveMethod() {
PsiClass containingClass = getContainingClass();
LOG.assertTrue(containingClass != null);
final JavaPsiFacade facade = JavaPsiFacade.getInstance(getProject());
JavaResolveResult resolveResult = facade.getResolveHelper()
.resolveConstructor(facade.getElementFactory().createType(containingClass), getArgumentList(), this);
return (PsiMethod)resolveResult.getElement();
return (PsiMethod)resolveMethodGenerics().getElement();
}
@Override
@NotNull
public JavaResolveResult resolveMethodGenerics() {
PsiClass containingClass = getContainingClass();
LOG.assertTrue(containingClass != null);
final JavaPsiFacade facade = JavaPsiFacade.getInstance(getProject());
return facade.getResolveHelper().resolveConstructor(facade.getElementFactory().createType(containingClass), getArgumentList(), this);
return CachedValuesManager.getCachedValue(this, () -> {
PsiClass containingClass = getContainingClass();
LOG.assertTrue(containingClass != null);
final JavaPsiFacade facade = JavaPsiFacade.getInstance(getProject());
return new CachedValueProvider.Result<>(facade.getResolveHelper().resolveConstructor(facade.getElementFactory().createType(containingClass), getArgumentList(), this),
PsiModificationTracker.MODIFICATION_COUNT);
});
}
@Override

View File

@@ -0,0 +1,68 @@
class Pair<A, B> {
Pair(A a, B b){}
}
enum MyEnum {
C1(
new Pair<>("", 1),
new Pair<>("", 1),
new Pair<>("", 1),
new Pair<>("", 1)
),
C2(
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2)
),
C3(
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2)
),
C4(
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2)
),
C5(
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2)
),
C6(
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2)
),
C7(
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2)
),
C8(
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2)
),
C9(
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2)
),
C10(
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2),
new Pair<>("", 2)
);
MyEnum(Pair<String, Integer>... pairs) {}
MyEnum(String displayName, Pair<String, Integer>... pairs) {}
}

View File

@@ -32,6 +32,10 @@ public class InferencePerformanceTest extends LightDaemonAnalyzerTestCase {
PlatformTestUtil.startPerformanceTest("50 diamond constructor calls passed to Arrays.asList", 12000, this::doTest).usesAllCPUCores().assertTiming();
}
public void testDiamondConstructorCallPassedToEnumConstantWithVarargs() {
PlatformTestUtil.startPerformanceTest("10 enum constants with vararg diamonds", 12000, this::doTest).usesAllCPUCores().assertTiming();
}
public void testLeastUpperBoundWithLotsOfSupers() {
PlatformTestUtil.startPerformanceTest("7 unrelated intersection conjuncts", 12000, this::doTest).usesAllCPUCores().assertTiming();
}