This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push: new 7aff28a27b GROOVY-11427: STC: `Class<T>` receiver only matches static method of `T` 7aff28a27b is described below commit 7aff28a27b406a2ed80167f12f943aa64d12a784 Author: Eric Milles <eric.mil...@thomsonreuters.com> AuthorDate: Tue Jun 25 13:47:57 2024 -0500 GROOVY-11427: STC: `Class<T>` receiver only matches static method of `T` --- .../groovy/transform/stc/StaticTypeCheckingVisitor.java | 16 +++++++++++----- .../transform/stc/ArraysAndCollectionsSTCTest.groovy | 13 ------------- src/test/groovy/transform/stc/BugsSTCTest.groovy | 10 +++++++++- src/test/groovy/transform/stc/MethodCallsSTCTest.groovy | 4 ++-- src/test/groovy/transform/stc/MiscSTCTest.groovy | 3 ++- .../transform/traitx/TraitWithClosureOrLambda.groovy | 2 +- 6 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java index 3d4fd070c7..113490a4f3 100644 --- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -5074,6 +5074,7 @@ trying: for (ClassNode[] signature : signatures) { if (isClassClassNodeWrappingConcreteType(receiver)) { // GROOVY-6802, GROOVY-6803, GROOVY-9415 List<MethodNode> result = findMethod(receiver.getGenericsTypes()[0].getType(), name, args); + result = allowStaticAccessToMember(result, true); // GROOVY-11427 if (!result.isEmpty()) return result; } @@ -5923,16 +5924,21 @@ trying: for (ClassNode[] signature : signatures) { } protected void addNoMatchingMethodError(final ClassNode receiver, final String name, ClassNode[] args, final ASTNode origin) { - String error; + String classifier; + String descriptor; if ("<init>".equals(name)) { + classifier = "constructor"; // remove implicit agruments [String, int] from enum constant construction if (receiver.isEnum() && args.length >= 2) args = Arrays.copyOfRange(args, 2, args.length); - error = "Cannot find matching constructor " + prettyPrintTypeName(receiver) + toMethodParametersString("", args); + descriptor = prettyPrintTypeName(receiver) + toMethodParametersString("", args); // type is name } else { - ClassNode type = isClassClassNodeWrappingConcreteType(receiver) ? receiver.getGenericsTypes()[0].getType() : wrapTypeIfNecessary(receiver); - error = "Cannot find matching method " + prettyPrintTypeName(type) + "#" + toMethodParametersString(name, args) + ". Please check if the declared type is correct and if the method exists."; + classifier = "method"; + descriptor = prettyPrintTypeName(wrapTypeIfNecessary(receiver)) + "#" + toMethodParametersString(name, args); + if (isClassClassNodeWrappingConcreteType(receiver)) { ClassNode t = receiver.getGenericsTypes()[0].getType(); + descriptor += " or static method " + prettyPrintTypeName(t) + "#" + toMethodParametersString(name, args); + } } - addStaticTypeError(error, origin); + addStaticTypeError("Cannot find matching " + classifier + " " + descriptor + ". Please check if the declared type is correct and if the method exists.", origin); } protected void addAmbiguousErrorMessage(final List<MethodNode> foundMethods, final String name, final ClassNode[] args, final Expression expr) { diff --git a/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy b/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy index f08d050d60..18fb44a22b 100644 --- a/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy +++ b/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy @@ -782,19 +782,6 @@ class ArraysAndCollectionsSTCTest extends StaticTypeCheckingTestCase { ''' } - // GROOVY-8074 - void testMapSubclassPropertyStyleAccess() { - assertScript ''' - class MyMap extends LinkedHashMap { - def foo = 1 - } - - def map = new MyMap() - map.put('foo', 42) - assert map.foo == 1 - ''' - } - // GROOVY-6311 void testSetSpread() { assertScript ''' diff --git a/src/test/groovy/transform/stc/BugsSTCTest.groovy b/src/test/groovy/transform/stc/BugsSTCTest.groovy index 6d24223915..d248cd4af0 100644 --- a/src/test/groovy/transform/stc/BugsSTCTest.groovy +++ b/src/test/groovy/transform/stc/BugsSTCTest.groovy @@ -1139,13 +1139,21 @@ class BugsSTCTest extends StaticTypeCheckingTestCase { ''' } + // GROOVY-11427 + void testClassSubscript() { + shouldFailWithMessages ''' + Class<String> c = String.class + def x = c[0] + ''', + 'Cannot find matching method java.lang.Class#getAt(int) or static method java.lang.String#getAt(int)' + } + // GROOVY-9999 void testMathSqrt() { assertScript ''' def test() { Math.sqrt(Math.PI*2) } - double result = (double) test() // 2.5066282746310002 assert result > 2.5066 ''' diff --git a/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy b/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy index 544bbbfe7d..2836e9c4b8 100644 --- a/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy +++ b/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy @@ -1876,12 +1876,12 @@ class MethodCallsSTCTest extends StaticTypeCheckingTestCase { shouldFailWithMessages ''' Double.isFiniteMissing(2.0d) ''', - 'Cannot find matching method java.lang.Double#isFiniteMissing(double)' + 'Cannot find ',' static method java.lang.Double#isFiniteMissing(double)' shouldFailWithMessages ''' String.doSomething() ''', - 'Cannot find matching method java.lang.String#doSomething()' + 'Cannot find ',' static method java.lang.String#doSomething()' } // GROOVY-6776 diff --git a/src/test/groovy/transform/stc/MiscSTCTest.groovy b/src/test/groovy/transform/stc/MiscSTCTest.groovy index b497ec2239..0960606a81 100644 --- a/src/test/groovy/transform/stc/MiscSTCTest.groovy +++ b/src/test/groovy/transform/stc/MiscSTCTest.groovy @@ -460,7 +460,8 @@ class MiscSTCTest extends StaticTypeCheckingTestCase { Foo.newInstance2(new CustomNumber()) } } - ''', 'Cannot find matching method Foo#newInstance2(CustomNumber)' + ''', + 'Cannot find ',' static method Foo#newInstance2(CustomNumber)' } // GROOVY-8380 diff --git a/src/test/org/codehaus/groovy/transform/traitx/TraitWithClosureOrLambda.groovy b/src/test/org/codehaus/groovy/transform/traitx/TraitWithClosureOrLambda.groovy index 50a98f7450..1a7f844b5a 100644 --- a/src/test/org/codehaus/groovy/transform/traitx/TraitWithClosureOrLambda.groovy +++ b/src/test/org/codehaus/groovy/transform/traitx/TraitWithClosureOrLambda.groovy @@ -339,7 +339,7 @@ final class TraitWithClosureOrLambda { } } ''' - assert err.message.contains('Cannot find matching method T$Trait$Helper#config') + assert err.message.contains('Cannot find matching method ') } // GROOVY-11265