/*
* <copyright>
*
* Copyright (c) 2005-2006 Sven Efftinge 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:
* Sven Efftinge - Initial API and implementation
*
* </copyright>
*/
package org.eclipse.gmf.internal.xpand.expression.ast;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.gmf.internal.xpand.BuiltinMetaModel;
import org.eclipse.gmf.internal.xpand.expression.AnalysationIssue;
import org.eclipse.gmf.internal.xpand.expression.ExecutionContext;
/**
* @author Sven Efftinge
* @author Arno Haase
*/
public class SwitchExpression extends Expression {
private Expression switchExpr = null;
private Expression defaultExpr = null;
private List<Case> cases = null;
public SwitchExpression(final int start, final int end, final int line, final int startOffset, final int endOffset, final Expression switchExpr,
final List<Case> cases, final Expression defaultExpr) {
super(start, end, line, startOffset, endOffset);
this.switchExpr = switchExpr;
this.cases = cases;
this.defaultExpr = defaultExpr;
}
@Override
protected Object evaluateInternal(final ExecutionContext ctx) {
Object switchVal = Boolean.TRUE;
if (switchExpr != null) {
switchVal = switchExpr.evaluate(ctx);
}
for (Case c : cases) {
final Object caseCondVal = c.getCondition().evaluate(ctx);
if (((switchVal != null) && switchVal.equals(caseCondVal)) || (switchVal == caseCondVal)) {
return c.getThenPart().evaluate(ctx);
}
}
return defaultExpr.evaluate(ctx);
}
public EClassifier analyze(final ExecutionContext ctx, final Set<AnalysationIssue> issues) {
EClassifier condEClassifier = EcorePackage.eINSTANCE.getEBoolean();
if (switchExpr != null) {
condEClassifier = switchExpr.analyze(ctx, issues);
}
if (condEClassifier == null) {
return null;
}
EClassifier returnEClassifier = defaultExpr.analyze(ctx, issues);
if (returnEClassifier == null) {
return null;
}
for (Case c : cases) {
final EClassifier caseCondEClassifier = c.getCondition().analyze(ctx, issues);
if (caseCondEClassifier != null) {
if (!BuiltinMetaModel.isAssignableFrom(condEClassifier, caseCondEClassifier)) {
issues.add(new AnalysationIssue(AnalysationIssue.Type.INCOMPATIBLE_TYPES, condEClassifier.getName()
+ " expected!", c.getCondition()));
}
}
final EClassifier caseThenEClassifier = c.getThenPart().analyze(ctx, issues);
if (caseThenEClassifier != null) {
if (!BuiltinMetaModel.isAssignableFrom(returnEClassifier, caseThenEClassifier)) {
if (BuiltinMetaModel.isAssignableFrom(caseThenEClassifier, returnEClassifier)) {
returnEClassifier = caseThenEClassifier;
} else {
returnEClassifier = EcorePackage.eINSTANCE.getEJavaObject();
}
}
}
}
return returnEClassifier;
}
public List<Case> getCases() {
if (cases == null) {
return Collections.emptyList();
}
return cases;
}
public Expression getDefaultExpr() {
return defaultExpr;
}
public Expression getSwitchExpr() {
return switchExpr;
}
}