blob: 0ea713a54826a0e51b10945b7ddf57d39d914675 [file] [log] [blame]
/*
* Copyright (c) 2005,2008 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
* Artem Tikhomirov (Borland) - Migration to OCL expressions
*/
package org.eclipse.gmf.internal.xpand.ast;
import java.util.Set;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.gmf.internal.xpand.expression.ast.SyntaxElement;
import org.eclipse.gmf.internal.xpand.model.AnalysationIssue;
import org.eclipse.gmf.internal.xpand.model.ExecutionContext;
import org.eclipse.gmf.internal.xpand.model.Variable;
import org.eclipse.gmf.internal.xpand.model.XpandAnalyzable;
import org.eclipse.gmf.internal.xpand.model.XpandEvaluatable;
import org.eclipse.gmf.internal.xpand.ocl.DeclaredParameter;
import org.eclipse.gmf.internal.xpand.ocl.TypeHelper;
import org.eclipse.ocl.cst.TypeCS;
public abstract class AbstractDefinition extends SyntaxElement implements XpandAnalyzable, XpandEvaluatable {
protected final TypeHelper type;
protected final DeclaredParameter[] params;
private final Statement[] body;
protected Template owner = null;
public AbstractDefinition(final int start, final int end, final int line, final TypeCS type, final DeclaredParameter[] params, final Statement[] body) {
super(start, end, line);
this.type = new TypeHelper(type);
this.params = params;
this.body = body;
}
/**
* FIXME used only in tests, should I keep it?
*/
public Statement[] getBody() {
return body;
}
public void setOwner(final Template owner) {
this.owner = owner;
}
public void analyze(ExecutionContext ctx, final Set<AnalysationIssue> issues) {
final EClassifier thisType = type.getTypeForName(ctx);
if (thisType == null) {
issues.add(new AnalysationIssue(AnalysationIssue.Type.TYPE_NOT_FOUND, "Couldn't find " + type.getName(), this));
}
ctx = ctx.cloneWithVariable(new Variable(ExecutionContext.IMPLICIT_VARIABLE, thisType, null));
Variable[] vars = new Variable[params.length];
for (int i = 0; i < params.length; i++) {
EClassifier paramType = params[i].getTypeForName(ctx);
if (paramType == null) {
issues.add(new AnalysationIssue(AnalysationIssue.Type.TYPE_NOT_FOUND, "Couldn't find "
+ params[i].getTypeName(), this /* FIXME: was: params[i].getType()*/));
paramType = EcorePackage.eINSTANCE.getEObject();
}
final String name = params[i].getVarName();
vars[i] = new Variable(name, paramType, null);
}
ctx = ctx.cloneWithVariable(vars);
for (int i = 0; i < body.length; i++) {
body[i].analyze(ctx, issues);
}
}
public void evaluate(ExecutionContext ctx) {
ctx = ctx.cloneWithResource(owner);
for (int i = 0; i < body.length; i++) {
body[i].evaluate(ctx);
}
}
public TypeHelper getType() {
return type;
}
public DeclaredParameter[] getParemeters() {
return params;
}
}