Skip to content

Commit 7bec9d2

Browse files
committed
GROOVY-10312
1 parent 267a782 commit 7bec9d2

File tree

4 files changed

+69
-14
lines changed

4 files changed

+69
-14
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/basic/TraitsTests.java

+31
Original file line numberDiff line numberDiff line change
@@ -2873,4 +2873,35 @@ public void testTraits10106() {
28732873

28742874
runConformTest(sources, "works");
28752875
}
2876+
2877+
@Test
2878+
public void testTraits10312() {
2879+
//@formatter:off
2880+
String[] sources = {
2881+
"Script.groovy",
2882+
"trait T1 {\n" +
2883+
" static void staticMethod(input) {\n" +
2884+
" print input\n" +
2885+
" }\n" +
2886+
"}\n" +
2887+
"trait T2 extends T1 {\n" +
2888+
" static void staticMethodWithDefaultArgument(String string = 'x') {\n" +
2889+
" staticMethod(string)\n" + // MissingMethodException
2890+
" }\n" +
2891+
"}\n" +
2892+
"class X implements T2 {\n" +
2893+
" static test1() {\n" +
2894+
" staticMethodWithDefaultArgument()\n" +
2895+
" }\n" +
2896+
" void test2() {\n" +
2897+
" staticMethodWithDefaultArgument()\n" +
2898+
" }\n" +
2899+
"}\n" +
2900+
"X.test1()\n" +
2901+
"new X().test2()\n",
2902+
};
2903+
//@formatter:on
2904+
2905+
runConformTest(sources, "xx");
2906+
}
28762907
}

base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java

+12-5
Original file line numberDiff line numberDiff line change
@@ -385,12 +385,19 @@ private Expression transformMethodCallOnThis(final MethodCallExpression call) {
385385
String methodName = call.getMethodAsString();
386386
for (MethodNode methodNode : traitClass.getMethods(methodName)) {
387387
if (methodName.equals(methodNode.getName()) && (methodNode.isStatic() || methodNode.isPrivate())) {
388-
ArgumentListExpression newArgs = createArgumentList(methodNode.isStatic() ? asClass(call.getObjectExpression()) : weaved, arguments);
389-
MethodCallExpression newCall = callX(inClosure ? classX(traitHelperClass) : varX("this"), methodName, newArgs);
390-
newCall.setImplicitThis(true);
391-
newCall.setSafe(call.isSafe());
392-
newCall.setSourcePosition(call);
388+
MethodCallExpression newCall;
389+
if (!inClosure && methodNode.isStatic()) { // GROOVY-10312: $self or $static$self.staticMethod(...)
390+
newCall = callX(varX(weaved), methodName, transform(arguments));
391+
newCall.setImplicitThis(false);
392+
newCall.setSafe(false);
393+
} else {
394+
ArgumentListExpression newArgs = createArgumentList(methodNode.isStatic() ? asClass(varX("this")) : weaved, arguments);
395+
newCall = callX(inClosure ? classX(traitHelperClass) : call.getObjectExpression(), methodName, newArgs);
396+
newCall.setImplicitThis(true);
397+
newCall.setSafe(call.isSafe());
398+
}
393399
newCall.setSpreadSafe(call.isSpreadSafe());
400+
newCall.setSourcePosition(call);
394401
return newCall;
395402
}
396403
}

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java

+10
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,16 @@ private Expression transformMethodCallOnThis(final MethodCallExpression call) {
318318
String methodName = call.getMethodAsString();
319319
for (MethodNode methodNode : traitClass.getMethods(methodName)) {
320320
if (methodName.equals(methodNode.getName()) && (methodNode.isStatic() || methodNode.isPrivate())) {
321+
// GRECLIPSE add -- GROOVY-10312
322+
if (!inClosure && methodNode.isStatic()) {
323+
MethodCallExpression newCall = callX(varX(weaved), methodName, transform(arguments));
324+
newCall.setImplicitThis(false);
325+
newCall.setSafe(false);
326+
newCall.setSourcePosition(call);
327+
newCall.setSpreadSafe(call.isSpreadSafe());
328+
return newCall;
329+
}
330+
// GRECLIPSE end
321331
ArgumentListExpression newArgs = createArgumentList(methodNode.isStatic() ? asClass(objectExpr) : weaved, arguments);
322332
MethodCallExpression newCall = callX(inClosure ? classX(traitHelperClass) : varX("this"), methodName, newArgs);
323333
newCall.setImplicitThis(true);

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java

+16-9
Original file line numberDiff line numberDiff line change
@@ -312,28 +312,35 @@ private Expression transformSuperMethodCall(final MethodCallExpression call) {
312312
private Expression transformMethodCallOnThis(final MethodCallExpression call) {
313313
Expression method = call.getMethod();
314314
Expression arguments = call.getArguments();
315-
Expression objectExpr = call.getObjectExpression();
315+
Expression thisExpr = call.getObjectExpression();
316316

317317
if (method instanceof ConstantExpression) {
318318
String methodName = call.getMethodAsString();
319319
for (MethodNode methodNode : traitClass.getMethods(methodName)) {
320320
if (methodName.equals(methodNode.getName()) && (methodNode.isStatic() || methodNode.isPrivate())) {
321-
ArgumentListExpression newArgs = createArgumentList(methodNode.isStatic() ? asClass(objectExpr) : weaved, arguments);
322-
MethodCallExpression newCall = callX(inClosure ? classX(traitHelperClass) : varX("this"), methodName, newArgs);
323-
newCall.setImplicitThis(true);
324-
newCall.setSafe(call.isSafe());
325-
newCall.setSourcePosition(call);
321+
MethodCallExpression newCall;
322+
if (!inClosure && methodNode.isStatic()) { // GROOVY-10312: $self or $static$self.staticMethod(...)
323+
newCall = callX(varX(weaved), methodName, transform(arguments));
324+
newCall.setImplicitThis(false);
325+
newCall.setSafe(false);
326+
} else {
327+
ArgumentListExpression newArgs = createArgumentList(methodNode.isStatic() ? asClass(varX("this")) : weaved, arguments);
328+
newCall = callX(inClosure ? classX(traitHelperClass) : thisExpr, methodName, newArgs);
329+
newCall.setImplicitThis(true);
330+
newCall.setSafe(call.isSafe());
331+
}
326332
newCall.setSpreadSafe(call.isSpreadSafe());
333+
newCall.setSourcePosition(call);
327334
return newCall;
328335
}
329336
}
330337
}
331338

332-
MethodCallExpression newCall = callX(inClosure ? objectExpr : weaved, method, transform(arguments));
339+
MethodCallExpression newCall = callX(inClosure ? thisExpr : weaved, method, transform(arguments));
333340
newCall.setImplicitThis(inClosure ? call.isImplicitThis() : false);
334-
newCall.setSafe(call.isSafe());
335-
newCall.setSourcePosition(call);
341+
newCall.setSafe(inClosure ? call.isSafe() : false);
336342
newCall.setSpreadSafe(call.isSpreadSafe());
343+
newCall.setSourcePosition(call);
337344
return newCall;
338345
}
339346

0 commit comments

Comments
 (0)