Commit baf7dda0 authored by Dave Syer's avatar Dave Syer

Accumulate state in a local variable, not a field in the instance

State is accumulating unnecessarily in AST tranformation instances.
We can fix the ones we have implemented so far just by using a
local variable and passing it into the methods where it is used.
All the methods are private so this change is safe in a point release.

Fixes gh-5283
parent 0dd3531f
...@@ -45,8 +45,6 @@ public abstract class AnnotatedNodeASTTransformation implements ASTTransformatio ...@@ -45,8 +45,6 @@ public abstract class AnnotatedNodeASTTransformation implements ASTTransformatio
private final boolean removeAnnotations; private final boolean removeAnnotations;
private List<AnnotationNode> annotationNodes = new ArrayList<AnnotationNode>();
private SourceUnit sourceUnit; private SourceUnit sourceUnit;
protected AnnotatedNodeASTTransformation(Set<String> interestingAnnotationNames, protected AnnotatedNodeASTTransformation(Set<String> interestingAnnotationNames,
...@@ -58,37 +56,38 @@ public abstract class AnnotatedNodeASTTransformation implements ASTTransformatio ...@@ -58,37 +56,38 @@ public abstract class AnnotatedNodeASTTransformation implements ASTTransformatio
@Override @Override
public void visit(ASTNode[] nodes, SourceUnit source) { public void visit(ASTNode[] nodes, SourceUnit source) {
this.sourceUnit = source; this.sourceUnit = source;
List<AnnotationNode> annotationNodes = new ArrayList<AnnotationNode>();
ClassVisitor classVisitor = new ClassVisitor(source); ClassVisitor classVisitor = new ClassVisitor(source, annotationNodes);
for (ASTNode node : nodes) { for (ASTNode node : nodes) {
if (node instanceof ModuleNode) { if (node instanceof ModuleNode) {
ModuleNode module = (ModuleNode) node; ModuleNode module = (ModuleNode) node;
visitAnnotatedNode(module.getPackage()); visitAnnotatedNode(module.getPackage(), annotationNodes);
for (ImportNode importNode : module.getImports()) { for (ImportNode importNode : module.getImports()) {
visitAnnotatedNode(importNode); visitAnnotatedNode(importNode, annotationNodes);
} }
for (ImportNode importNode : module.getStarImports()) { for (ImportNode importNode : module.getStarImports()) {
visitAnnotatedNode(importNode); visitAnnotatedNode(importNode, annotationNodes);
} }
for (Map.Entry<String, ImportNode> entry : module.getStaticImports() for (Map.Entry<String, ImportNode> entry : module.getStaticImports()
.entrySet()) { .entrySet()) {
visitAnnotatedNode(entry.getValue()); visitAnnotatedNode(entry.getValue(), annotationNodes);
} }
for (Map.Entry<String, ImportNode> entry : module.getStaticStarImports() for (Map.Entry<String, ImportNode> entry : module.getStaticStarImports()
.entrySet()) { .entrySet()) {
visitAnnotatedNode(entry.getValue()); visitAnnotatedNode(entry.getValue(), annotationNodes);
} }
for (ClassNode classNode : module.getClasses()) { for (ClassNode classNode : module.getClasses()) {
visitAnnotatedNode(classNode); visitAnnotatedNode(classNode, annotationNodes);
classNode.visitContents(classVisitor); classNode.visitContents(classVisitor);
} }
} }
} }
processAnnotationNodes(this.annotationNodes); processAnnotationNodes(annotationNodes);
} }
protected SourceUnit getSourceUnit() { protected SourceUnit getSourceUnit() {
...@@ -97,7 +96,8 @@ public abstract class AnnotatedNodeASTTransformation implements ASTTransformatio ...@@ -97,7 +96,8 @@ public abstract class AnnotatedNodeASTTransformation implements ASTTransformatio
protected abstract void processAnnotationNodes(List<AnnotationNode> annotationNodes); protected abstract void processAnnotationNodes(List<AnnotationNode> annotationNodes);
private void visitAnnotatedNode(AnnotatedNode annotatedNode) { private void visitAnnotatedNode(AnnotatedNode annotatedNode,
List<AnnotationNode> annotatedNodes) {
if (annotatedNode != null) { if (annotatedNode != null) {
Iterator<AnnotationNode> annotationNodes = annotatedNode.getAnnotations() Iterator<AnnotationNode> annotationNodes = annotatedNode.getAnnotations()
.iterator(); .iterator();
...@@ -105,7 +105,7 @@ public abstract class AnnotatedNodeASTTransformation implements ASTTransformatio ...@@ -105,7 +105,7 @@ public abstract class AnnotatedNodeASTTransformation implements ASTTransformatio
AnnotationNode annotationNode = annotationNodes.next(); AnnotationNode annotationNode = annotationNodes.next();
if (this.interestingAnnotationNames if (this.interestingAnnotationNames
.contains(annotationNode.getClassNode().getName())) { .contains(annotationNode.getClassNode().getName())) {
this.annotationNodes.add(annotationNode); annotatedNodes.add(annotationNode);
if (this.removeAnnotations) { if (this.removeAnnotations) {
annotationNodes.remove(); annotationNodes.remove();
} }
...@@ -117,9 +117,11 @@ public abstract class AnnotatedNodeASTTransformation implements ASTTransformatio ...@@ -117,9 +117,11 @@ public abstract class AnnotatedNodeASTTransformation implements ASTTransformatio
private class ClassVisitor extends ClassCodeVisitorSupport { private class ClassVisitor extends ClassCodeVisitorSupport {
private final SourceUnit source; private final SourceUnit source;
private List<AnnotationNode> annotationNodes;
ClassVisitor(SourceUnit source) { ClassVisitor(SourceUnit source, List<AnnotationNode> annotationNodes) {
this.source = source; this.source = source;
this.annotationNodes = annotationNodes;
} }
@Override @Override
...@@ -129,7 +131,7 @@ public abstract class AnnotatedNodeASTTransformation implements ASTTransformatio ...@@ -129,7 +131,7 @@ public abstract class AnnotatedNodeASTTransformation implements ASTTransformatio
@Override @Override
public void visitAnnotations(AnnotatedNode node) { public void visitAnnotations(AnnotatedNode node) {
visitAnnotatedNode(node); visitAnnotatedNode(node, this.annotationNodes);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment