internal canonical text for maps in arg list

This commit is contained in:
Maxim Medvedev
2011-06-07 11:31:41 +04:00
parent bb6188284e
commit ae7bc47caa
6 changed files with 39 additions and 43 deletions
@@ -61,10 +61,10 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameterLi
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAccessorMethod;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureSignature;
import org.jetbrains.plugins.groovy.lang.psi.impl.GrMapType;
import org.jetbrains.plugins.groovy.lang.psi.impl.statements.typedef.members.GrMethodImpl;
import org.jetbrains.plugins.groovy.lang.psi.impl.types.GrClosureSignatureUtil;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import org.jetbrains.plugins.groovy.refactoring.GroovyValidationUtil;
import java.util.ArrayList;
@@ -394,7 +394,7 @@ public class ConvertParameterToMapEntryIntention extends Intention {
private static boolean firstOwnerParameterMustBeMap(final GrParametersOwner owner) {
final GrParameter first = getFirstParameter(owner);
final PsiType type = first.getTypeGroovy();
final PsiClassType mapType = PsiUtil.createMapType(GlobalSearchScope.allScope(owner.getProject()));
final PsiClassType mapType = new GrMapType(GlobalSearchScope.allScope(owner.getProject()));
// First parameter may be used as map
return type == null || type.isConvertibleFrom(mapType);
}
@@ -19,20 +19,18 @@ package org.jetbrains.plugins.groovy.lang.psi.impl;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.CommonClassNames;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiClassType;
import com.intellij.psi.PsiType;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.containers.HashMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import java.util.*;
import java.util.HashSet;
import static com.intellij.psi.CommonClassNames.JAVA_UTIL_MAP;
import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.JAVA_UTIL_LINKED_HASH_MAP;
/**
* @author peter
@@ -42,11 +40,8 @@ public class GrMapType extends GrLiteralClassType {
private final Map<String, PsiType> myStringEntries;
private final List<Pair<PsiType, PsiType>> myOtherEntries;
@NonNls
private static final String JAVA_UTIL_LINKED_HASH_MAP = "java.util.LinkedHashMap";
private final String myJavaClassName;
public GrMapType(GlobalSearchScope scope) {
this(JavaPsiFacade.getInstance(scope.getProject()), scope, Collections.<String, PsiType>emptyMap(), Collections.<Pair<PsiType, PsiType>>emptyList(), LanguageLevel.JDK_1_5);
}
@@ -68,15 +63,13 @@ public class GrMapType extends GrLiteralClassType {
myStringEntries = stringEntries;
myOtherEntries = otherEntries;
myJavaClassName =
facade.findClass(JAVA_UTIL_LINKED_HASH_MAP, scope) != null ? JAVA_UTIL_LINKED_HASH_MAP : CommonClassNames.JAVA_UTIL_MAP;
myJavaClassName = facade.findClass(JAVA_UTIL_LINKED_HASH_MAP, scope) != null ? JAVA_UTIL_LINKED_HASH_MAP : JAVA_UTIL_MAP;
}
public GrMapType(JavaPsiFacade facade, GlobalSearchScope scope, GrNamedArgument[] args) {
super(LanguageLevel.JDK_1_5, scope, facade);
public GrMapType(@NotNull PsiElement context, GrNamedArgument[] args) {
super(LanguageLevel.JDK_1_5, context.getResolveScope(), JavaPsiFacade.getInstance(context.getProject()));
myJavaClassName =
facade.findClass(JAVA_UTIL_LINKED_HASH_MAP, scope) != null ? JAVA_UTIL_LINKED_HASH_MAP : CommonClassNames.JAVA_UTIL_MAP;
myJavaClassName = myFacade.findClass(JAVA_UTIL_LINKED_HASH_MAP, myScope) != null ? JAVA_UTIL_LINKED_HASH_MAP : JAVA_UTIL_MAP;
myStringEntries = new HashMap<String, PsiType>();
myOtherEntries=new ArrayList<Pair<PsiType, PsiType>>();
@@ -148,7 +141,12 @@ public class GrMapType extends GrLiteralClassType {
}
public String getInternalCanonicalText() {
if (myStringEntries.size() == 0) return "[:]";
if (myStringEntries.size() == 0) {
if (myOtherEntries.size() == 0) return "[:]";
String name = getJavaClassName();
final PsiType[] params = getParameters();
return name + "<" + params[0].getInternalCanonicalText() + ", " + params[1].getInternalCanonicalText() + ">";
}
List<String> components = new ArrayList<String>();
for (String s : myStringEntries.keySet()) {
@@ -36,6 +36,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.types.GrBuiltInTypeElement;
import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement;
import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement;
import org.jetbrains.plugins.groovy.lang.psi.impl.GrClassReferenceType;
import org.jetbrains.plugins.groovy.lang.psi.impl.GrMapType;
import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyResolveResultImpl;
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.path.GrCallExpressionImpl;
@@ -139,8 +140,8 @@ public class GrNewExpressionImpl extends GrCallExpressionImpl implements GrNewEx
if (argumentList == null) return GroovyResolveResult.EMPTY_ARRAY;
if (argumentList.getNamedArguments().length > 0 && argumentList.getExpressionArguments().length == 0) {
GroovyResolveResult[] constructorResults = PsiUtil.getConstructorCandidates(ref, classResults, new PsiType[]{PsiUtil.createMapType(
getResolveScope())}); //one Map parameter, actually
PsiType mapType = new GrMapType(argumentList, getNamedArguments());
GroovyResolveResult[] constructorResults = PsiUtil.getConstructorCandidates(ref, classResults, new PsiType[]{mapType}); //one Map parameter, actually
for (GroovyResolveResult result : constructorResults) {
final PsiElement resolved = result.getElement();
if (resolved instanceof PsiMethod) {
@@ -528,7 +528,7 @@ public class GrClosureSignatureUtil {
if (params.length == 0) return null;
PsiType type = params[0].getType();
if (InheritanceUtil.isInheritor(type, CommonClassNames.JAVA_UTIL_MAP)) {
innerArgs.add(new InnerArg(PsiUtil.createMapType(context.getResolveScope()), namedArgs));
innerArgs.add(new InnerArg(new GrMapType(context.getResolveScope()), namedArgs));
}
else {
return null;
@@ -677,7 +677,7 @@ public class GrClosureSignatureUtil {
for (int i = 0, size = arg.args.size(); i < size; i++) {
args[i] = (GrNamedArgument)arg.args.get(i);
}
return new GrMapType(JavaPsiFacade.getInstance(manager.getProject()), resolveScope, args);
return new GrMapType(first, args);
}
else {
for (PsiElement elem : arg.args) {
@@ -22,25 +22,26 @@ import org.jetbrains.annotations.NonNls;
*/
public final class GroovyCommonClassNames {
public static final String GROOVY_OBJECT_SUPPORT = "groovy.lang.GroovyObjectSupport";
public static final String GROOVY_LANG_CLOSURE = "groovy.lang.Closure";
public static final String DEFAULT_BASE_CLASS_NAME = "groovy.lang.GroovyObject";
public static final String GROOVY_LANG_GSTRING = "groovy.lang.GString";
public static final String DEFAULT_GROOVY_METHODS = "org.codehaus.groovy.runtime.DefaultGroovyMethods";
public static final String GROOVY_LANG_SCRIPT = "groovy.lang.Script";
public static final String GROOVY_LANG_INT_RANGE = "groovy.lang.IntRange";
public static final String GROOVY_LANG_OBJECT_RANGE = "groovy.lang.ObjectRange";
public static final String GROOVY_LANG_DELEGATE = "groovy.lang.Delegate";
public static final String JAVA_UTIL_REGEX_PATTERN = "java.util.regex.Pattern";
public static final String JAVA_MATH_BIG_DECIMAL = "java.math.BigDecimal";
public static final String JAVA_MATH_BIG_INTEGER = "java.math.BigInteger";
@NonNls public static final String GROOVY_OBJECT_SUPPORT = "groovy.lang.GroovyObjectSupport";
@NonNls public static final String GROOVY_LANG_CLOSURE = "groovy.lang.Closure";
@NonNls public static final String DEFAULT_BASE_CLASS_NAME = "groovy.lang.GroovyObject";
@NonNls public static final String GROOVY_LANG_GSTRING = "groovy.lang.GString";
@NonNls public static final String DEFAULT_GROOVY_METHODS = "org.codehaus.groovy.runtime.DefaultGroovyMethods";
@NonNls public static final String GROOVY_LANG_SCRIPT = "groovy.lang.Script";
@NonNls public static final String GROOVY_LANG_INT_RANGE = "groovy.lang.IntRange";
@NonNls public static final String GROOVY_LANG_OBJECT_RANGE = "groovy.lang.ObjectRange";
@NonNls public static final String GROOVY_LANG_DELEGATE = "groovy.lang.Delegate";
@NonNls public static final String JAVA_UTIL_REGEX_PATTERN = "java.util.regex.Pattern";
@NonNls public static final String JAVA_MATH_BIG_DECIMAL = "java.math.BigDecimal";
@NonNls public static final String JAVA_MATH_BIG_INTEGER = "java.math.BigInteger";
@NonNls public static final String ORG_CODEHAUS_GROOVY_RUNTIME_METHOD_CLOSURE = "org.codehaus.groovy.runtime.MethodClosure";
@NonNls public static final String JAVA_UTIL_REGEX_MATCHER = "java.util.regex.Matcher";
public static final String GROOVY_TRANSFORM_FIELD = "groovy.transform.Field";
public static final String GROOVY_TRANSFORM_TUPLE_CONSTRUCTOR = "groovy.transform.TupleConstructor";
public static final String GROOVY_TRANSFORM_IMMUTABLE = "groovy.transform.Immutable";
public static final String GROOVY_TRANSFORM_CANONICAL = "groovy.transform.Canonical";
@NonNls public static final String GROOVY_TRANSFORM_FIELD = "groovy.transform.Field";
@NonNls public static final String GROOVY_TRANSFORM_TUPLE_CONSTRUCTOR = "groovy.transform.TupleConstructor";
@NonNls public static final String GROOVY_TRANSFORM_IMMUTABLE = "groovy.transform.Immutable";
@NonNls public static final String GROOVY_TRANSFORM_CANONICAL = "groovy.transform.Canonical";
@NonNls public static final String GROOVY_LANG_REFERENCE = "groovy.lang.Reference";
@NonNls public static final String JAVA_UTIL_LINKED_HASH_MAP = "java.util.LinkedHashMap";
private GroovyCommonClassNames() {
@@ -175,10 +175,6 @@ public class PsiUtil {
return GrClosureSignatureUtil.isSignatureApplicable(signature, argumentTypes, context);
}
public static PsiClassType createMapType(GlobalSearchScope scope) {
return new GrMapType(scope);
}
@Nullable
public static GrArgumentList getArgumentsList(PsiElement methodRef) {
if (methodRef instanceof GrEnumConstant) return ((GrEnumConstant)methodRef).getArgumentList();
@@ -227,7 +223,7 @@ public class PsiUtil {
List<PsiType> result = new ArrayList<PsiType>();
if (namedArgs.length > 0) {
result.add(createMapType(namedArgs[0].getResolveScope()));
result.add(new GrMapType(namedArgs[0], namedArgs));
}
for (GrExpression expression : expressions) {