This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch GROOVY_2_5_X in repository https://gitbox.apache.org/repos/asf/groovy.git
commit f80d4981b035a0e0492cb1619067b2f9419e1e52 Author: Eric Milles <[email protected]> AuthorDate: Mon Mar 13 17:54:17 2023 -0500 fix for NPE --- .../java/org/codehaus/groovy/ast/expr/FieldExpression.java | 14 ++++++++------ .../groovy/classgen/InnerClassCompletionVisitor.java | 8 ++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/ast/expr/FieldExpression.java b/src/main/java/org/codehaus/groovy/ast/expr/FieldExpression.java index 67350ff2e1..78a4c028a3 100644 --- a/src/main/java/org/codehaus/groovy/ast/expr/FieldExpression.java +++ b/src/main/java/org/codehaus/groovy/ast/expr/FieldExpression.java @@ -22,6 +22,8 @@ import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.ast.FieldNode; import org.codehaus.groovy.ast.GroovyCodeVisitor; +import static java.util.Objects.requireNonNull; + /** * Represents a field access such as the expression "this.foo". */ @@ -30,17 +32,17 @@ public class FieldExpression extends Expression { private final FieldNode field; private boolean useRef; - public FieldExpression(FieldNode field) { - this.field = field; + public FieldExpression(final FieldNode field) { + this.field = requireNonNull(field); } @Override - public void visit(GroovyCodeVisitor visitor) { + public void visit(final GroovyCodeVisitor visitor) { visitor.visitFieldExpression(this); } @Override - public Expression transformExpression(ExpressionTransformer transformer) { + public Expression transformExpression(final ExpressionTransformer transformer) { return this; } @@ -63,7 +65,7 @@ public class FieldExpression extends Expression { } @Override - public void setType(ClassNode type) { + public void setType(final ClassNode type) { super.setType(type); field.setType(type); } @@ -76,7 +78,7 @@ public class FieldExpression extends Expression { return useRef; } - public void setUseReferenceDirectly(boolean useRef) { + public void setUseReferenceDirectly(final boolean useRef) { this.useRef = useRef; } diff --git a/src/main/java/org/codehaus/groovy/classgen/InnerClassCompletionVisitor.java b/src/main/java/org/codehaus/groovy/classgen/InnerClassCompletionVisitor.java index 445ed0a82b..ee77db0d0c 100644 --- a/src/main/java/org/codehaus/groovy/classgen/InnerClassCompletionVisitor.java +++ b/src/main/java/org/codehaus/groovy/classgen/InnerClassCompletionVisitor.java @@ -52,7 +52,7 @@ public class InnerClassCompletionVisitor extends InnerClassVisitorHelper impleme private final SourceUnit sourceUnit; private ClassNode classNode; - private FieldNode thisField = null; + private FieldNode thisField; private static final String CLOSURE_INTERNAL_NAME = BytecodeHelper.getClassInternalName(ClassHelper.CLOSURE_TYPE), @@ -71,8 +71,9 @@ public class InnerClassCompletionVisitor extends InnerClassVisitorHelper impleme public void visitClass(ClassNode node) { classNode = node; thisField = null; + if (node.isEnum() || node.isInterface()) return; InnerClassNode innerClass = null; - if (!node.isEnum() && !node.isInterface() && node instanceof InnerClassNode) { + if (node instanceof InnerClassNode) { innerClass = (InnerClassNode) node; thisField = innerClass.getField("this$0"); if (innerClass.getVariableScope() == null && innerClass.getDeclaredConstructors().isEmpty()) { @@ -80,7 +81,6 @@ public class InnerClassCompletionVisitor extends InnerClassVisitorHelper impleme addGeneratedConstructor(innerClass, ACC_PUBLIC, Parameter.EMPTY_ARRAY, null, null); } } - if (node.isEnum() || node.isInterface()) return; // use Iterator.hasNext() to check for available inner classes if (node.getInnerClasses().hasNext()) addDispatcherMethods(node); if (innerClass == null) return; @@ -419,7 +419,7 @@ public class InnerClassCompletionVisitor extends InnerClassVisitorHelper impleme block = (BlockStatement) code; } BlockStatement newCode = new BlockStatement(); - addFieldInit(thisPara, thisField, newCode); + if (thisField != null) addFieldInit(thisPara, thisField, newCode); ConstructorCallExpression cce = getFirstIfSpecialConstructorCall(block); if (cce == null) { cce = new ConstructorCallExpression(ClassNode.SUPER, new TupleExpression());
