Skip to content

Commit 5f81782

Browse files
committed
GROOVY-7293, GROOVY-9901
1 parent eda2958 commit 5f81782

File tree

7 files changed

+125
-7
lines changed

7 files changed

+125
-7
lines changed

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

+39-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2020 the original author or authors.
2+
* Copyright 2009-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -1550,7 +1550,9 @@ public void testTraits61() {
15501550
String[] sources = {
15511551
"Script.groovy",
15521552
"trait T {\n" +
1553-
" @groovy.transform.PackageScope int m() { 42 }\n" +
1553+
" @groovy.transform.PackageScope int m() {\n" +
1554+
" 42\n" +
1555+
" }\n" +
15541556
" def x() { print m() }\n" +
15551557
"}\n" +
15561558
"class C implements T {\n" +
@@ -1559,7 +1561,13 @@ public void testTraits61() {
15591561
};
15601562
//@formatter:on
15611563

1562-
runConformTest(sources, "42");
1564+
runNegativeTest(sources,
1565+
"----------\n" +
1566+
"1. ERROR in Script.groovy (at line 2)\n" +
1567+
"\t@groovy.transform.PackageScope int m() {\n" +
1568+
"\t^\n" +
1569+
"Groovy:Can't use @PackageScope for method 'm' which has explicit visibility.\n" +
1570+
"----------\n");
15631571
}
15641572

15651573
@Test
@@ -1797,7 +1805,7 @@ public void testTraits7288() {
17971805
runConformTest(sources, "");
17981806
}
17991807

1800-
@Test @Ignore
1808+
@Test
18011809
public void testTraits7293() {
18021810
//@formatter:off
18031811
String[] sources = {
@@ -2699,4 +2707,31 @@ public void testTraits9763() {
26992707

27002708
runConformTest(sources, "works");
27012709
}
2710+
2711+
@Test
2712+
public void testTraits9901() {
2713+
//@formatter:off
2714+
String[] sources = {
2715+
"Script.groovy",
2716+
"trait T {\n" +
2717+
" @groovy.transform.Memoized\n" +
2718+
" double m() { Math.random() }\n" +
2719+
"}\n" +
2720+
"class C implements T {}\n" +
2721+
"class D implements T {}\n" +
2722+
2723+
"def c = new C()\n" +
2724+
"def n = c.m()\n" +
2725+
"def x = c.m()\n" +
2726+
"def y = new C().m()\n" +
2727+
"def z = new D().m()\n" +
2728+
"assert n == x\n" +
2729+
"assert n != y\n" +
2730+
"assert n != z\n" +
2731+
"assert y != z\n",
2732+
};
2733+
//@formatter:on
2734+
2735+
runConformTest(sources, "");
2736+
}
27022737
}

base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/ASTTransformationVisitor.java

+24
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ public void call(SourceUnit source, GeneratorContext context, ClassNode classNod
273273
collector.visitClass(classNode);
274274
}
275275
}, Phases.SEMANTIC_ANALYSIS);
276+
276277
for (CompilePhase phase : CompilePhase.values()) {
277278
final ASTTransformationVisitor visitor = new ASTTransformationVisitor(phase, context);
278279
switch (phase) {
@@ -295,6 +296,29 @@ public void call(SourceUnit source, GeneratorContext context, ClassNode classNod
295296
}
296297
}
297298

299+
// GRECLIPSE add -- GROOVY-7293, GROOVY-9901
300+
public static void addNewPhaseOperation(final CompilationUnit compilationUnit, final SourceUnit sourceUnit, final ClassNode classNode) {
301+
int phase = compilationUnit.getPhase();
302+
if (phase < Phases.SEMANTIC_ANALYSIS) {
303+
return;
304+
}
305+
306+
ASTTransformationCollectorCodeVisitor collector = new ASTTransformationCollectorCodeVisitor(sourceUnit, compilationUnit.getTransformLoader());
307+
collector.visitClass(classNode);
308+
309+
compilationUnit.addNewPhaseOperation(new CompilationUnit.SourceUnitOperation() {
310+
@Override
311+
public void call(final SourceUnit source) {
312+
if (source == sourceUnit) {
313+
ASTTransformationVisitor visitor = new ASTTransformationVisitor(CompilePhase.fromPhaseNumber(phase), compilationUnit.getASTTransformationsContext());
314+
visitor.source = source;
315+
visitor.visitClass(classNode);
316+
}
317+
}
318+
}, phase);
319+
}
320+
// GRECLIPSE end
321+
298322
public static void addGlobalTransformsAfterGrab(ASTTransformationsContext context) {
299323
doAddGlobalTransforms(context, false);
300324
}

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
import org.codehaus.groovy.syntax.SyntaxException;
5656
import org.codehaus.groovy.syntax.Token;
5757
import org.codehaus.groovy.syntax.Types;
58-
import org.codehaus.groovy.transform.ASTTransformationCollectorCodeVisitor;
58+
import org.codehaus.groovy.transform.ASTTransformationVisitor;
5959
import org.codehaus.groovy.transform.AbstractASTTransformation;
6060
import org.codehaus.groovy.transform.GroovyASTTransformation;
6161

@@ -352,10 +352,14 @@ private static MethodNode createInitMethod(final boolean isStatic, final ClassNo
352352
}
353353

354354
private void registerASTTransformations(final ClassNode helper) {
355+
/* GRECLIPSE edit -- GROOVY-7293, GROOVY-9901
355356
ASTTransformationCollectorCodeVisitor collector = new ASTTransformationCollectorCodeVisitor(
356357
unit, compilationUnit.getTransformLoader()
357358
);
358359
collector.visitClass(helper);
360+
*/
361+
ASTTransformationVisitor.addNewPhaseOperation(compilationUnit, unit, helper);
362+
// GRECLIPSE end
359363
// Perform an additional phase which has to be done *after* type checking
360364
compilationUnit.addPhaseOperation(new CompilationUnit.PrimaryClassNodeOperation() {
361365
@Override

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/ASTTransformationVisitor.java

+23
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ public static void addPhaseOperations(final CompilationUnit compilationUnit) {
267267
GroovyClassVisitor visitor = new ASTTransformationCollectorCodeVisitor(source, compilationUnit.getTransformLoader());
268268
visitor.visitClass(classNode);
269269
}, Phases.SEMANTIC_ANALYSIS);
270+
270271
for (CompilePhase phase : CompilePhase.values()) {
271272
switch (phase) {
272273
case INITIALIZATION:
@@ -287,6 +288,28 @@ public static void addPhaseOperations(final CompilationUnit compilationUnit) {
287288
}
288289
}
289290

291+
// GRECLIPSE add -- GROOVY-7293, GROOVY-9901
292+
public static void addNewPhaseOperation(final CompilationUnit compilationUnit, final SourceUnit sourceUnit, final ClassNode classNode) {
293+
int phase = compilationUnit.getPhase();
294+
if (phase < Phases.SEMANTIC_ANALYSIS) {
295+
return;
296+
}
297+
298+
{
299+
GroovyClassVisitor visitor = new ASTTransformationCollectorCodeVisitor(sourceUnit, compilationUnit.getTransformLoader());
300+
visitor.visitClass(classNode);
301+
}
302+
303+
compilationUnit.addNewPhaseOperation(source -> {
304+
if (source == sourceUnit) {
305+
ASTTransformationVisitor visitor = new ASTTransformationVisitor(CompilePhase.fromPhaseNumber(phase), compilationUnit.getASTTransformationsContext());
306+
visitor.source = source;
307+
visitor.visitClass(classNode);
308+
}
309+
}, phase);
310+
}
311+
// GRECLIPSE end
312+
290313
public static void addGlobalTransformsAfterGrab(ASTTransformationsContext context) {
291314
doAddGlobalTransforms(context, false);
292315
}

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
import org.codehaus.groovy.control.SourceUnit;
4949
import org.codehaus.groovy.runtime.InvokerHelper;
5050
import org.codehaus.groovy.syntax.SyntaxException;
51-
import org.codehaus.groovy.transform.ASTTransformationCollectorCodeVisitor;
51+
import org.codehaus.groovy.transform.ASTTransformationVisitor;
5252
import org.codehaus.groovy.transform.AbstractASTTransformation;
5353
import org.codehaus.groovy.transform.GroovyASTTransformation;
5454

@@ -351,10 +351,14 @@ private static MethodNode createInitMethod(final boolean isStatic, final ClassNo
351351
}
352352

353353
private void registerASTTransformations(final ClassNode helper) {
354+
/* GRECLIPSE edit -- GROOVY-7293, GROOVY-9901
354355
{
355356
GroovyClassVisitor visitor = new ASTTransformationCollectorCodeVisitor(sourceUnit, compilationUnit.getTransformLoader());
356357
visitor.visitClass(helper);
357358
}
359+
*/
360+
ASTTransformationVisitor.addNewPhaseOperation(compilationUnit, sourceUnit, helper);
361+
// GRECLIPSE end
358362
// Perform an additional phase which has to be done *after* type checking
359363
compilationUnit.addPhaseOperation((final SourceUnit source, final GeneratorContext context, final ClassNode classNode) -> {
360364
if (classNode != helper) return;

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/ASTTransformationVisitor.java

+23
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ public static void addPhaseOperations(final CompilationUnit compilationUnit) {
270270
GroovyClassVisitor visitor = new ASTTransformationCollectorCodeVisitor(source, compilationUnit.getTransformLoader());
271271
visitor.visitClass(classNode);
272272
}, Phases.SEMANTIC_ANALYSIS);
273+
273274
for (CompilePhase phase : CompilePhase.values()) {
274275
switch (phase) {
275276
case INITIALIZATION:
@@ -290,6 +291,28 @@ public static void addPhaseOperations(final CompilationUnit compilationUnit) {
290291
}
291292
}
292293

294+
// GRECLIPSE add -- GROOVY-7293, GROOVY-9901
295+
public static void addNewPhaseOperation(final CompilationUnit compilationUnit, final SourceUnit sourceUnit, final ClassNode classNode) {
296+
int phase = compilationUnit.getPhase();
297+
if (phase < Phases.SEMANTIC_ANALYSIS) {
298+
return;
299+
}
300+
301+
{
302+
GroovyClassVisitor visitor = new ASTTransformationCollectorCodeVisitor(sourceUnit, compilationUnit.getTransformLoader());
303+
visitor.visitClass(classNode);
304+
}
305+
306+
compilationUnit.addNewPhaseOperation(source -> {
307+
if (source == sourceUnit) {
308+
ASTTransformationVisitor visitor = new ASTTransformationVisitor(CompilePhase.fromPhaseNumber(phase), compilationUnit.getASTTransformationsContext());
309+
visitor.source = source;
310+
visitor.visitClass(classNode);
311+
}
312+
}, phase);
313+
}
314+
// GRECLIPSE end
315+
293316
public static void addGlobalTransformsAfterGrab(ASTTransformationsContext context) {
294317
doAddGlobalTransforms(context, false);
295318
}

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
import org.codehaus.groovy.control.SourceUnit;
4949
import org.codehaus.groovy.runtime.InvokerHelper;
5050
import org.codehaus.groovy.syntax.SyntaxException;
51-
import org.codehaus.groovy.transform.ASTTransformationCollectorCodeVisitor;
51+
import org.codehaus.groovy.transform.ASTTransformationVisitor;
5252
import org.codehaus.groovy.transform.AbstractASTTransformation;
5353
import org.codehaus.groovy.transform.GroovyASTTransformation;
5454

@@ -76,6 +76,7 @@
7676
import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt;
7777
import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
7878
import static org.codehaus.groovy.transform.trait.SuperCallTraitTransformer.UNRESOLVED_HELPER_CLASS;
79+
7980
import static groovyjarjarasm.asm.Opcodes.ACC_ABSTRACT;
8081
import static groovyjarjarasm.asm.Opcodes.ACC_FINAL;
8182
import static groovyjarjarasm.asm.Opcodes.ACC_INTERFACE;
@@ -358,10 +359,14 @@ private static MethodNode createInitMethod(final boolean isStatic, final ClassNo
358359
}
359360

360361
private void registerASTTransformations(final ClassNode helper) {
362+
/* GRECLIPSE edit -- GROOVY-7293, GROOVY-9901
361363
{
362364
GroovyClassVisitor visitor = new ASTTransformationCollectorCodeVisitor(sourceUnit, compilationUnit.getTransformLoader());
363365
visitor.visitClass(helper);
364366
}
367+
*/
368+
ASTTransformationVisitor.addNewPhaseOperation(compilationUnit, sourceUnit, helper);
369+
// GRECLIPSE end
365370
// Perform an additional phase which has to be done *after* type checking
366371
compilationUnit.addPhaseOperation((final SourceUnit source, final GeneratorContext context, final ClassNode classNode) -> {
367372
if (classNode != helper) return;

0 commit comments

Comments
 (0)