/******************************************************************************* * Copyright (c) 2007, 2008 Edgar Espina. * 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 * *******************************************************************************/ package org.deved.antlride.internal.core.model; import java.util.Collection; import org.deved.antlride.core.model.ElementKind; import org.deved.antlride.core.model.IBlock; import org.deved.antlride.core.model.IGrammar; import org.deved.antlride.core.model.IModelElement; import org.deved.antlride.core.model.IOption; import org.deved.antlride.core.model.IOptions; import org.deved.antlride.core.model.IRule; import org.deved.antlride.core.model.ast.IModelElementVisitor; import org.deved.antlride.core.model.dltk.ast.DASTOption; import org.deved.antlride.core.model.dltk.ast.DASTOptions; import org.eclipse.dltk.ast.ASTNode; public class AOptions extends AAbstractModelElement implements IOptions { private static final IOption[] EMPTY_OPTIONS = new IOption[0]; private IOption[] options; private DASTOptions node; public AOptions(int sourceStart, int sourceEnd, int lineStart, int lineEnd) { super(sourceStart, sourceEnd); } private DASTOptions getAST() { if (node == null) { IOption[] optionsArray = getOptions(); DASTOption[] optionsAST = new DASTOption[optionsArray.length]; for (int i = 0; i < optionsArray.length; i++) { optionsAST[i] = optionsArray[i].getAST(); } node = new DASTOptions(getElementKind().ordinal(), sourceStart(), sourceEnd(), optionsAST); } return node; } public int length() { return options == null ? 0 : options.length; } public <E> E getAdapter(Class<E> adapter) { if (adapter == IOptions.class) return adapter.cast(this); if (adapter == ASTNode.class) return adapter.cast(getAST()); ElementKind kind = getElementKind(); switch (kind) { case GRAMMAR_OPTIONS: if (adapter == IGrammar.class) return adapter.cast(getParent()); break; case RULE_OPTIONS: if (adapter == IGrammar.class) return adapter.cast(getParent().getParent()); if (adapter == IRule.class) return adapter.cast(getParent()); break; case BLOCK_OPTIONS: if (adapter == IGrammar.class) return adapter.cast(((IBlock) getParent()).getEnclosingRule() .getParent()); if (adapter == IRule.class) return adapter.cast(((IBlock) getParent()).getEnclosingRule()); if (adapter == IBlock.class) return adapter.cast(getParent()); break; } return null; } public ElementKind getElementKind() { IModelElement parent = getParent(); ElementKind kind = parent.getElementKind(); switch (kind) { case GRAMMAR: return ElementKind.GRAMMAR_OPTIONS; case RULE: return ElementKind.RULE_OPTIONS; } return ElementKind.BLOCK_OPTIONS; } public String getElementName() { return "<options>"; } public IOption findOption(String name) { for (int i = 0; i < options.length; i++) { IOption option = options[i]; if (option.getName().getText().equals(name)) { return option; } } return null; } public IOption[] getOptions() { return this.options; } public void setOptions(Collection<IOption> options) { if (options == null || options.size() == 0) { this.options = EMPTY_OPTIONS; } else { this.options = new IOption[options.size()]; this.options = options.toArray(this.options); for (IOption option : options) { ((AOption) option).setParent(this); } } } public void traverse(IModelElementVisitor visitor) { ElementKind kind = getElementKind(); switch (kind) { case GRAMMAR_OPTIONS: { if (visitor.visitGrammarOptions(this)) { for (int i = 0; i < options.length; i++) { options[i].traverse(visitor); } visitor.endvisitGrammarOptions(this); } } break; case RULE_OPTIONS: { if (visitor.visitRuleOptions(this)) { for (int i = 0; i < options.length; i++) { options[i].traverse(visitor); } visitor.endvisitRuleOptions(this); } } break; case BLOCK_OPTIONS: { if (visitor.visitBlockOptions(this)) { for (int i = 0; i < options.length; i++) { options[i].traverse(visitor); } visitor.endvisitBlockOptions(this); } } break; } } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("options {"); String separator; if (parent.getElementKind() != ElementKind.BLOCK) { separator = "\n"; } else { separator = " "; } builder.append(separator); for (int i = 0; i < options.length; i++) { builder.append(options[i]); builder.append(";"); builder.append(separator); } builder.append("}"); builder.append(separator); return builder.toString(); } }