From 30d04a30f2b9a93611329f298949039daa06f3f1 Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 19 Apr 2011 14:16:45 +0400 Subject: [PATCH] String is assignable to char --- .../lang/psi/api/types/GrClosureSignature.java | 2 ++ .../impl/statements/expressions/TypesUtil.java | 16 +++++++++------- .../psi/impl/types/GrClosureSignatureImpl.java | 5 +++++ .../groovy/lang/GroovyHighlightingTest.java | 4 ++++ .../highlighting/StringAssignableToChar.groovy | 3 +++ 5 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 plugins/groovy/testdata/highlighting/StringAssignableToChar.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/types/GrClosureSignature.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/types/GrClosureSignature.java index 38bc577b0b62..75b35a1aa4a3 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/types/GrClosureSignature.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/types/GrClosureSignature.java @@ -29,6 +29,8 @@ public interface GrClosureSignature { @NotNull GrClosureParameter[] getParameters(); + int getParameterCount(); + boolean isVarargs(); @Nullable diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/TypesUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/TypesUtil.java index 69901b6cdf05..f9e852621620 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/TypesUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/TypesUtil.java @@ -36,7 +36,6 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrBinaryExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureParameter; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureSignature; import org.jetbrains.plugins.groovy.lang.psi.impl.GrClosureType; import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType; @@ -50,6 +49,7 @@ import java.util.Map; import static com.intellij.psi.CommonClassNames.*; import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.*; +import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.GROOVY_LANG_GSTRING; import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.JAVA_MATH_BIG_DECIMAL; import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.JAVA_MATH_BIG_INTEGER; @@ -304,6 +304,11 @@ public class TypesUtil { lType = boxPrimitiveType(lType, manager, scope); } + if (unboxPrimitiveTypeWrapper(lType) == PsiType.CHAR && + (typeEqualsToText(rType, GROOVY_LANG_GSTRING) || typeEqualsToText(rType, JAVA_LANG_STRING))) { + return true; + } + return TypeConversionUtil.isAssignable(lType, rType); } @@ -393,13 +398,10 @@ public class TypesUtil { else if (type1 instanceof GrClosureType && type2 instanceof GrClosureType) { GrClosureType clType1 = (GrClosureType)type1; GrClosureType clType2 = (GrClosureType)type2; - GrClosureSignature signature1=clType1.getSignature(); - GrClosureSignature signature2=clType2.getSignature(); + GrClosureSignature signature1 = clType1.getSignature(); + GrClosureSignature signature2 = clType2.getSignature(); - GrClosureParameter[] parameters1 = signature1.getParameters(); - GrClosureParameter[] parameters2 = signature2.getParameters(); - - if (parameters1.length == parameters2.length) { + if (signature1.getParameterCount() == signature2.getParameterCount()) { final GrClosureSignature signature = GrClosureSignatureImpl.getLeastUpperBound(signature1, signature2, manager); if (signature != null) { GlobalSearchScope scope = clType1.getResolveScope().intersectWith(clType2.getResolveScope()); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrClosureSignatureImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrClosureSignatureImpl.java index dffa1b24dcb7..ee79b5cc21a7 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrClosureSignatureImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrClosureSignatureImpl.java @@ -82,6 +82,11 @@ public class GrClosureSignatureImpl implements GrClosureSignature { return result; } + @Override + public int getParameterCount() { + return myParameters.length; + } + @Nullable public GrClosureSignature curry(int count) { if (count > myParameters.length) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java index 5f0dd84f232a..c4daab64e65e 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java @@ -375,4 +375,8 @@ public class GroovyHighlightingTest extends LightCodeInsightFixtureTestCase { doTest(new UnusedDefInspection()); } + public void testStringAssignableToChar() { + doTest(new GroovyAssignabilityCheckInspection()); + } + } \ No newline at end of file diff --git a/plugins/groovy/testdata/highlighting/StringAssignableToChar.groovy b/plugins/groovy/testdata/highlighting/StringAssignableToChar.groovy new file mode 100644 index 000000000000..5869f294ac21 --- /dev/null +++ b/plugins/groovy/testdata/highlighting/StringAssignableToChar.groovy @@ -0,0 +1,3 @@ +def a='string text' +char ch = a //here should not be inspection warning +int x = a //check that assignability inspection is on.