diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java index dd46437867c3..227825b4aced 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java @@ -17,10 +17,13 @@ package com.intellij.codeInsight; import com.intellij.openapi.util.NullableComputable; +import com.intellij.openapi.util.NullableLazyValue; +import com.intellij.openapi.util.VolatileNullableLazyValue; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiType; import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class ExpectedTypeInfoImpl implements ExpectedTypeInfo { public static final NullableComputable NULL = new NullableComputable() { @@ -37,7 +40,8 @@ public class ExpectedTypeInfoImpl implements ExpectedTypeInfo { @NotNull private final TailType myTailType; private final PsiMethod myCalledMethod; - @NotNull private final NullableComputable expectedName; + @NotNull private final NullableComputable expectedNameComputable; + @NotNull private final NullableLazyValue expectedNameLazyValue; @Override public int getKind() { @@ -62,15 +66,22 @@ public class ExpectedTypeInfoImpl implements ExpectedTypeInfo { this.myTailType = myTailType; this.defaultType = defaultType; myCalledMethod = calledMethod; - this.expectedName = expectedName; + this.expectedNameComputable = expectedName; + expectedNameLazyValue = new VolatileNullableLazyValue() { + @Nullable + @Override + protected String compute() { + return expectedNameComputable.compute(); + } + }; PsiUtil.ensureValidType(type); PsiUtil.ensureValidType(defaultType); } - @NotNull - public NullableComputable getExpectedName() { - return expectedName; + @Nullable + public String getExpectedName() { + return expectedNameLazyValue.getValue(); } @Override diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java index bc6273eb1074..c9f75a0486b5 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java @@ -630,9 +630,15 @@ public class ExpectedTypesProvider { myResult = visitor.getResult(); if (!(expr.getParent() instanceof PsiExpressionList)) { for (int i = 0; i < myResult.length; i++) { - ExpectedTypeInfo info = myResult[i]; + final ExpectedTypeInfo info = myResult[i]; myResult[i] = createInfoImpl(info.getType(), info.getKind(), info.getDefaultType(), TailType.NONE, info.getCalledMethod(), - ((ExpectedTypeInfoImpl)info).getExpectedName()); + new NullableComputable() { + @Nullable + @Override + public String compute() { + return ((ExpectedTypeInfoImpl)info).getExpectedName(); + } + }); } } return; @@ -870,9 +876,15 @@ public class ExpectedTypesProvider { else if (myExpr.equals(expr.getThenExpression())) { ExpectedTypeInfo[] types = getExpectedTypes(expr, myForCompletion); for (int i = 0; i < types.length; i++) { - ExpectedTypeInfo info = types[i]; + final ExpectedTypeInfo info = types[i]; types[i] = createInfoImpl(info.getType(), info.getKind(), info.getDefaultType(), TailType.COND_EXPR_COLON, info.getCalledMethod(), - ((ExpectedTypeInfoImpl)info).getExpectedName()); + new NullableComputable() { + @Nullable + @Override + public String compute() { + return ((ExpectedTypeInfoImpl)info).getExpectedName(); + } + }); } myResult = types; } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java index e2296e4c3d2c..cabc5d915fed 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java @@ -227,7 +227,7 @@ public class JavaCompletionSorting { private static int calcMatch(final List words, int max, ExpectedTypeInfo[] myExpectedInfos) { for (ExpectedTypeInfo myExpectedInfo : myExpectedInfos) { - String expectedName = ((ExpectedTypeInfoImpl)myExpectedInfo).getExpectedName().compute(); + String expectedName = ((ExpectedTypeInfoImpl)myExpectedInfo).getExpectedName(); if (expectedName == null) continue; max = calcMatch(expectedName, words, max); max = calcMatch(truncDigits(expectedName), words, max); @@ -504,7 +504,7 @@ public class JavaCompletionSorting { int max = 0; final List wordsNoDigits = NameUtil.nameToWordsLowerCase(truncDigits(name)); for (ExpectedTypeInfo myExpectedInfo : myExpectedTypes) { - String expectedName = ((ExpectedTypeInfoImpl)myExpectedInfo).getExpectedName().compute(); + String expectedName = ((ExpectedTypeInfoImpl)myExpectedInfo).getExpectedName(); if (expectedName != null) { final THashSet set = new THashSet(NameUtil.nameToWordsLowerCase(truncDigits(expectedName))); set.retainAll(wordsNoDigits); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java index bcc783643a91..c5c1e3994a46 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java @@ -56,7 +56,7 @@ public class JavaCompletionStatistician extends CompletionStatistician{ PsiClass containingClass = ((PsiMember)o).getContainingClass(); if (containingClass != null) { - String expectedName = firstInfo instanceof ExpectedTypeInfoImpl ? ((ExpectedTypeInfoImpl)firstInfo).getExpectedName().compute() : null; + String expectedName = firstInfo instanceof ExpectedTypeInfoImpl ? ((ExpectedTypeInfoImpl)firstInfo).getExpectedName() : null; String contextPrefix = expectedName == null ? "" : "expectedName=" + expectedName + "###"; String context = contextPrefix + JavaStatisticsManager.getMemberUseKey2(containingClass);