/*******************************************************************************
* 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 org.deved.antlride.core.model.ASTSuffix;
import org.deved.antlride.core.model.ElementKind;
import org.deved.antlride.core.model.ICallExpression;
import org.deved.antlride.core.model.ICallExpressionOption;
import org.deved.antlride.core.model.IGrammar;
import org.deved.antlride.core.model.IModelElement;
import org.deved.antlride.core.model.IParameters;
import org.deved.antlride.core.model.IRule;
import org.deved.antlride.core.model.ISourceElement;
import org.deved.antlride.core.model.ast.IModelElementVisitor;
import org.deved.antlride.core.model.dltk.ast.DASTCallExpression;
import org.eclipse.dltk.ast.ASTNode;
import org.eclipse.dltk.ast.expressions.CallArgumentsList;
public class ACallExpression extends AStatement implements ICallExpression {
private IParameters parameters;
private ISourceElement ruleName;
private boolean label;
private ASTSuffix astSuffix;
private DASTCallExpression callExpressionNode;
private ICallExpressionOption[] options;
public ACallExpression(ISourceElement ruleName, ASTSuffix astSuffix,
boolean label) {
super(label ? ruleName.sourceStart() + 1 : ruleName.sourceStart(),
label ? ruleName.sourceEnd() + 1 : ruleName.sourceEnd());
this.ruleName = ruleName;
this.label = label;
this.astSuffix = astSuffix;
}
public ACallExpression() {
label = false;
astSuffix = ASTSuffix.NONE;
}
public void setLabel(boolean label) {
this.label = label;
adjustPositions();
}
public void setRuleName(ISourceElement ruleName) {
this.ruleName = ruleName;
adjustPositions();
}
private void adjustPositions() {
if (ruleName != null) {
int start = ruleName.sourceStart();
int end = ruleName.sourceEnd();
if (label) {
start++;
end++;
}
setSourceStart(start);
setSourceEnd(end);
}
}
public <E> E getAdapter(Class<E> adapter) {
if (adapter == ICallExpression.class)
return adapter.cast(this);
if (adapter == IRule.class)
return adapter.cast(getEnclosingRule());
if (adapter == IParameters.class)
return adapter.cast(parameters);
if (adapter == IGrammar.class)
return adapter.cast(getEnclosingRule().getParent());
if (adapter == ASTNode.class)
return adapter.cast(getAST());
return null;
}
public ICallExpressionOption[] getOptions() {
return options;
}
public void setOptions(ICallExpressionOption[] options) {
this.options = options;
for (ICallExpressionOption option : options) {
((AStatement) option).setParent(this);
}
}
private ASTNode getAST() {
if (callExpressionNode == null) {
CallArgumentsList argumentsList = null;
if (parameters != null) {
argumentsList = new CallArgumentsList(parameters.sourceStart(),
parameters.sourceEnd());
for (int i = 0; i < parameters.getParametersCount(); i++) {
argumentsList.addNode(parameters.getParemeter(i)
.getAdapter(ASTNode.class));
}
}
callExpressionNode = new DASTCallExpression(getElementName(),
sourceStart(), sourceEnd(), argumentsList);
}
return callExpressionNode;
}
public ASTSuffix getAstSuffix() {
return astSuffix;
}
public ElementKind getElementKind() {
return ElementKind.CALL;
}
public String getElementName() {
return ruleName.getText();
}
public IParameters getParameters() {
return parameters;
}
public ISourceElement getRuleName() {
return ruleName;
}
public String[] getProperties() {
if (isStringLiteralCall()) {
return IRule.PREDEFINED_LEXER_RULE_PROPERTIES;
}
return null;
}
public boolean isStringLiteralCall() {
String ruleName = getElementName();
if (ruleName.charAt(0) == '\'' || ruleName.charAt(0) == '\"')
return true;
return false;
}
public boolean isLexerRuleCall() {
String ruleName = getElementName();
if (Character.isUpperCase(ruleName.charAt(0)))
return true;
return false;
}
public boolean hasLabel() {
return label;
}
public boolean hasParameters() {
return parameters != null && parameters.getParametersCount() > 0;
}
public void setAstSuffix(ASTSuffix astSuffix) {
this.astSuffix = astSuffix;
}
public void setParameters(IParameters parameters) {
this.parameters = parameters;
}
@Override
public void setParent(IModelElement parent) {
super.setParent(parent);
if (parameters != null)
((AParameters) parameters).setParent(this);
}
public void traverse(IModelElementVisitor visitor) {
if (visitor.visitCallExpression(this)) {
if (parameters != null) {
parameters.traverse(visitor);
}
visitor.endvisitCallExpression(this);
}
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
if (hasLabel())
builder.append("$");
builder.append(ruleName.getText());
builder.append(getEbnfOperator().description());
if (parameters != null) {
builder.append(parameters);
}
if (astSuffix != ASTSuffix.NONE) {
builder.append(astSuffix.description());
}
return builder.toString();
}
}