From eb3dfbb063d7b4ab57122ba4f70a88eb161779bf Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 21 Oct 2011 16:51:37 +0200 Subject: [PATCH] check for gdsl named parameter types (IDEA-71141) --- .../groovy/dsl/CustomMembersGenerator.java | 15 ++++++++++-- .../dsl/holders/NonCodeMembersHolder.java | 9 +++++--- ...GroovySourceCodeNamedArgumentProvider.java | 21 ++++------------- .../lang/psi/api/statements/GrField.java | 5 +++- .../GrNamedArgumentSearchVisitor.java | 20 +++++++--------- .../statements/typedef/members/GrMethod.java | 5 +++- .../lang/psi/impl/statements/GrFieldImpl.java | 11 +++++++-- .../members/GrAnnotationMethodImpl.java | 9 +++++--- .../typedef/members/GrMethodBaseImpl.java | 23 ++++++++++++++----- .../lang/psi/impl/synthetic/GrLightField.java | 17 +++++--------- .../impl/synthetic/GrLightMethodBuilder.java | 16 +++++++------ .../impl/synthetic/GrReflectedMethodImpl.java | 6 +++-- .../groovy/lang/psi/stubs/GrFieldStub.java | 1 + .../groovy/lang/psi/stubs/GrMethodStub.java | 2 +- .../stubs/elements/GrFieldElementType.java | 13 +++++------ .../stubs/elements/GrMethodElementType.java | 4 +++- .../dynamicMembers/DynamicMemberUtils.java | 7 +++--- .../dynamicMembers/GrDynamicMethodImpl.java | 6 +++-- .../dynamicMembers/GrDynamicPropertyImpl.java | 6 +++-- .../plugins/groovy/dsl/GroovyDslTest.groovy | 23 +++++++++++++++---- .../ChangeSignatureTestCase.java | 4 ---- 21 files changed, 132 insertions(+), 91 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/CustomMembersGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/CustomMembersGenerator.java index cac0f6f57b42..2f2fc39fad68 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/CustomMembersGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/CustomMembersGenerator.java @@ -10,11 +10,15 @@ import groovy.lang.GroovyObjectSupport; import groovy.lang.MetaMethod; import org.codehaus.groovy.runtime.DefaultGroovyMethods; import org.codehaus.groovy.runtime.InvokerHelper; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.dsl.dsltop.GdslMembersProvider; import org.jetbrains.plugins.groovy.dsl.holders.CompoundMembersHolder; import org.jetbrains.plugins.groovy.dsl.holders.CustomMembersHolder; import org.jetbrains.plugins.groovy.dsl.holders.NonCodeMembersHolder; +import org.jetbrains.plugins.groovy.dsl.toplevel.ClassContextFilter; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames; import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils; @@ -223,11 +227,18 @@ public class CustomMembersGenerator extends GroovyObjectSupport implements GdslM public static class ParameterDescriptor { public final String name; - public final String type; + public final GroovyNamedArgumentProvider.ArgumentDescriptor descriptor; private ParameterDescriptor(Map args) { this.name = (String)args.get("name"); - this.type = stringifyType(args.get("type")); + final String typeText = stringifyType(args.get("type")); + descriptor = new GroovyNamedArgumentProvider.ArgumentDescriptor() { + @Override + public boolean checkType(@NotNull PsiType type, @NotNull GroovyPsiElement context) { + return typeText == null || ClassContextFilter.isSubtype(type, context.getContainingFile(), typeText); + } + }; + descriptor.setShowFirst(true); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java index 6a56b2dd0fa9..273cd709a2dc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java @@ -15,6 +15,7 @@ */ package org.jetbrains.plugins.groovy.dsl.holders; +import com.google.common.collect.Maps; import com.intellij.openapi.util.Key; import com.intellij.psi.*; import com.intellij.psi.scope.PsiScopeProcessor; @@ -25,6 +26,7 @@ import com.intellij.psi.util.PsiModificationTracker; import com.intellij.util.containers.ConcurrentFactoryMap; import org.jetbrains.plugins.groovy.dsl.CustomMembersGenerator; import org.jetbrains.plugins.groovy.dsl.GroovyClassDescriptor; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightMethodBuilder; import java.util.ArrayList; @@ -77,13 +79,14 @@ public class NonCodeMembersHolder implements CustomMembersHolder { method.addParameter(String.valueOf(paramName), convertToPsiType(typeName, place), false); if (isNamed) { - List namedParams = new ArrayList(); + Map namedParams = Maps.newHashMap(); for (Object o : (List)value) { if (o instanceof CustomMembersGenerator.ParameterDescriptor) { - namedParams.add(((CustomMembersGenerator.ParameterDescriptor)o).name); + namedParams.put(((CustomMembersGenerator.ParameterDescriptor)o).name, + ((CustomMembersGenerator.ParameterDescriptor)o).descriptor); } } - method.setNamedParametersArray(namedParams.toArray(new String[namedParams.size()])); + method.setNamedParameters(namedParams); } } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/GroovySourceCodeNamedArgumentProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/GroovySourceCodeNamedArgumentProvider.java index 06d0675f0d11..d0755057ba24 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/GroovySourceCodeNamedArgumentProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/GroovySourceCodeNamedArgumentProvider.java @@ -19,8 +19,6 @@ import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; -import org.jetbrains.plugins.groovy.extensions.NamedArgumentDescriptor; -import org.jetbrains.plugins.groovy.extensions.NamedArgumentDescriptor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrNamedArgumentSearchVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; @@ -38,26 +36,15 @@ public class GroovySourceCodeNamedArgumentProvider extends GroovyNamedArgumentPr @Nullable PsiElement resolve, @Nullable String argumentName, boolean forCompletion, - Map result) { - if (!forCompletion) return; - - String[] namedParametersArray; - + Map result) { if (resolve instanceof GrMethod) { - namedParametersArray = ((GrMethod)resolve).getNamedParametersArray(); + result.putAll(((GrMethod)resolve).getNamedParameters()); } else if (resolve instanceof GrField) { - namedParametersArray = ((GrField)resolve).getNamedParametersArray(); + result.putAll(((GrField)resolve).getNamedParameters()); } else if (resolve instanceof GrVariable) { - namedParametersArray = GrNamedArgumentSearchVisitor.find((GrVariable)resolve); - } - else { - return; - } - - for (String parameter : namedParametersArray) { - result.put(parameter, NamedArgumentDescriptor.SIMPLE_ON_TOP); + result.putAll(GrNamedArgumentSearchVisitor.find((GrVariable)resolve)); } } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrField.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrField.java index 1728602a636c..38ddc1b99243 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrField.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrField.java @@ -18,10 +18,13 @@ package org.jetbrains.plugins.groovy.lang.psi.api.statements; import com.intellij.psi.PsiField; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocCommentOwner; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAccessorMethod; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMember; +import java.util.Map; + /** * @author ven */ @@ -37,7 +40,7 @@ public interface GrField extends GrVariable, GrMember, PsiField, GrTopLevelDefin GrAccessorMethod[] getGetters(); @NotNull - String[] getNamedParametersArray(); + Map getNamedParameters(); void clearCaches(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrNamedArgumentSearchVisitor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrNamedArgumentSearchVisitor.java index 3ed0f9a7e030..1a2a83f98e44 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrNamedArgumentSearchVisitor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrNamedArgumentSearchVisitor.java @@ -18,7 +18,7 @@ package org.jetbrains.plugins.groovy.lang.psi.api.statements; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; -import com.intellij.util.ArrayUtil; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.lang.psi.GroovyRecursiveElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; @@ -38,7 +38,7 @@ import java.util.*; public class GrNamedArgumentSearchVisitor extends GroovyRecursiveElementVisitor { private static final Set METHOD_NAMES = new HashSet(Arrays.asList("containsKey", "remove", "get")); - private Set myResult; + private final Map myResult = new HashMap(); private final String myFirstArgumentName; @@ -46,8 +46,8 @@ public class GrNamedArgumentSearchVisitor extends GroovyRecursiveElementVisitor myFirstArgumentName = firstArgumentName; } - public String[] getResult() { - return myResult == null ? ArrayUtil.EMPTY_STRING_ARRAY : ArrayUtil.toStringArray(myResult); + public Map getResult() { + return myResult; } private void extractArguments(GrArgumentList argumentList) { @@ -65,11 +65,7 @@ public class GrNamedArgumentSearchVisitor extends GroovyRecursiveElementVisitor } private void add(String refName) { - if (myResult == null) { - myResult = new HashSet(); - } - - myResult.add(refName); + myResult.put(refName, GroovyNamedArgumentProvider.TYPE_ANY); } @Override @@ -100,16 +96,16 @@ public class GrNamedArgumentSearchVisitor extends GroovyRecursiveElementVisitor super.visitReferenceExpression(referenceExpression); } - public static String[] find(GrVariable variable) { + public static Map find(GrVariable variable) { final GrExpression initializerGroovy = variable.getInitializerGroovy(); if (!(initializerGroovy instanceof GrClosableBlock)) { - return ArrayUtil.EMPTY_STRING_ARRAY; + return Collections.emptyMap(); } final GrClosableBlock closure = (GrClosableBlock)initializerGroovy; final GrParameter[] parameters = closure.getAllParameters(); - if (parameters.length == 0) return ArrayUtil.EMPTY_STRING_ARRAY; + if (parameters.length == 0) return Collections.emptyMap(); GrParameter parameter = parameters[0]; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/members/GrMethod.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/members/GrMethod.java index 523cc5a94967..cc3d31df89c5 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/members/GrMethod.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/members/GrMethod.java @@ -22,6 +22,7 @@ import com.intellij.util.ArrayFactory; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocCommentOwner; import org.jetbrains.plugins.groovy.lang.psi.GrNamedElement; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; @@ -33,6 +34,8 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameterLi import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeParameterListOwner; +import java.util.Map; + /** * @author: Dmitry.Krasilschikov * @date: 26.03.2007 @@ -82,7 +85,7 @@ public interface GrMethod extends GrMembersDeclaration, GrNamedElement, PsiMetho GrModifierList getModifierList(); @NotNull - String[] getNamedParametersArray(); + Map getNamedParameters(); @NotNull GrReflectedMethod[] getReflectedMethods(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrFieldImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrFieldImpl.java index 48947ed5f383..edfa21fb2e18 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrFieldImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrFieldImpl.java @@ -15,6 +15,7 @@ */ package org.jetbrains.plugins.groovy.lang.psi.impl.statements; +import com.google.common.collect.Maps; import com.intellij.lang.ASTNode; import com.intellij.navigation.ItemPresentation; import com.intellij.psi.*; @@ -28,6 +29,7 @@ import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyIcons; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocComment; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.impl.GrDocCommentUtil; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; @@ -45,6 +47,7 @@ import org.jetbrains.plugins.groovy.lang.psi.stubs.GrFieldStub; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import javax.swing.*; +import java.util.Map; /** * User: Dmitry.Krasilschikov @@ -211,10 +214,14 @@ public class GrFieldImpl extends GrVariableBaseImpl implements GrFi } @NotNull - public String[] getNamedParametersArray() { + public Map getNamedParameters() { final GrFieldStub stub = getStub(); if (stub != null) { - return stub.getNamedParameters(); + Map result = Maps.newHashMap(); + for (String parameter : stub.getNamedParameters()) { + result.put(parameter, GroovyNamedArgumentProvider.TYPE_ANY); + } + return result; } return GrNamedArgumentSearchVisitor.find(this); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrAnnotationMethodImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrAnnotationMethodImpl.java index 8dc1e3160581..659eed1e9135 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrAnnotationMethodImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrAnnotationMethodImpl.java @@ -16,14 +16,17 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.typedef.members; import com.intellij.lang.ASTNode; -import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrDefaultAnnotationValue; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAnnotationMethod; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrMethodStub; +import java.util.Collections; +import java.util.Map; + /** * User: Dmitry.Krasilschikov */ @@ -46,8 +49,8 @@ public class GrAnnotationMethodImpl extends GrMethodBaseImpl implements GrAnnota } @NotNull - public String[] getNamedParametersArray() { - return ArrayUtil.EMPTY_STRING_ARRAY; + public Map getNamedParameters() { + return Collections.emptyMap(); } @Override diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodBaseImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodBaseImpl.java index 4d90f4092d09..0de819aef0a6 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodBaseImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodBaseImpl.java @@ -15,6 +15,7 @@ */ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.typedef.members; +import com.google.common.collect.Maps; import com.intellij.lang.ASTNode; import com.intellij.navigation.ItemPresentation; import com.intellij.openapi.application.ApplicationManager; @@ -28,11 +29,15 @@ import com.intellij.psi.search.SearchScope; import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.util.*; import com.intellij.ui.RowIcon; -import com.intellij.util.*; +import com.intellij.util.Function; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.NullableFunction; +import com.intellij.util.ObjectUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyIcons; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.gpp.GppTypeConverter; import org.jetbrains.plugins.groovy.lang.GrReferenceAdjuster; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocComment; @@ -68,7 +73,9 @@ import org.jetbrains.plugins.groovy.lang.resolve.MethodTypeInferencer; import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; import javax.swing.*; +import java.util.Collections; import java.util.List; +import java.util.Map; /** * @author ilyas @@ -460,17 +467,21 @@ public abstract class GrMethodBaseImpl extends GrStubElementBase i } @NotNull - public String[] getNamedParametersArray() { + public Map getNamedParameters() { final GrMethodStub stub = getStub(); if (stub != null) { - return stub.getNamedParameters(); + Map result = Maps.newHashMap(); + for (String parameter : stub.getNamedParameters()) { + result.put(parameter, GroovyNamedArgumentProvider.TYPE_ANY); + } + return result; } GrOpenBlock body = getBlock(); - if (body == null) return ArrayUtil.EMPTY_STRING_ARRAY; + if (body == null) return Collections.emptyMap(); GrParameter[] parameters = getParameters(); - if (parameters.length == 0) return ArrayUtil.EMPTY_STRING_ARRAY; + if (parameters.length == 0) return Collections.emptyMap(); GrParameter firstParameter = parameters[0]; PsiType type = firstParameter.getTypeGroovy(); @@ -478,7 +489,7 @@ public abstract class GrMethodBaseImpl extends GrStubElementBase i //equalsToText can't be called here because of stub creating if (type != null && typeElement != null && type.getPresentableText() != null && !type.getPresentableText().endsWith("Map")) { - return ArrayUtil.EMPTY_STRING_ARRAY; + return Collections.emptyMap(); } GrNamedArgumentSearchVisitor visitor = new GrNamedArgumentSearchVisitor(firstParameter.getNameIdentifierGroovy().getText()); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightField.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightField.java index db240c70cc25..917581f39f71 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightField.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightField.java @@ -21,11 +21,11 @@ import com.intellij.psi.PsiExpression; import com.intellij.psi.PsiType; import com.intellij.psi.impl.ResolveScopeManager; import com.intellij.psi.search.SearchScope; -import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocComment; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; @@ -34,6 +34,9 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAc import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; +import java.util.Collections; +import java.util.Map; + /** * @author sergey.evdokimov */ @@ -46,14 +49,6 @@ public class GrLightField extends GrLightVariable implements GrField { private final PsiClass myContainingClass; - public GrLightField(@NotNull PsiClass containingClass, - @NonNls String name, - @NonNls @NotNull String type, - @NotNull PsiElement element) { - super(containingClass.getManager(), name, type, element); - myContainingClass = containingClass; - } - public GrLightField(@NotNull PsiClass containingClass, @NonNls String name, @NotNull PsiType type, @@ -123,8 +118,8 @@ public class GrLightField extends GrLightVariable implements GrField { @NotNull @Override - public String[] getNamedParametersArray() { - return ArrayUtil.EMPTY_STRING_ARRAY; + public Map getNamedParameters() { + return Collections.emptyMap(); } @Override diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightMethodBuilder.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightMethodBuilder.java index 81b4b7f8a0ab..f283020d7048 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightMethodBuilder.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightMethodBuilder.java @@ -29,12 +29,12 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.util.*; import com.intellij.ui.RowIcon; -import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.PlatformIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyFileType; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocComment; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrCodeBlock; @@ -46,7 +46,9 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrRe import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; import javax.swing.*; +import java.util.Collections; import java.util.List; +import java.util.Map; /** * @author Sergey Evdokimov @@ -59,7 +61,7 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod { private Icon myBaseIcon; private PsiClass myContainingClass; private Object myMethodKind; - private String[] myNamedParametersArray = ArrayUtil.EMPTY_STRING_ARRAY; + private Map myNamedParameters = Collections.emptyMap(); private final PsiReferenceList myThrowsList; private Object myData; @@ -74,8 +76,8 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod { myThrowsList = new LightReferenceListBuilder(manager, GroovyFileType.GROOVY_LANGUAGE, PsiReferenceList.Role.THROWS_LIST); } - public void setNamedParametersArray(@NotNull String[] namedParametersArray) { - this.myNamedParametersArray = namedParametersArray; + public void setNamedParameters(@NotNull Map namedParameters) { + this.myNamedParameters = namedParameters; } @Override @@ -134,8 +136,8 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod { @NotNull @Override - public String[] getNamedParametersArray() { - return myNamedParametersArray; + public Map getNamedParameters() { + return myNamedParameters; } @NotNull @@ -404,7 +406,7 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod { GrLightMethodBuilder copy = new GrLightMethodBuilder(myManager, myName); copy.setMethodKind(myMethodKind); copy.setData(myData); - copy.setNamedParametersArray(myNamedParametersArray); + copy.setNamedParameters(myNamedParameters); if (getNavigationElement() != this) { copy.setNavigationElement(getNavigationElement()); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrReflectedMethodImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrReflectedMethodImpl.java index b41662169b4c..ffa1dfb30f10 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrReflectedMethodImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrReflectedMethodImpl.java @@ -26,6 +26,7 @@ import com.intellij.psi.util.PsiModificationTracker; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocComment; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; @@ -45,6 +46,7 @@ import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import javax.swing.*; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * @author Max Medvedev @@ -172,8 +174,8 @@ public class GrReflectedMethodImpl extends LightMethodBuilder implements GrRefle @NotNull @Override - public String[] getNamedParametersArray() { - return myBaseMethod.getNamedParametersArray(); + public Map getNamedParameters() { + return myBaseMethod.getNamedParameters(); } @NotNull diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFieldStub.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFieldStub.java index 86930d0a8d71..cb4c8b8a7b69 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFieldStub.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrFieldStub.java @@ -53,6 +53,7 @@ public class GrFieldStub extends StubBase implements NamedStub myTypeText = typeText; } + @NotNull public String getName() { return StringRef.toString(myName); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrMethodStub.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrMethodStub.java index bf35cc6c1c59..082ab480e959 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrMethodStub.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrMethodStub.java @@ -42,7 +42,7 @@ public class GrMethodStub extends StubBase implements NamedStub public GrFieldStub createStub(GrField psi, StubElement parentStub) { String[] annNames = GrStubUtils.getAnnotationNames(psi); - String[] namedParametersArray = ArrayUtil.EMPTY_STRING_ARRAY; + Set namedParameters = Collections.emptySet(); if (psi instanceof GrFieldImpl){ - namedParametersArray = psi.getNamedParametersArray(); + namedParameters = psi.getNamedParameters().keySet(); } - return new GrFieldStub(parentStub, StringRef.fromString(psi.getName()), annNames, namedParametersArray, FIELD, GrFieldStub.buildFlags(psi), + return new GrFieldStub(parentStub, StringRef.fromString(psi.getName()), annNames, namedParameters.toArray(new String[namedParameters.size()]), FIELD, GrFieldStub.buildFlags(psi), GrStubUtils.getTypeText(psi)); } @@ -94,9 +95,7 @@ public class GrFieldElementType extends GrStubElementType static void indexFieldStub(GrFieldStub stub, IndexSink sink) { String name = stub.getName(); - if (name != null) { - sink.occurrence(GrFieldNameIndex.KEY, name); - } + sink.occurrence(GrFieldNameIndex.KEY, name); for (String annName : stub.getAnnotations()) { if (annName != null) { sink.occurrence(GrAnnotatedMemberIndex.KEY, annName); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java index 4c6c0d8474b4..f5b746cbef1b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java @@ -27,6 +27,7 @@ import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrAnnotatedMemberIndex; import org.jetbrains.plugins.groovy.lang.psi.stubs.index.GrMethodNameIndex; import java.io.IOException; +import java.util.Set; /** * @author ilyas @@ -39,8 +40,9 @@ public abstract class GrMethodElementType extends GrStubElementType namedParameters = psi.getNamedParameters().keySet(); return new GrMethodStub(parentStub, StringRef.fromString(psi.getName()), GrStubUtils.getAnnotationNames(psi), - psi.getNamedParametersArray(), this); + namedParameters.toArray(new String[namedParameters.size()]), this); } public void serialize(GrMethodStub stub, StubOutputStream dataStream) throws IOException { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/dynamicMembers/DynamicMemberUtils.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/dynamicMembers/DynamicMemberUtils.java index 84ff987aa316..b4c54a2f4c6d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/dynamicMembers/DynamicMemberUtils.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/dynamicMembers/DynamicMemberUtils.java @@ -8,6 +8,7 @@ import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocComment; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocTag; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; @@ -291,7 +292,7 @@ public class DynamicMemberUtils { private PsiTypeParameter[] myTypeParameters; private GrParameterList myParameterList; - private String[] namedParameters; + private Map namedParameters; public final String mySource; @@ -299,7 +300,7 @@ public class DynamicMemberUtils { super(method); myTypeParameters = super.getTypeParameters(); myParameterList = super.getParameterList(); - namedParameters = super.getNamedParametersArray(); + namedParameters = super.getNamedParameters(); mySource = source; } @@ -322,7 +323,7 @@ public class DynamicMemberUtils { @NotNull @Override - public String[] getNamedParametersArray() { + public Map getNamedParameters() { return namedParameters; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/dynamicMembers/GrDynamicMethodImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/dynamicMembers/GrDynamicMethodImpl.java index bd1be61cedb2..1a55cf76dd74 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/dynamicMembers/GrDynamicMethodImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/dynamicMembers/GrDynamicMethodImpl.java @@ -22,6 +22,7 @@ import com.intellij.psi.util.MethodSignatureBackedByPsiMethod; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocComment; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; @@ -36,6 +37,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; import java.util.Collections; import java.util.List; +import java.util.Map; /** * @author Maxim.Medvedev @@ -121,8 +123,8 @@ public class GrDynamicMethodImpl extends LightElement implements GrMethod { } @NotNull - public String[] getNamedParametersArray() { - return myMethod.getNamedParametersArray(); + public Map getNamedParameters() { + return myMethod.getNamedParameters(); } @NotNull diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/dynamicMembers/GrDynamicPropertyImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/dynamicMembers/GrDynamicPropertyImpl.java index 43d7a4b18b1a..1b8af6d1e344 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/dynamicMembers/GrDynamicPropertyImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/dynamicMembers/GrDynamicPropertyImpl.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyIcons; +import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocComment; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; @@ -31,6 +32,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAc import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; import javax.swing.*; +import java.util.Map; /** * @author Maxim.Medvedev @@ -199,8 +201,8 @@ public class GrDynamicPropertyImpl extends LightElement implements GrField { } @NotNull - public String[] getNamedParametersArray() { - return myField.getNamedParametersArray(); + public Map getNamedParameters() { + return myField.getNamedParameters(); } @Override diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyDslTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyDslTest.groovy index 9303238c57ad..679967f68407 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyDslTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyDslTest.groovy @@ -19,14 +19,15 @@ package org.jetbrains.plugins.groovy.dsl; import com.intellij.openapi.module.Module import com.intellij.openapi.roots.ContentEntry import com.intellij.openapi.roots.ModifiableRootModel +import com.intellij.psi.PsiClass import com.intellij.psi.PsiFile import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.PsiTestUtil import com.intellij.testFramework.fixtures.DefaultLightProjectDescriptor import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase -import org.jetbrains.plugins.groovy.util.TestUtils -import com.intellij.psi.PsiClass import org.jetbrains.annotations.NotNull +import org.jetbrains.plugins.groovy.codeInspection.assignment.GroovyAssignabilityCheckInspection +import org.jetbrains.plugins.groovy.util.TestUtils /** * @author peter @@ -163,7 +164,7 @@ public class MyCategory { ] }''' myFixture.configureByText 'a.groovy', '"".foo(par)' - def items = myFixture.completeBasic() + myFixture.completeBasic() assert myFixture.lookupElementStrings == ['param1', 'param2'] } @@ -175,7 +176,21 @@ public class MyCategory { ]] }''' myFixture.configureByText 'a.groovy', '"".foo(par)' - def items = myFixture.completeBasic() + myFixture.completeBasic() assert myFixture.lookupElementStrings == ['param1', 'param2'] } + + public void testCheckNamedArgumentTypes() { + addGdsl '''contribute(currentType(String.name)) { + method name:'foo', type:void, params:[args:[ + parameter(name:'param1', type:File), + parameter(name:'param2', type:Integer), + ]] +}''' + myFixture.configureByText 'a.groovy', ''' +"".foo(param1:2, param2:2) +''' + myFixture.enableInspections(new GroovyAssignabilityCheckInspection()) + myFixture.checkHighlighting(true, false, false) + } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/changeSignature/ChangeSignatureTestCase.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/changeSignature/ChangeSignatureTestCase.java index b325eeaba1a8..b30f99cd6d00 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/changeSignature/ChangeSignatureTestCase.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/changeSignature/ChangeSignatureTestCase.java @@ -128,10 +128,6 @@ public abstract class ChangeSignatureTestCase extends LightCodeInsightFixtureTes static class SimpleExceptionsGen implements GenExceptions { private final ThrownExceptionInfo[] myInfos; - public SimpleExceptionsGen() { - myInfos = new ThrownExceptionInfo[0]; - } - public SimpleExceptionsGen(ThrownExceptionInfo[] infos) { myInfos = infos; }