diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java index e1ee9296e15c..5f9135e6b5a8 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java @@ -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); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrMapType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrMapType.java index 9d1dc4bfd5e8..f44a98bbbdc7 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrMapType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrMapType.java @@ -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 myStringEntries; private final List> 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.emptyMap(), Collections.>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(); myOtherEntries=new ArrayList>(); @@ -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 components = new ArrayList(); for (String s : myStringEntries.keySet()) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrNewExpressionImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrNewExpressionImpl.java index 365ac2f4934a..7124a01190c9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrNewExpressionImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrNewExpressionImpl.java @@ -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) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrClosureSignatureUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrClosureSignatureUtil.java index ce36af40c433..1ab3f01fba84 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrClosureSignatureUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrClosureSignatureUtil.java @@ -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) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GroovyCommonClassNames.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GroovyCommonClassNames.java index 55f48d48a2b5..91252c7f2e9e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GroovyCommonClassNames.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GroovyCommonClassNames.java @@ -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() { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java index 0db49c882976..c4e005aac876 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java @@ -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 result = new ArrayList(); if (namedArgs.length > 0) { - result.add(createMapType(namedArgs[0].getResolveScope())); + result.add(new GrMapType(namedArgs[0], namedArgs)); } for (GrExpression expression : expressions) {