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 14fb5f0 GROOVY-10312: $static$self.staticMethod(...) for method with
default arg
14fb5f0 is described below
commit 14fb5f073b530332fbdcad4bc4540787d3eaf143
Author: Eric Milles <[email protected]>
AuthorDate: Sun Oct 17 08:55:45 2021 -0500
GROOVY-10312: $static$self.staticMethod(...) for method with default arg
---
.../transform/trait/TraitASTTransformation.java | 7 +--
.../transform/trait/TraitReceiverTransformer.java | 25 ++++++----
.../traitx/TraitASTTransformationTest.groovy | 57 ++++++++++++++++++++++
3 files changed, 75 insertions(+), 14 deletions(-)
diff --git
a/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
b/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
index e9ea9b8..a42eaa6 100644
---
a/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
+++
b/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
@@ -161,18 +161,15 @@ public class TraitASTTransformation extends
AbstractASTTransformation implements
private void replaceExtendsByImplements(final ClassNode cNode) {
ClassNode superClass = cNode.getUnresolvedSuperClass();
if (Traits.isTrait(superClass)) {
- // move from super class to interface;
+ // move from super class to interface
cNode.setSuperClass(ClassHelper.OBJECT_TYPE);
cNode.setUnresolvedSuperClass(ClassHelper.OBJECT_TYPE);
cNode.addInterface(superClass);
- resolveScope(cNode);
}
}
private void resolveScope(final ClassNode cNode) {
- // we need to resolve again!
- VariableScopeVisitor scopeVisitor = new
VariableScopeVisitor(sourceUnit);
- scopeVisitor.visitClass(cNode);
+ new VariableScopeVisitor(sourceUnit).visitClass(cNode);
}
private void checkNoConstructor(final ClassNode cNode) {
diff --git
a/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
b/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
index 3967ea3..c2b6792 100644
---
a/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
+++
b/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
@@ -300,28 +300,35 @@ class TraitReceiverTransformer extends
ClassCodeExpressionTransformer {
private Expression transformMethodCallOnThis(final MethodCallExpression
call) {
Expression method = call.getMethod();
Expression arguments = call.getArguments();
- Expression objectExpr = call.getObjectExpression();
+ Expression thisExpr = call.getObjectExpression();
if (method instanceof ConstantExpression) {
String methodName = call.getMethodAsString();
for (MethodNode methodNode : traitClass.getMethods(methodName)) {
if (methodName.equals(methodNode.getName()) &&
(methodNode.isStatic() || methodNode.isPrivate())) {
- ArgumentListExpression newArgs =
createArgumentList(methodNode.isStatic() ? asClass(objectExpr) : weaved,
arguments);
- MethodCallExpression newCall = callX(inClosure ?
classX(traitHelperClass) : varX("this"), methodName, newArgs);
- newCall.setImplicitThis(true);
- newCall.setSafe(call.isSafe());
- newCall.setSourcePosition(call);
+ MethodCallExpression newCall;
+ if (!inClosure && methodNode.isStatic()) { //
GROOVY-10312: $self or $static$self.staticMethod(...)
+ newCall = callX(varX(weaved), methodName,
transform(arguments));
+ newCall.setImplicitThis(false);
+ newCall.setSafe(false);
+ } else {
+ ArgumentListExpression newArgs =
createArgumentList(methodNode.isStatic() ? asClass(varX("this")) : weaved,
arguments);
+ newCall = callX(inClosure ? classX(traitHelperClass) :
thisExpr, methodName, newArgs);
+ newCall.setImplicitThis(true);
+ newCall.setSafe(call.isSafe());
+ }
newCall.setSpreadSafe(call.isSpreadSafe());
+ newCall.setSourcePosition(call);
return newCall;
}
}
}
- MethodCallExpression newCall = callX(inClosure ? objectExpr : weaved,
method, transform(arguments));
+ MethodCallExpression newCall = callX(inClosure ? thisExpr : weaved,
method, transform(arguments));
newCall.setImplicitThis(inClosure ? call.isImplicitThis() : false);
- newCall.setSafe(call.isSafe());
- newCall.setSourcePosition(call);
+ newCall.setSafe(inClosure ? call.isSafe() : false);
newCall.setSpreadSafe(call.isSpreadSafe());
+ newCall.setSourcePosition(call);
return newCall;
}
diff --git
a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
index 6aec616..dfef1af 100644
---
a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
+++
b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
@@ -3269,6 +3269,63 @@ final class TraitASTTransformationTest {
'''
}
+ @Test // GROOVY-10312
+ void testTraitAccessToInheritedStaticMethods2() {
+ assertScript '''
+ trait Foo {
+ static String staticMethod(String string) {
+ return string
+ }
+ }
+ trait Bar extends Foo {
+ static String staticMethodWithDefaultArgument(String string =
'works') {
+ staticMethod(string) // MissingMethodException
+ }
+ }
+
+ class Main implements Bar {
+ static test1() {
+ String result = staticMethodWithDefaultArgument()
+ assert result == 'works'
+ }
+ void test2() {
+ String result = staticMethodWithDefaultArgument()
+ assert result == 'works'
+ }
+ }
+
+ Main.test1()
+ new Main().test2()
+ '''
+ }
+
+ @Test // GROOVY-10312
+ void testTraitAccessToInheritedStaticMethods3() {
+ assertScript '''
+ trait Foo {
+ public static final String BANG = '!'
+
+ static String staticMethodWithDefaultArgument(String string =
'works') {
+ string + this.BANG
+ }
+ }
+
+ class Main implements Foo {
+ static test1() {
+ String result = staticMethodWithDefaultArgument()
+ assert result == 'works!'
+ }
+ void test2() {
+ String result = staticMethodWithDefaultArgument()
+ assert result == 'works!'
+ }
+ }
+
+ Main.test1()
+ new Main().test2()
+ '''
+ }
+
@Test // GROOVY-9386
void testTraitPropertyInitializedByTap() {
assertScript '''