diff --git a/tool/src/org/antlr/v4/codegen/OutputModelWalker.java b/tool/src/org/antlr/v4/codegen/OutputModelWalker.java index 5b62f0b4e..544489656 100644 --- a/tool/src/org/antlr/v4/codegen/OutputModelWalker.java +++ b/tool/src/org/antlr/v4/codegen/OutputModelWalker.java @@ -30,6 +30,7 @@ package org.antlr.v4.codegen; import org.antlr.v4.Tool; +import org.antlr.v4.codegen.model.ModelElement; import org.antlr.v4.codegen.model.OutputModelObject; import org.antlr.v4.tool.ErrorType; import org.stringtemplate.v4.*; @@ -94,13 +95,24 @@ public class OutputModelWalker { st.add(modelArgName, omo); // COMPUTE STs FOR EACH NESTED MODEL OBJECT MARKED WITH @ModelElement AND MAKE ST ATTRIBUTE + Set usedFieldNames = new HashSet(); Field fields[] = cl.getFields(); for (Field fi : fields) { - Annotation[] annotations = fi.getAnnotations(); - if ( annotations.length==0 ) continue; + ModelElement annotation = fi.getAnnotation(ModelElement.class); + if (annotation == null) { + continue; + } + String fieldName = fi.getName(); + + if (!usedFieldNames.add(fieldName)) { + tool.errMgr.toolError(ErrorType.INTERNAL_ERROR, "Model object " + omo.getClass().getSimpleName() + " has multiple fields named '" + fieldName + "'"); + continue; + } + // Just don't set @ModelElement fields w/o formal arg in target ST if ( formalArgs.get(fieldName)==null ) continue; + try { Object o = fi.get(omo); if ( o instanceof OutputModelObject ) { // SINGLE MODEL OBJECT? diff --git a/tool/src/org/antlr/v4/codegen/model/LL1PlusBlock.java b/tool/src/org/antlr/v4/codegen/model/LL1PlusBlock.java index eebb3ba7c..e495249e5 100644 --- a/tool/src/org/antlr/v4/codegen/model/LL1PlusBlock.java +++ b/tool/src/org/antlr/v4/codegen/model/LL1PlusBlock.java @@ -46,7 +46,6 @@ public class LL1PlusBlock extends LL1Loop { public String loopCounterVar; public String[] exitLook; - @ModelElement public SrcOp loopExpr; @ModelElement public ThrowNoViableAlt error; public LL1PlusBlock(OutputModelFactory factory, GrammarAST plusRoot, List alts) {