You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2024/06/25 19:48:01 UTC
(groovy) branch GROOVY_4_0_X updated: GROOVY-11427: STC: `Class` receiver only matches static method of `T`
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
new 1b810fc5c4 GROOVY-11427: STC: `Class<T>` receiver only matches static method of `T`
1b810fc5c4 is described below
commit 1b810fc5c4938b76c90904fb3327b21bb4fa818c
Author: Eric Milles <er...@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 +++++++++++-----
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 +-
5 files changed, 25 insertions(+), 10 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 36b082ffd1..d612cb2f01 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -5157,6 +5157,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
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;
}
@@ -5995,16 +5996,21 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
}
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/BugsSTCTest.groovy b/src/test/groovy/transform/stc/BugsSTCTest.groovy
index b0f479634a..d6f96d47fd 100644
--- a/src/test/groovy/transform/stc/BugsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/BugsSTCTest.groovy
@@ -1092,13 +1092,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 7770040c26..93e61129d1 100644
--- a/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy
@@ -1758,12 +1758,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 9bde8b8185..6d111d674a 100644
--- a/src/test/groovy/transform/stc/MiscSTCTest.groovy
+++ b/src/test/groovy/transform/stc/MiscSTCTest.groovy
@@ -408,7 +408,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 9cf62a1737..624a9f603c 100644
--- a/src/test/org/codehaus/groovy/transform/traitx/TraitWithClosureOrLambda.groovy
+++ b/src/test/org/codehaus/groovy/transform/traitx/TraitWithClosureOrLambda.groovy
@@ -343,7 +343,7 @@ final class TraitWithClosureOrLambda {
}
}
'''
- assert err =~ /Cannot find matching method [\w\$]+#config/
+ assert err =~ /Cannot find matching method .+#config/
}
// GROOVY-11265