mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Groovy: cache LiteralConstructorReferences
This commit is contained in:
+32
-9
@@ -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<GrExpression> result = new ArrayList<GrExpression>();
|
||||
List<GrExpression> 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<PsiReference>() {
|
||||
@Nullable
|
||||
@Override
|
||||
public Result<PsiReference> 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<GrListOrMapImpl, PsiType> {
|
||||
@Nullable
|
||||
public PsiType fun(GrListOrMapImpl listOrMap) {
|
||||
|
||||
Reference in New Issue
Block a user