diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/GrListOrMapImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/GrListOrMapImpl.java index 15791c2f4fb1..55413ba6c1b0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/GrListOrMapImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/GrListOrMapImpl.java @@ -22,9 +22,12 @@ import com.intellij.psi.*; import com.intellij.psi.impl.source.tree.LeafPsiElement; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.tree.TokenSet; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.InheritanceUtil; +import com.intellij.psi.util.PsiModificationTracker; import com.intellij.util.Function; -import com.intellij.util.ReflectionCache; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.findUsages.LiteralConstructorReference; @@ -46,7 +49,6 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUt import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; -import java.lang.reflect.Array; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -118,11 +120,13 @@ public class GrListOrMapImpl extends GrExpressionImpl implements GrListOrMap { @NotNull public GrExpression[] getInitializers() { - List result = new ArrayList(); + List result = ContainerUtil.newArrayList(); for (PsiElement cur = getFirstChild(); cur != null; cur = cur.getNextSibling()) { - if (ReflectionCache.isInstance(cur, GrExpression.class)) result.add((GrExpression)cur); + if (cur instanceof GrExpression) { + result.add((GrExpression)cur); + } } - return result.toArray((GrExpression[]) Array.newInstance(GrExpression.class, result.size())); + return result.toArray(new GrExpression[result.size()]); } @NotNull @@ -141,13 +145,21 @@ public class GrListOrMapImpl extends GrExpressionImpl implements GrListOrMap { @Override public PsiReference getReference() { + return CachedValuesManager.getCachedValue(this, new CachedValueProvider() { + @Nullable + @Override + public Result compute() { + return Result.create(getReferenceImpl(), PsiModificationTracker.MODIFICATION_COUNT); + } + }); + } + + @Nullable + private PsiReference getReferenceImpl() { final PsiClassType conversionType = LiteralConstructorReference.getTargetConversionType(this); if (conversionType == null) return null; - PsiType ownType = getType(); - if (ownType instanceof PsiClassType) { - ownType = ((PsiClassType)ownType).rawType(); - } + PsiType ownType = getTypeWithoutGenerics(); if (ownType != null && TypesUtil.isAssignableWithoutConversions(conversionType.rawType(), ownType, this)) return null; final PsiClass resolved = conversionType.resolve(); @@ -159,6 +171,17 @@ public class GrListOrMapImpl extends GrExpressionImpl implements GrListOrMap { return new LiteralConstructorReference(this, conversionType); } + @Nullable + private PsiType getTypeWithoutGenerics() { + PsiType ownType = getType(); + if (ownType instanceof PsiClassType) { + return ((PsiClassType)ownType).rawType(); + } + else { + return ownType; + } + } + private static class MyTypesCalculator implements Function { @Nullable public PsiType fun(GrListOrMapImpl listOrMap) {