blob: 99298759afdece61b005feaa46470efef0bcb97c [file] [log] [blame]
/**
* Copyright (c) 2008 Borland Software Corp.
*
* 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:
* Alexander Shatalin (Borland) - initial API and implementation
*/
package org.eclipse.gmf.internal.xpand.migration;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.gmf.internal.xpand.ast.AbstractDefinition;
import org.eclipse.gmf.internal.xpand.ast.ErrorStatement;
import org.eclipse.gmf.internal.xpand.ast.ExpandStatement;
import org.eclipse.gmf.internal.xpand.ast.ExpressionStatement;
import org.eclipse.gmf.internal.xpand.ast.FileStatement;
import org.eclipse.gmf.internal.xpand.ast.ForEachStatement;
import org.eclipse.gmf.internal.xpand.ast.IfStatement;
import org.eclipse.gmf.internal.xpand.ast.LetStatement;
import org.eclipse.gmf.internal.xpand.ast.Statement;
import org.eclipse.gmf.internal.xpand.expression.ast.BooleanOperation;
import org.eclipse.gmf.internal.xpand.expression.ast.Case;
import org.eclipse.gmf.internal.xpand.expression.ast.Cast;
import org.eclipse.gmf.internal.xpand.expression.ast.ChainExpression;
import org.eclipse.gmf.internal.xpand.expression.ast.CollectionExpression;
import org.eclipse.gmf.internal.xpand.expression.ast.DeclaredParameter;
import org.eclipse.gmf.internal.xpand.expression.ast.Expression;
import org.eclipse.gmf.internal.xpand.expression.ast.FeatureCall;
import org.eclipse.gmf.internal.xpand.expression.ast.IfExpression;
import org.eclipse.gmf.internal.xpand.expression.ast.LetExpression;
import org.eclipse.gmf.internal.xpand.expression.ast.ListLiteral;
import org.eclipse.gmf.internal.xpand.expression.ast.OperationCall;
import org.eclipse.gmf.internal.xpand.expression.ast.SwitchExpression;
import org.eclipse.gmf.internal.xpand.expression.ast.TypeSelectExpression;
import org.eclipse.gmf.internal.xpand.xtend.ast.ExpressionExtensionStatement;
import org.eclipse.gmf.internal.xpand.xtend.ast.Extension;
public class VariableNameDispatcher {
private static final String ITERATOR_PREFIX = "it";
private static final String VARIABLE_PREFIX = "tmpVar";
private Set<String> definedVariables = new HashSet<String>();
public VariableNameDispatcher() {
}
public VariableNameDispatcher(Extension extension) {
initDefinedVariables(extension);
}
public VariableNameDispatcher(AbstractDefinition definition) {
initDefinedVariables(definition);
}
private void initDefinedVariables(AbstractDefinition definition) {
for (DeclaredParameter parameter : definition.getParams()) {
definedVariables.add(parameter.getName().getValue());
}
for (Statement statement : definition.getBody()) {
initDefinedVariables(statement);
}
}
private void initDefinedVariables(Statement statement) {
if (statement instanceof ExpressionStatement) {
ExpressionStatement expressionStatement = (ExpressionStatement) statement;
initDefinedVariables(expressionStatement.getExpression());
} else if (statement instanceof ErrorStatement) {
ErrorStatement errorStatement = (ErrorStatement) statement;
initDefinedVariables(errorStatement.getMessage());
} else if (statement instanceof ExpandStatement) {
ExpandStatement expandStatement = (ExpandStatement) statement;
for (Expression parameter : expandStatement.getParameters()) {
initDefinedVariables(parameter);
}
if (expandStatement.getTarget() != null) {
initDefinedVariables(expandStatement.getTarget());
}
if (expandStatement.getSeparator() != null) {
initDefinedVariables(expandStatement.getSeparator());
}
} else if (statement instanceof FileStatement) {
FileStatement fileStatement = (FileStatement) statement;
initDefinedVariables(fileStatement.getTargetFileName());
for (Statement bodyStatement : fileStatement.getBody()) {
initDefinedVariables(bodyStatement);
}
} else if (statement instanceof ForEachStatement) {
ForEachStatement forEach = (ForEachStatement) statement;
initDefinedVariables(forEach.getTarget());
if (forEach.getSeparator() != null) {
initDefinedVariables(forEach.getSeparator());
}
for (Statement bodyStatement : forEach.getBody()) {
initDefinedVariables(bodyStatement);
}
} else if (statement instanceof IfStatement) {
IfStatement ifStatement = (IfStatement) statement;
if (ifStatement.getCondition() != null) {
initDefinedVariables(ifStatement.getCondition());
}
for (Statement thenStatement : ifStatement.getThenPart()) {
initDefinedVariables(thenStatement);
}
if (ifStatement.getElseIf() != null) {
initDefinedVariables(ifStatement.getElseIf());
}
} else if (statement instanceof LetStatement) {
LetStatement letStatement = (LetStatement) statement;
initDefinedVariables(letStatement.getVarValue());
for (Statement bodyStatement : letStatement.getBody()) {
initDefinedVariables(bodyStatement);
}
}
}
private void initDefinedVariables(Extension extension) {
for (String parameterName : extension.getParameterNames()) {
definedVariables.add(parameterName);
}
if (extension instanceof ExpressionExtensionStatement) {
initDefinedVariables(((ExpressionExtensionStatement) extension).getExpression());
}
}
private void initDefinedVariables(Expression expression) {
if (expression instanceof BooleanOperation) {
BooleanOperation booleanOperation = (BooleanOperation) expression;
initDefinedVariables(booleanOperation.getLeft());
initDefinedVariables(booleanOperation.getRight());
} else if (expression instanceof Cast) {
Cast cast = (Cast) expression;
initDefinedVariables(cast.getTarget());
} else if (expression instanceof ChainExpression) {
ChainExpression chainExpression = (ChainExpression) expression;
initDefinedVariables(chainExpression.getFirst());
initDefinedVariables(chainExpression.getNext());
} else if (expression instanceof CollectionExpression) {
CollectionExpression collectionExpression = (CollectionExpression) expression;
initDefinedVariables(collectionExpression.getClosure());
initDefinedVariablesOfTarget(collectionExpression);
definedVariables.add(collectionExpression.getElementName());
} else if (expression instanceof OperationCall) {
OperationCall operationCall = (OperationCall) expression;
initDefinedVariablesOfTarget(operationCall);
for (int i = 0; i < operationCall.getParams().length; i++) {
initDefinedVariables(operationCall.getParams()[i]);
}
} else if (expression instanceof TypeSelectExpression) {
TypeSelectExpression typeSelect = (TypeSelectExpression) expression;
initDefinedVariablesOfTarget(typeSelect);
} else if (expression instanceof FeatureCall) {
FeatureCall featureCall = (FeatureCall) expression;
initDefinedVariablesOfTarget(featureCall);
} else if (expression instanceof IfExpression) {
IfExpression ifExpression = (IfExpression) expression;
initDefinedVariables(ifExpression.getCondition());
initDefinedVariables(ifExpression.getThenPart());
initDefinedVariables(ifExpression.getElsePart());
} else if (expression instanceof LetExpression) {
LetExpression letExpression = (LetExpression) expression;
initDefinedVariables(letExpression.getVarExpression());
initDefinedVariables(letExpression.getTargetExpression());
definedVariables.add(letExpression.getVarName().getValue());
} else if (expression instanceof ListLiteral) {
ListLiteral listLiteral = (ListLiteral) expression;
for (int i = 0; i < listLiteral.getElements().length; i++) {
initDefinedVariables(listLiteral.getElements()[i]);
}
} else if (expression instanceof SwitchExpression) {
SwitchExpression switchExpression = (SwitchExpression) expression;
initDefinedVariables(switchExpression.getSwitchExpr());
initDefinedVariables(switchExpression.getDefaultExpr());
for (Case caseExpresion : switchExpression.getCases()) {
initDefinedVariables(caseExpresion.getCondition());
initDefinedVariables(caseExpresion.getThenPart());
}
}
}
private void initDefinedVariablesOfTarget(FeatureCall featrueCall) {
if (featrueCall.getTarget() != null) {
initDefinedVariables(featrueCall.getTarget());
}
}
public String getNextIteratorName() {
return getUniqueName(ITERATOR_PREFIX);
}
public String getNextVariableName() {
return getUniqueName(VARIABLE_PREFIX);
}
private String getUniqueName(String prefix) {
String iteratorName = prefix;
for (int i = 1; definedVariables.contains(iteratorName); i++) {
iteratorName = prefix + "_" + i;
}
definedVariables.add(iteratorName);
return iteratorName;
}
}