From 9f839c2d79303cceeef603bae60c1a637a9b321e Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 22 Jul 2010 18:32:48 +0100 Subject: [PATCH] map literals with 'super' key may be assigned to the classes with a non-default constructor --- .../jetbrains/plugins/groovy/gpp/GppTypeConverter.java | 5 +++++ .../plugins/groovy/lang/psi/impl/GrMapType.java | 6 ++++++ .../impl/statements/arguments/GrArgumentLabelImpl.java | 2 +- .../plugins/groovy/lang/GppFunctionalTest.groovy | 10 ++++++++++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java index 64ba6c939cad..b03125b76fd1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java @@ -66,6 +66,11 @@ public class GppTypeConverter extends GrTypeConverter { (!TypesUtil.isAssignable(lKeyType, parameters[0], context) || !TypesUtil.isAssignable(lValueType, parameters[1], context))) { return null; } + + if (((GrMapType)rType).getValueType("super") != null) { + return true; + } + if (hasDefaultConstructor(lType)) { return true; } 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 2a45e985ae61..3fbe912f1cc7 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 @@ -26,6 +26,7 @@ import com.intellij.psi.PsiType; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -149,6 +150,11 @@ public class GrMapType extends GrLiteralClassType { return super.equals(obj); } + @Nullable + public PsiType getValueType(@NotNull String key) { + return myStringEntries.get(key); + } + public boolean isAssignableFrom(@NotNull PsiType type) { return type instanceof GrMapType || myFacade.getElementFactory().createTypeFromText(getJavaClassName(), null).isAssignableFrom(type); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrArgumentLabelImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrArgumentLabelImpl.java index fbce8d317fcd..7109cb41489b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrArgumentLabelImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrArgumentLabelImpl.java @@ -103,7 +103,7 @@ public class GrArgumentLabelImpl extends GroovyPsiElementImpl implements GrArgum } final IElementType elemType = element.getNode().getElementType(); - if (GroovyTokenTypes.mIDENT == elemType) { + if (GroovyTokenTypes.mIDENT == elemType || GroovyTokenTypes.KEYWORDS.contains(elemType)) { return element.getText(); } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GppFunctionalTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GppFunctionalTest.groovy index 345efb7e3450..f5d5fb58dfd0 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GppFunctionalTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GppFunctionalTest.groovy @@ -375,6 +375,16 @@ s.doSmth() assertEquals "doSmth", ((PsiMethod) findReference().resolve()).name } + public void testBaseConstructorCallInMapLiteras() throws Exception { + configureScript """ +@Typed File foo() { ['super':['a']] } +@Typed File goo() { [:] } +File bar() { [:] } +""" + myFixture.enableInspections new GroovyAssignabilityCheckInspection() + myFixture.checkHighlighting(true, false, false) + } + } class GppProjectDescriptor extends DefaultLightProjectDescriptor {