/******************************************************************************* * 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.List; import org.deved.antlride.core.model.ElementKind; import org.deved.antlride.core.model.IGrammar; import org.deved.antlride.core.model.IRule; import org.deved.antlride.core.model.ISourceElement; import org.deved.antlride.core.model.ITargetAction; import org.deved.antlride.core.model.ITemplate; import org.deved.antlride.core.model.ITemplateParameter; import org.deved.antlride.core.model.ast.IModelElementVisitor; public class ATemplate extends AStatement implements ITemplate { private ISourceElement name; private final static ITemplateParameter[] EMPTY_PARAMETERS = new ITemplateParameter[0]; private ITemplateParameter[] parameters = EMPTY_PARAMETERS; private ISourceElement inlineTemplate; private ATargetAction action; private boolean simpleActionTemplate; public ATemplate() { } public ITargetAction getAction() { return action; } public ISourceElement getName() { return name; } public boolean isInline() { return inlineTemplate != null; } public void setName(ISourceElement name) { this.name = name; } public void setAction(ISourceElement action) { this.action = new ATargetAction(this, action); } public <E> E getAdapter(Class<E> adapter) { if (adapter == ITemplate.class) return adapter.cast(this); if (adapter == IRule.class) return adapter.cast(getEnclosingRule()); if (adapter == IGrammar.class) return adapter.cast(getEnclosingRule().getParent()); return null; } public ISourceElement getInlineTemplate() { return inlineTemplate; } public boolean hasParameters() { return parameters != null && parameters.length > 0; } public ITemplateParameter[] getParameters() { return parameters; } public ElementKind getElementKind() { return ElementKind.TEMPLATE; } public String getElementName() { if (name != null) { return name.getText(); } return "unamedTemplate"; } public boolean isNamed() { return name != null; } public void traverse(IModelElementVisitor visitor) { if (visitor.visitTemplate(this)) { if (hasParameters()) { for (int i = 0; i < parameters.length; i++) { parameters[i].traverse(visitor); } } visitor.endvisitTemplate(this); } } public void setParameters(List<ITemplateParameter> parameters) { if (parameters != null && parameters.size() > 0) { this.parameters = new ITemplateParameter[parameters.size()]; this.parameters = parameters.toArray(this.parameters); for (ITemplateParameter templateParameter : parameters) { ((AAbstractModelElement) templateParameter).setParent(this); } } } public void setInlineTemplate(ISourceElement inlineTemplate) { this.inlineTemplate = inlineTemplate; } @Override public String toString() { StringBuilder builder = new StringBuilder(); if (name != null) { builder.append(name.getText()); } if (action != null) { if (isSimpleActionTemplate()) { builder.append(action); } else { builder.append("(").append(action).append(")"); } } if(!isSimpleActionTemplate()) { builder.append('('); } if (hasParameters()) { for (int i = 0; i < parameters.length - 1; i++) { builder.append(parameters[i]); builder.append(", "); } builder.append(parameters[parameters.length - 1]); } if(!isSimpleActionTemplate()) { builder.append(')'); } if (isInline()) { builder.append("\n"); builder.append(inlineTemplate.getText()); } return builder.toString(); } public boolean isSimpleActionTemplate() { return simpleActionTemplate; } public void setSimpleActionTemplate(boolean simpleActionTemplate) { this.simpleActionTemplate = simpleActionTemplate; } }