/******************************************************************************* * Copyright (c) 2002, 2017 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * xored software, Inc. - initial API and Implementation *******************************************************************************/ package org.eclipse.dltk.ast.declarations; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.dltk.ast.ASTNode; import org.eclipse.dltk.ast.ASTVisitor; import org.eclipse.dltk.ast.parser.IModuleDeclaration; import org.eclipse.dltk.ast.statements.Block; import org.eclipse.dltk.ast.statements.Statement; import org.eclipse.dltk.ast.utils.ASTUtil; import org.eclipse.dltk.internal.compiler.lookup.SourceModuleScope; import org.eclipse.dltk.utils.CorePrinter; public class ModuleDeclaration extends ASTNode implements IModuleDeclaration { private List types; private List functions; protected List variables; private Block body; private boolean rebuildEnabled; // TODO: make private public SourceModuleScope scope; public List getTypeList() { return this.types; } public List getFunctionList() { return this.functions; } public List getVariablesList() { return this.variables; } public ModuleDeclaration(int sourceLength) { this(sourceLength, false); } public ModuleDeclaration(int sourceLength, boolean rebuildEnabled) { super(0, sourceLength); this.body = new Block(); this.body.setEnd(sourceLength); this.types = new ArrayList(); this.functions = new ArrayList(); this.variables = new ArrayList(); this.rebuildEnabled = rebuildEnabled; } @Override public final void traverse(ASTVisitor visitor) throws Exception { if (visitor.visit(this)) { this.body.traverse(visitor); visitor.endvisit(this); } } public void setStatements(List<ASTNode> statements) { this.body = new Block(this.sourceStart(), this.sourceEnd(), statements); } public void addStatement(ASTNode statement) { this.body.addStatement(statement); } public List<ASTNode> getStatements() { return this.body.getStatements(); } @Override public void printNode(CorePrinter output) { output.formatPrintLn("Module" + this.getSourceRange().toString() + ":"); //$NON-NLS-1$ //$NON-NLS-2$ this.body.printNode(output); } public boolean isEmpty() { return this.body.getStatements().isEmpty(); } protected void doRebuild() { // Iterator i = this.getStatements().iterator(); // while( i.hasNext()) { // ASTNode node = (ASTNode)i.next(); // if( node instanceof MethodDeclaration ) { // this.functions.add( node ); // } // else if( node instanceof TypeDeclaration ) { // this.types.add(node); // } // } } public final void rebuild() { if (this.rebuildEnabled) { this.doRebuild(); } } protected boolean isRebuildEnabled() { return this.rebuildEnabled; } public void disableRebuild() { this.rebuildEnabled = false; } public TypeDeclaration[] getTypes() { return ASTUtil.getTypes(this.getStatements(), this.types); } public MethodDeclaration[] getFunctions() { return ASTUtil.getMethods(this.getStatements(), this.functions); } public FieldDeclaration[] getVariables() { return ASTUtil.getVariables(this.getStatements(), this.variables ); } public ASTNode[] getNonTypeOrMethodNode() { List<ASTNode> statements = this.getStatements(); List<ASTNode> results = new ArrayList<>(); if (statements != null) { Iterator<ASTNode> it = statements.iterator(); while (it.hasNext()) { ASTNode node = it.next(); if (!(node instanceof TypeDeclaration) && !(node instanceof MethodDeclaration)) { results.add(node); } } } return results.toArray(new ASTNode[results.size()]); } @Override public void setEnd(int end) { super.setEnd(end); this.body.setEnd(end); } @Override public void setStart(int start) { super.setStart(start); this.body.setStart(start); } public void rebuildMethods() { } public void removeStatement(Statement node) { this.body.removeStatement(node); } }