package ${package}.symboltable; import java.util.ArrayList; import java.util.Optional; import ${package}.mydsl._ast.ASTMyElement; import ${package}.mydsl._ast.ASTMyField; import ${package}.mydsl._ast.ASTMyModel; import ${package}.mydsl._visitor.MyDSLVisitor; import de.monticore.symboltable.ArtifactScope; import de.monticore.symboltable.CommonSymbolTableCreator; import de.monticore.symboltable.MutableScope; import de.monticore.symboltable.ResolvingConfiguration; import de.monticore.symboltable.Scope; import de.se_rwth.commons.logging.Log; public class MyDSLSymbolTableCreator extends CommonSymbolTableCreator implements MyDSLVisitor { public MyDSLSymbolTableCreator( final ResolvingConfiguration resolvingConfig, final MutableScope enclosingScope) { super(resolvingConfig, enclosingScope); } /** * Creates the symbol table starting from the <code>rootNode</code> and * returns the first scope that was created. * * @param rootNode the root node * @return the first scope that was created */ public Scope createFromAST(ASTMyModel rootNode) { Log.errorIfNull(rootNode); rootNode.accept(this); return getFirstCreatedScope(); } @Override public void visit(final ASTMyModel myModelNode) { final ArtifactScope artifactScope = new ArtifactScope(Optional.empty(), "", new ArrayList<>()); putOnStack(artifactScope); final MyModelSymbol myModel = new MyModelSymbol(myModelNode.getName()); putInScopeAndLinkWithAst(myModel, myModelNode); } @Override public void endVisit(final ASTMyModel myModelNode) { removeCurrentScope(); } @Override public void visit(final ASTMyElement myElementNode) { final MyElementSymbol myElementSymbol = new MyElementSymbol(myElementNode.getName()); putInScopeAndLinkWithAst(myElementSymbol, myElementNode); } @Override public void visit(final ASTMyField myFieldNode) { final MyElementSymbolReference type = new MyElementSymbolReference(myFieldNode.getType(), currentScope().get()); final MyFieldSymbol myFieldSymbol = new MyFieldSymbol(myFieldNode.getName(), type); putInScopeAndLinkWithAst(myFieldSymbol, myFieldNode); } }