GROOVY-6373: 'log' field introduced via @Slf4j not accessible in inner class of @CompileStatic class
diff --git a/src/main/org/codehaus/groovy/transform/LogASTTransformation.java b/src/main/org/codehaus/groovy/transform/LogASTTransformation.java
index bc4b51d..a73434e 100644
--- a/src/main/org/codehaus/groovy/transform/LogASTTransformation.java
+++ b/src/main/org/codehaus/groovy/transform/LogASTTransformation.java
@@ -156,14 +156,8 @@
};
transformer.visitClass(classNode);
- // TODO can we replace GROOOVY-6373 fix with something simpler? breaks tests ATM
- // new VariableScopeVisitor(sourceUnit, true).visitClass(classNode);
- // GROOVY-6373: added log field is already a field node in inner classes by now
- VariableScopeVisitor scopeVisitor = new VariableScopeVisitor(sourceUnit, true);
- Iterator<InnerClassNode> innerClasses = classNode.getInnerClasses();
- while (innerClasses.hasNext()) {
- scopeVisitor.visitClass(innerClasses.next());
- }
+ // GROOVY-6373: references to 'log' field are normally already FieldNodes by now, so revisit scoping
+ new VariableScopeVisitor(sourceUnit, true).visitClass(classNode);
}
private String lookupLogFieldName(AnnotationNode logAnnotation) {
diff --git a/src/test/groovy/util/logging/CommonsTest.groovy b/src/test/groovy/util/logging/CommonsTest.groovy
index abbbb09..a211b89 100644
--- a/src/test/groovy/util/logging/CommonsTest.groovy
+++ b/src/test/groovy/util/logging/CommonsTest.groovy
@@ -152,13 +152,20 @@
@groovy.util.logging.Commons
class MyClass {
boolean traceCalled = false
- MyClass() {
- log = new LogDecorator().wrap(log) as org.apache.commons.logging.Log
- }
def loggingMethod() {
+ overrideLog()
log.trace (traceCalled = true)
}
+
+ def overrideLog() {
+ def field = MyClass.getDeclaredField('log')
+ field.accessible = true
+ def modifiersField = java.lang.reflect.Field.getDeclaredField("modifiers")
+ modifiersField.accessible = true
+ modifiersField.setInt(field, field.modifiers & ~java.lang.reflect.Modifier.FINAL)
+ field.set(null, new LogDecorator().wrap(log) as org.apache.commons.logging.Log)
+ }
}
def o = new MyClass()
o.loggingMethod()