diff --git a/src/jastadd/ast/Attributes.jrag b/src/jastadd/ast/Attributes.jrag index 7574499424362788cc5e74cd2ffc6331df5243ef..706d4d044fdb69493b7bd5d8f8e056add9ba71c5 100644 --- a/src/jastadd/ast/Attributes.jrag +++ b/src/jastadd/ast/Attributes.jrag @@ -28,7 +28,9 @@ import org.jastadd.ast.AST.*; import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedList; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -402,29 +404,26 @@ public aspect Attributes { } } - public class InterTypeObject { - public String className; - public ClassBodyObject classBodyObject; + public Map<String, Collection<ClassBodyObject>> Grammar.interTypeDecls + = new HashMap<String, Collection<ClassBodyObject>>(); - public InterTypeObject(String name, ClassBodyObject obj) { - this.className = name; - this.classBodyObject = obj; + protected void Grammar.addInterTypeDecl(String className, ClassBodyObject decl) { + if (!interTypeDecls.containsKey(className)) { + interTypeDecls.put(className, new ArrayList<ClassBodyObject>()); } + interTypeDecls.get(className).add(decl); } - public Collection<InterTypeObject> Grammar.interTypeObjects = new LinkedList<InterTypeObject>(); - public void Grammar.addClassBodyDecl(org.jastadd.jrag.AST.SimpleNode n, String className, String fileName, String aspectName) { - interTypeObjects.add(new InterTypeObject(className, new ClassBodyObject(n, - fileName, n.firstToken.beginLine, aspectName))); + addInterTypeDecl(className, new ClassBodyObject(n, fileName, n.firstToken.beginLine, aspectName)); } public void Grammar.addClassBodyDecl(org.jastadd.jrag.AST.SimpleNode n, String className, String fileName, String modifiers, String aspectName) { ClassBodyObject obj = new ClassBodyObject(n, fileName, n.firstToken.beginLine, aspectName); obj.modifiers = modifiers; - interTypeObjects.add(new InterTypeObject(className, obj)); + addInterTypeDecl(className, obj); } public Collection<ClassBodyObject> TypeDecl.classBodyDecls = new LinkedHashSet<ClassBodyObject>(); diff --git a/src/java/org/jastadd/JastAdd.java b/src/java/org/jastadd/JastAdd.java index bb0cc2e8274c18dbabdb39e3f56b267267946f19..ce550654a38457ab2608e8262edb3e7143b269b4 100644 --- a/src/java/org/jastadd/JastAdd.java +++ b/src/java/org/jastadd/JastAdd.java @@ -40,6 +40,7 @@ import java.io.StringReader; import java.io.StringWriter; import java.util.Collection; import java.util.LinkedList; +import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.Scanner; @@ -51,12 +52,12 @@ import org.jastadd.ast.AST.Component; import org.jastadd.ast.AST.Grammar; import org.jastadd.ast.AST.InhDecl; import org.jastadd.ast.AST.InhEq; -import org.jastadd.ast.AST.InterTypeObject; import org.jastadd.ast.AST.List; import org.jastadd.ast.AST.SynDecl; import org.jastadd.ast.AST.SynEq; import org.jastadd.ast.AST.TokenComponent; import org.jastadd.ast.AST.TypeDecl; +import org.jastadd.jrag.ClassBodyObject; import org.jastadd.jrag.AST.ASTCompilationUnit; import org.jastadd.jrag.AST.JragParser; import org.jastadd.jrag.AST.TokenMgrError; @@ -297,20 +298,23 @@ public class JastAdd { protected static Collection<Problem> weaveInterTypeObjects(Grammar grammar) { Collection<Problem> problems = new LinkedList<Problem>(); - for (InterTypeObject object : grammar.interTypeObjects) { - TypeDecl clazz = grammar.lookup(object.className); - if (clazz != null) { - clazz.classBodyDecls.add(object.classBodyObject); - } else { - problems.add(Problem.builder() - .message("can not add member to unknown class %s", object.className) - .sourceFile(object.classBodyObject.fileName) - .sourceLine(object.classBodyObject.line) - .buildError()); + for (Map.Entry<String, Collection<ClassBodyObject>> entry : grammar.interTypeDecls.entrySet()) { + String className = entry.getKey(); + TypeDecl clazz = grammar.lookup(className); + for (ClassBodyObject decl : entry.getValue()) { + if (clazz != null) { + clazz.classBodyDecls.add(decl); + } else { + problems.add(Problem.builder() + .message("can not add member to unknown class %s", className) + .sourceFile(decl.fileName) + .sourceLine(decl.line) + .buildError()); + } } } // TODO(jesper): Remove the below line. - grammar.interTypeObjects.clear(); // Reset to avoid double weaving. + grammar.interTypeDecls.clear(); // Reset to avoid double weaving. return problems; }