You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2017/05/10 05:37:59 UTC

groovy git commit: fix merge/backport of e23a4b2

Repository: groovy
Updated Branches:
  refs/heads/GROOVY_2_6_X 7fca4b25c -> 77156a394


fix merge/backport of e23a4b2


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/77156a39
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/77156a39
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/77156a39

Branch: refs/heads/GROOVY_2_6_X
Commit: 77156a3943dda51e378ddbbe57b1cc6d16ed75c9
Parents: 7fca4b2
Author: paulk <pa...@asert.com.au>
Authored: Wed May 10 15:37:50 2017 +1000
Committer: paulk <pa...@asert.com.au>
Committed: Wed May 10 15:37:50 2017 +1000

----------------------------------------------------------------------
 .../groovy/parser/antlr4/AbstractLexer.java     |  25 +-
 .../groovy/parser/antlr4/AbstractParser.java    |  25 +-
 .../apache/groovy/parser/antlr4/AstBuilder.java | 318 +------------------
 .../groovy/parser/antlr4/ModifierManager.java   |  71 +++--
 .../parser/antlr4/SyntaxErrorReportable.java    |  36 +--
 5 files changed, 106 insertions(+), 369 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/77156a39/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AbstractLexer.java
----------------------------------------------------------------------
diff --git a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AbstractLexer.java b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AbstractLexer.java
index aaec57b..f11e6bf 100644
--- a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AbstractLexer.java
+++ b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AbstractLexer.java
@@ -31,22 +31,33 @@ public abstract class AbstractLexer extends Lexer implements SyntaxErrorReportab
     }
 
     public void require(boolean condition, String msg, boolean toAttachPositionInfo) {
+        require(condition, msg, 0, toAttachPositionInfo);
+    }
+    public void require(boolean condition, String msg) {
+        require(condition, msg, true);
+    }
+    public void require(boolean condition, String msg, int offset, boolean toAttachPositionInfo) {
         if (condition) {
             return;
         }
 
-        this.throwSyntaxError(msg, toAttachPositionInfo);
+        this.throwSyntaxError(msg, offset, toAttachPositionInfo);
     }
-    public void require(boolean condition, String msg) {
-        require(condition, msg, true);
+    public void require(boolean condition, String msg, int offset) {
+        require(condition, msg, offset,false);
     }
 
-    public void throwSyntaxError(String msg, boolean toAttachPositionInfo) {
-        throw new GroovySyntaxError(msg + (toAttachPositionInfo ? this.genPositionInfo() : ""), this.getSyntaxErrorSource());
+    public void throwSyntaxError(String msg, int offset, boolean toAttachPositionInfo) {
+        PositionInfo positionInfo = this.genPositionInfo(offset);
+        throw new GroovySyntaxError(msg + (toAttachPositionInfo ? positionInfo.toString() : ""),
+                this.getSyntaxErrorSource(),
+                positionInfo.getLine(),
+                positionInfo.getColumn()
+        );
     }
 
-    public String formatPositionInfo(int line, int column) {
-        return " @ line " + line + ", column " + column;
+    public PositionInfo genPositionInfo(int offset) {
+        return new PositionInfo(getErrorLine(), getErrorColumn() + offset);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/groovy/blob/77156a39/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AbstractParser.java
----------------------------------------------------------------------
diff --git a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AbstractParser.java b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AbstractParser.java
index 1ba6ca3..8eba93e 100644
--- a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AbstractParser.java
+++ b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AbstractParser.java
@@ -31,21 +31,32 @@ public abstract class AbstractParser extends Parser implements SyntaxErrorReport
     }
 
     public void require(boolean condition, String msg, boolean toAttachPositionInfo) {
+        require(condition, msg, 0, toAttachPositionInfo);
+    }
+    public void require(boolean condition, String msg) {
+        require(condition, msg, true);
+    }
+    public void require(boolean condition, String msg, int offset, boolean toAttachPositionInfo) {
         if (condition) {
             return;
         }
 
-        this.throwSyntaxError(msg, toAttachPositionInfo);
+        this.throwSyntaxError(msg, offset, toAttachPositionInfo);
     }
-    public void require(boolean condition, String msg) {
-        require(condition, msg, true);
+    public void require(boolean condition, String msg, int offset) {
+        require(condition, msg, offset,false);
     }
 
-    public void throwSyntaxError(String msg, boolean toAttachPositionInfo) {
-        throw new GroovySyntaxError(msg + (toAttachPositionInfo ? this.genPositionInfo() : ""), this.getSyntaxErrorSource());
+    public void throwSyntaxError(String msg, int offset, boolean toAttachPositionInfo) {
+        PositionInfo positionInfo = this.genPositionInfo(offset);
+        throw new GroovySyntaxError(msg + (toAttachPositionInfo ? positionInfo.toString() : ""),
+                this.getSyntaxErrorSource(),
+                positionInfo.getLine(),
+                positionInfo.getColumn()
+        );
     }
 
-    public String formatPositionInfo(int line, int column) {
-        return " @ line " + line + ", column " + column;
+    public PositionInfo genPositionInfo(int offset) {
+        return new PositionInfo(getErrorLine(), getErrorColumn() + offset);
     }
 }

http://git-wip-us.apache.org/repos/asf/groovy/blob/77156a39/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
----------------------------------------------------------------------
diff --git a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
index 8228ed2..589eb0a 100644
--- a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
+++ b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
@@ -35,6 +35,7 @@ import org.apache.groovy.parser.antlr4.util.StringUtils;
 import org.codehaus.groovy.GroovyBugError;
 import org.codehaus.groovy.antlr.EnumHelper;
 import org.codehaus.groovy.ast.ASTNode;
+import org.codehaus.groovy.ast.AnnotatedNode;
 import org.codehaus.groovy.ast.AnnotationNode;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
@@ -398,14 +399,8 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
             return this.visitEnhancedForControl(ctx.enhancedForControl());
         }
 
-        if (asBoolean(ctx.SEMI())) { // e.g. for(int i = 0; i < 10; i++) {}
-            ClosureListExpression closureListExpression = new ClosureListExpression();
-
-            closureListExpression.addExpression(this.visitForInit(ctx.forInit()));
-            closureListExpression.addExpression(asBoolean(ctx.expression()) ? (Expression) this.visit(ctx.expression()) : EmptyExpression.INSTANCE);
-            closureListExpression.addExpression(this.visitForUpdate(ctx.forUpdate()));
-
-            return new Pair<>(ForStatement.FOR_LOOP_DUMMY, (Expression)closureListExpression);
+        if (asBoolean(ctx.classicalForControl())) { // e.g. for(int i = 0; i < 10; i++) {}
+            return this.visitClassicalForControl(ctx.classicalForControl());
         }
 
         throw createParsingFailedException("Unsupported for control: " + ctx.getText(), ctx);
@@ -474,7 +469,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
         closureListExpression.addExpression(asBoolean(ctx.expression()) ? (Expression) this.visit(ctx.expression()) : EmptyExpression.INSTANCE);
         closureListExpression.addExpression(this.visitForUpdate(ctx.forUpdate()));
 
-        return new Pair<>(ForStatement.FOR_LOOP_DUMMY, closureListExpression);
+        return new Pair<Parameter, Expression>(ForStatement.FOR_LOOP_DUMMY, closureListExpression);
     }
 
     @Override
@@ -1101,7 +1096,9 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
             ListExpression listExpression = new ListExpression();
 
             if (expression instanceof ListExpression) {
-                ((ListExpression) expression).getExpressions().forEach(listExpression::addExpression);
+                for (Expression e : ((ListExpression) expression).getExpressions()) {
+                    listExpression.addExpression(e);
+                }
             } else {
                 listExpression.addExpression(expression);
             }
@@ -1264,11 +1261,11 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
             return;
         }
 
-        Arrays.stream(parameters).forEach(e -> {
+        for (Parameter e : parameters) {
             if (e.hasInitialExpression()) {
                 throw createParsingFailedException("Cannot specify default value for method parameter '" + e.getName() + " = " + e.getInitialExpression().getText() + "' inside an interface", e);
             }
-        });
+        }
     }
 
     @Override
@@ -3542,12 +3539,14 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
 
     @Override
     public BlockStatement visitBlockStatements(BlockStatementsContext ctx) {
-        List<Statement> list = new ArrayList<>();
+        List<Statement> result = new ArrayList<>();
         for (BlockStatementContext blockStatementContext : ctx.blockStatement()) {
-            Statement statement = visitBlockStatement(blockStatementContext);
-            list.add(statement);
+            Statement e = visitBlockStatement(blockStatementContext);
+            if (asBoolean(e)) {
+                result.add(e);
+            }
         }
-        return this.configureAST(this.createBlockStatement(list), ctx);
+        return this.configureAST(this.createBlockStatement(result), ctx);
     }
 
     @Override
@@ -4354,293 +4353,6 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
         }
     }
 
-<<<<<<< HEAD
-    /**
-     * Process modifiers for AST nodes
-     * <p>
-     * Created by Daniel.Sun on 2016/08/27.
-     */
-    private class ModifierManager {
-        private List<ModifierNode> modifierNodeList;
-
-        public ModifierManager(List<ModifierNode> modifierNodeList) {
-            this.validate(modifierNodeList);
-            this.modifierNodeList = Collections.unmodifiableList(asBoolean((Object) modifierNodeList) ? modifierNodeList : Collections.<ModifierNode>emptyList());
-        }
-
-        private void validate(List<ModifierNode> modifierNodeList) {
-            Map<ModifierNode, Integer> modifierNodeCounter = new LinkedHashMap<>(modifierNodeList.size());
-            int visibilityModifierCnt = 0;
-
-            for (ModifierNode modifierNode : modifierNodeList) {
-                Integer cnt = modifierNodeCounter.get(modifierNode);
-
-                if (null == cnt) {
-                    modifierNodeCounter.put(modifierNode, 1);
-                } else if (1 == cnt && !modifierNode.isRepeatable()) {
-                    throw createParsingFailedException("Cannot repeat modifier[" + modifierNode.getText() + "]", modifierNode);
-                }
-
-                if (modifierNode.isVisibilityModifier()) {
-                    visibilityModifierCnt++;
-
-                    if (visibilityModifierCnt > 1) {
-                        throw createParsingFailedException("Cannot specify modifier[" + modifierNode.getText() + "] when access scope has already been defined", modifierNode);
-                    }
-                }
-            }
-        }
-
-        // t    1: class modifiers value; 2: class member modifiers value
-        private int calcModifiersOpValue(int t) {
-            int result = 0;
-
-            for (ModifierNode modifierNode : modifierNodeList) {
-                result |= modifierNode.getOpcode();
-            }
-
-            if (!this.containsVisibilityModifier()) {
-                if (1 == t) {
-                    result |= Opcodes.ACC_SYNTHETIC | Opcodes.ACC_PUBLIC;
-                } else if (2 == t) {
-                    result |= Opcodes.ACC_PUBLIC;
-                }
-            }
-
-            return result;
-        }
-
-        public int getClassModifiersOpValue() {
-            return this.calcModifiersOpValue(1);
-        }
-
-        public int getClassMemberModifiersOpValue() {
-            return this.calcModifiersOpValue(2);
-        }
-
-        public List<AnnotationNode> getAnnotations() {
-            List<AnnotationNode> list = new ArrayList<>();
-            for (ModifierNode modifierNode : modifierNodeList) {
-                if (modifierNode.isAnnotation()) {
-                    AnnotationNode annotationNode = modifierNode.getAnnotationNode();
-                    list.add(annotationNode);
-                }
-            }
-            return list;
-        }
-
-        public boolean contains(int modifierType) {
-            for (ModifierNode e : modifierNodeList) {
-                if (modifierType == e.getType()) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        public boolean containsAnnotations() {
-            for (ModifierNode modifierNode : modifierNodeList) {
-                if (modifierNode.isAnnotation()) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        public boolean containsVisibilityModifier() {
-            for (ModifierNode modifierNode : modifierNodeList) {
-                if (modifierNode.isVisibilityModifier()) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        public boolean containsNonVisibilityModifier() {
-            for (ModifierNode modifierNode : modifierNodeList) {
-                if (modifierNode.isNonVisibilityModifier()) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        public Parameter processParameter(Parameter parameter) {
-            for (ModifierNode e : modifierNodeList) {
-                parameter.setModifiers(parameter.getModifiers() | e.getOpcode());
-
-                if (e.isAnnotation()) {
-                    parameter.addAnnotation(e.getAnnotationNode());
-                }
-            }
-
-            return parameter;
-        }
-
-        public MethodNode processMethodNode(MethodNode mn) {
-            for (ModifierNode e : modifierNodeList) {
-                mn.setModifiers(mn.getModifiers() | e.getOpcode());
-
-                if (e.isAnnotation()) {
-                    mn.addAnnotation(e.getAnnotationNode());
-                }
-            }
-
-            return mn;
-        }
-
-        public VariableExpression processVariableExpression(VariableExpression ve) {
-            for (ModifierNode e : modifierNodeList) {
-                ve.setModifiers(ve.getModifiers() | e.getOpcode());
-
-                // local variable does not attach annotations
-            }
-
-            return ve;
-        }
-
-        public <T extends AnnotatedNode> T attachAnnotations(T node) {
-            for (AnnotationNode a : this.getAnnotations()) {
-                node.addAnnotation(a);
-            }
-
-            return node;
-        }
-    }
-
-    /**
-     * Represents a modifier, which is better to place in the package org.codehaus.groovy.ast
-     * <p>
-     * Created by Daniel.Sun on 2016/08/23.
-     */
-    public static class ModifierNode extends ASTNode {
-        private Integer type;
-        private Integer opcode; // ASM opcode
-        private String text;
-        private AnnotationNode annotationNode;
-        private boolean repeatable;
-
-        public static final int ANNOTATION_TYPE = -999;
-        public static final Map<Integer, Integer> MODIFIER_OPCODE_MAP = Collections.unmodifiableMap(new HashMap<Integer, Integer>() {
-            {
-                put(ANNOTATION_TYPE, 0);
-                put(DEF, 0);
-
-                put(NATIVE, Opcodes.ACC_NATIVE);
-                put(SYNCHRONIZED, Opcodes.ACC_SYNCHRONIZED);
-                put(TRANSIENT, Opcodes.ACC_TRANSIENT);
-                put(VOLATILE, Opcodes.ACC_VOLATILE);
-
-                put(PUBLIC, Opcodes.ACC_PUBLIC);
-                put(PROTECTED, Opcodes.ACC_PROTECTED);
-                put(PRIVATE, Opcodes.ACC_PRIVATE);
-                put(STATIC, Opcodes.ACC_STATIC);
-                put(ABSTRACT, Opcodes.ACC_ABSTRACT);
-                put(FINAL, Opcodes.ACC_FINAL);
-                put(STRICTFP, Opcodes.ACC_STRICT);
-                put(DEFAULT, 0); // no flag for specifying a default method in the JVM spec, hence no ACC_DEFAULT flag in ASM
-            }
-        });
-
-        public ModifierNode(Integer type) {
-            this.type = type;
-            this.opcode = MODIFIER_OPCODE_MAP.get(type);
-            this.repeatable = ANNOTATION_TYPE == type; // Only annotations are repeatable
-
-            if (!asBoolean((Object) this.opcode)) {
-                throw new IllegalArgumentException("Unsupported modifier type: " + type);
-            }
-        }
-
-        /**
-         * @param type the modifier type, which is same as the token type
-         * @param text text of the ast node
-         */
-        public ModifierNode(Integer type, String text) {
-            this(type);
-            this.text = text;
-        }
-
-        /**
-         * @param annotationNode the annotation node
-         * @param text           text of the ast node
-         */
-        public ModifierNode(AnnotationNode annotationNode, String text) {
-            this(ModifierNode.ANNOTATION_TYPE, text);
-            this.annotationNode = annotationNode;
-
-            if (!asBoolean(annotationNode)) {
-                throw new IllegalArgumentException("annotationNode can not be null");
-            }
-        }
-
-        /**
-         * Check whether the modifier is not an imagined modifier(annotation, def)
-         */
-        public boolean isModifier() {
-            return !this.isAnnotation() && !this.isDef();
-        }
-
-        public boolean isVisibilityModifier() {
-            return Objects.equals(PUBLIC, this.type)
-                    || Objects.equals(PROTECTED, this.type)
-                    || Objects.equals(PRIVATE, this.type);
-        }
-
-        public boolean isNonVisibilityModifier() {
-            return this.isModifier() && !this.isVisibilityModifier();
-        }
-
-        public boolean isAnnotation() {
-            return Objects.equals(ANNOTATION_TYPE, this.type);
-        }
-
-        public boolean isDef() {
-            return Objects.equals(DEF, this.type);
-        }
-
-        public Integer getType() {
-            return type;
-        }
-
-        public Integer getOpcode() {
-            return opcode;
-        }
-
-        public boolean isRepeatable() {
-            return repeatable;
-        }
-
-        @Override
-        public String getText() {
-            return text;
-        }
-
-        public AnnotationNode getAnnotationNode() {
-            return annotationNode;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-            ModifierNode that = (ModifierNode) o;
-            return Objects.equals(type, that.type) &&
-                    Objects.equals(text, that.text) &&
-                    Objects.equals(annotationNode, that.annotationNode);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(type, text, annotationNode);
-        }
-
-        @Override
-        public String toString() {
-            return this.text;
-        }
-    }
-
     private final ModuleNode moduleNode;
     private final SourceUnit sourceUnit;
     private final ClassLoader classLoader; // Our ClassLoader, which provides information on external types

http://git-wip-us.apache.org/repos/asf/groovy/blob/77156a39/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/ModifierManager.java
----------------------------------------------------------------------
diff --git a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/ModifierManager.java b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/ModifierManager.java
index a45e36c..23ce68e 100644
--- a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/ModifierManager.java
+++ b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/ModifierManager.java
@@ -26,6 +26,7 @@ import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.expr.VariableExpression;
 import org.objectweb.asm.Opcodes;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
@@ -56,7 +57,7 @@ class ModifierManager {
     public ModifierManager(AstBuilder astBuilder, List<ModifierNode> modifierNodeList) {
         this.astBuilder = astBuilder;
         this.validate(modifierNodeList);
-        this.modifierNodeList = Collections.unmodifiableList(asBoolean((Object) modifierNodeList) ? modifierNodeList : Collections.emptyList());
+        this.modifierNodeList = Collections.unmodifiableList(asBoolean((Object) modifierNodeList) ? modifierNodeList : Collections.<ModifierNode>emptyList());
     }
 
     private void validate(List<ModifierNode> modifierNodeList) {
@@ -91,11 +92,11 @@ class ModifierManager {
     }
 
     private void validate(List<Integer> invalidModifierList, MethodNode methodNode) {
-        modifierNodeList.forEach(e -> {
+        for (ModifierNode e : modifierNodeList) {
             if (invalidModifierList.contains(e.getType())) {
                 throw astBuilder.createParsingFailedException(methodNode.getClass().getSimpleName().replace("Node", "") + " has an incorrect modifier '" + e + "'.", methodNode);
             }
-        });
+        }
     }
 
     // t    1: class modifiers value; 2: class member modifiers value
@@ -126,40 +127,68 @@ class ModifierManager {
     }
 
     public List<AnnotationNode> getAnnotations() {
-        return modifierNodeList.stream()
-                .filter(ModifierNode::isAnnotation)
-                .map(ModifierNode::getAnnotationNode)
-                .collect(Collectors.toList());
+        List<AnnotationNode> result = new ArrayList<AnnotationNode>();
+        for (ModifierNode m : modifierNodeList) {
+            if (m.isAnnotation()) {
+                result.add(m.getAnnotationNode());
+            }
+        }
+        return result;
     }
 
     public boolean contains(int modifierType) {
-        return modifierNodeList.stream().anyMatch(e -> modifierType == e.getType());
+        for (ModifierNode e : modifierNodeList) {
+            if (modifierType == e.getType()) {
+                return true;
+            }
+        }
+        return false;
     }
 
-    public Optional<ModifierNode> get(int modifierType) {
-        return modifierNodeList.stream().filter(e -> modifierType == e.getType()).findFirst();
+    public ModifierNode get(int modifierType) {
+        for (ModifierNode e : modifierNodeList) {
+            if (modifierType == e.getType()) {
+                return e;
+            }
+        }
+        return null;
     }
 
     public boolean containsAnnotations() {
-        return modifierNodeList.stream().anyMatch(ModifierNode::isAnnotation);
+        for (ModifierNode e : modifierNodeList) {
+            if (e.isAnnotation()) {
+                return true;
+            }
+        }
+        return false;
     }
 
     public boolean containsVisibilityModifier() {
-        return modifierNodeList.stream().anyMatch(ModifierNode::isVisibilityModifier);
+        for (ModifierNode e : modifierNodeList) {
+            if (e.isVisibilityModifier()) {
+                return true;
+            }
+        }
+        return false;
     }
 
     public boolean containsNonVisibilityModifier() {
-        return modifierNodeList.stream().anyMatch(ModifierNode::isNonVisibilityModifier);
+        for (ModifierNode e : modifierNodeList) {
+            if (e.isNonVisibilityModifier()) {
+                return true;
+            }
+        }
+        return false;
     }
 
     public Parameter processParameter(Parameter parameter) {
-        modifierNodeList.forEach(e -> {
+        for (ModifierNode e : modifierNodeList) {
             parameter.setModifiers(parameter.getModifiers() | e.getOpcode());
 
             if (e.isAnnotation()) {
                 parameter.addAnnotation(e.getAnnotationNode());
             }
-        });
+        };
 
         return parameter;
     }
@@ -169,29 +198,31 @@ class ModifierManager {
     }
 
     public MethodNode processMethodNode(MethodNode mn) {
-        modifierNodeList.forEach(e -> {
+        for (ModifierNode e : modifierNodeList) {
             mn.setModifiers((e.isVisibilityModifier() ? clearVisibilityModifiers(mn.getModifiers()) : mn.getModifiers()) | e.getOpcode());
 
             if (e.isAnnotation()) {
                 mn.addAnnotation(e.getAnnotationNode());
             }
-        });
+        };
 
         return mn;
     }
 
     public VariableExpression processVariableExpression(VariableExpression ve) {
-        modifierNodeList.forEach(e -> {
+        for (ModifierNode e : modifierNodeList) {
             ve.setModifiers(ve.getModifiers() | e.getOpcode());
 
             // local variable does not attach annotations
-        });
+        };
 
         return ve;
     }
 
     public <T extends AnnotatedNode> T attachAnnotations(T node) {
-        this.getAnnotations().forEach(node::addAnnotation);
+        for (AnnotationNode an : getAnnotations()) {
+            node.addAnnotation(an);
+        }
 
         return node;
     }

http://git-wip-us.apache.org/repos/asf/groovy/blob/77156a39/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/SyntaxErrorReportable.java
----------------------------------------------------------------------
diff --git a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/SyntaxErrorReportable.java b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/SyntaxErrorReportable.java
index f9d0caa..c926676 100644
--- a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/SyntaxErrorReportable.java
+++ b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/SyntaxErrorReportable.java
@@ -24,41 +24,13 @@ package org.apache.groovy.parser.antlr4;
 public interface SyntaxErrorReportable {
     void require(boolean condition, String msg, boolean toAttachPositionInfo);
     void require(boolean condition, String msg);
-    void throwSyntaxError(String msg, boolean toAttachPositionInfo);
-    String formatPositionInfo(int line, int column);
-    int getSyntaxErrorSource();
-    String genPositionInfo();
-
-    default void require(boolean condition, String msg, int offset, boolean toAttachPositionInfo) {
-        if (condition) {
-            return;
-        }
-
-        this.throwSyntaxError(msg, offset, toAttachPositionInfo);
-    }
-    default void require(boolean condition, String msg, boolean toAttachPositionInfo) {
-        require(condition, msg, 0, toAttachPositionInfo);
-    }
-    default void require(boolean condition, String msg, int offset) {
-        require(condition, msg, offset,false);
-    }
-    default void require(boolean condition, String msg) {
-        require(condition, msg, false);
-    }
+    void require(boolean condition, String msg, int offset, boolean toAttachPositionInfo);
+    void require(boolean condition, String msg, int offset);
 
-    default void throwSyntaxError(String msg, int offset, boolean toAttachPositionInfo) {
-        PositionInfo positionInfo = this.genPositionInfo(offset);
-        throw new GroovySyntaxError(msg + (toAttachPositionInfo ? positionInfo.toString() : ""),
-                this.getSyntaxErrorSource(),
-                positionInfo.getLine(),
-                positionInfo.getColumn()
-        );
-    }
+    void throwSyntaxError(String msg, int offset, boolean toAttachPositionInfo);
 
     int getSyntaxErrorSource();
-    default PositionInfo genPositionInfo(int offset) {
-        return new PositionInfo(getErrorLine(), getErrorColumn() + offset);
-    }
+    PositionInfo genPositionInfo(int offset);
 
     int getErrorLine();
     int getErrorColumn();