Skip to content

Commit 336f945

Browse files
committed
improved atl-ocl support (close #172)
1 parent 9492912 commit 336f945

File tree

2 files changed

+53
-3
lines changed

2 files changed

+53
-3
lines changed

plugins/pt.uminho.haslab.echo/src/pt/uminho/haslab/echo/engine/OCLTranslator.java

+6
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,8 @@ INode translate(OperationCallExp expr) throws EchoError {
331331
res = ((IFormula) src).not();
332332
else if (expr.getReferredOperation().getName().equals("isEmpty"))
333333
res = ((IExpression) src).no();
334+
else if (expr.getReferredOperation().getName().equals("notEmpty"))
335+
res = ((IExpression) src).some();
334336
else if (expr.getReferredOperation().getName().equals("size")) {
335337
EchoReporter.getInstance().warning(
336338
"Integer operators (size) require suitable bitwidths.",
@@ -423,6 +425,10 @@ else if (expr.getReferredOperation().getName().equals("-"))
423425
.getArgument().get(0)));
424426
else if (expr.getReferredOperation().getName().equals("allInstances"))
425427
res = src;
428+
else if (expr.getReferredOperation().getName().equals("oclIsKindOf"))
429+
res = ((IExpression) src).in(translateExpression(expr.getArgument().get(0)));
430+
else if (expr.getReferredOperation().getName().equals("oclAsType"))
431+
res = ((IExpression) src);
426432
else if (expr.getReferredOperation().getName().equals("oclIsNew")) {
427433
EObject container = expr.eContainer();
428434
while (!(container instanceof IteratorExp) && container != null)

plugins/pt.uminho.haslab.echo/src/pt/uminho/haslab/echo/engine/alloy/ATLOCLTranslator.java

+47-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import pt.uminho.haslab.echo.EchoError;
1313
import pt.uminho.haslab.echo.EchoOptionsSetup;
1414
import pt.uminho.haslab.echo.EchoReporter;
15+
import pt.uminho.haslab.echo.EchoTypeError;
1516
import pt.uminho.haslab.echo.ErrorTransform;
1617
import pt.uminho.haslab.echo.ErrorUnsupported;
1718
import pt.uminho.haslab.echo.engine.EchoHelper;
@@ -53,13 +54,31 @@ public INode translateAtlOcl(EObject expr) throws EchoError {
5354
return translateAtlOclBooleanLit(expr);
5455
} else if (expr.eClass().getName().equals("Binding")) {
5556
return translateAtlOclBinding(expr);
57+
} else if (expr.eClass().getName().equals("IfExp")) {
58+
return translateAtlOclIf(expr);
5659
} else if (expr.eClass().getName().equals("IteratorExp")) {
5760
return translateAtlOclIterator(expr);
5861
} else
5962
throw new ErrorUnsupported("OCL expression not supported: " + expr
6063
+ ".");
6164
}
6265

66+
private INode translateAtlOclIf(EObject expr) throws EchoError {
67+
EStructuralFeature x = expr.eClass().getEStructuralFeature("condition");
68+
IFormula eif = (IFormula) translateAtlOcl((EObject) expr.eGet(x));
69+
x = expr.eClass().getEStructuralFeature("thenExpression");
70+
INode thenExpr = translateAtlOcl((EObject) expr.eGet(x));
71+
x = expr.eClass().getEStructuralFeature("elseExpression");
72+
INode elseExpr = translateAtlOcl((EObject) expr.eGet(x));
73+
74+
if (thenExpr instanceof IExpression && elseExpr instanceof IExpression)
75+
return eif.thenElse((IExpression) thenExpr,(IExpression) elseExpr);
76+
else if (thenExpr instanceof IFormula && elseExpr instanceof IFormula)
77+
return (IFormula) eif.thenElse((IFormula) thenExpr,(IFormula) elseExpr);
78+
79+
throw new EchoTypeError("Expression: "+expr.getClass());
80+
}
81+
6382
IExpression translateAtlOclVariable(EObject expr) {
6483
EStructuralFeature x = expr.eClass().getEStructuralFeature(
6584
"referredVariable");
@@ -184,6 +203,8 @@ INode translateAtlOclOperationCall(EObject expr) throws EchoError {
184203
res = ((IFormula) src).not();
185204
else if (operatorname.equals("isEmpty"))
186205
res = ((IExpression) src).no();
206+
else if (operatorname.equals("notEmpty"))
207+
res = ((IExpression) src).some();
187208
else if (operatorname.equals("size"))
188209
res = ((IExpression) src).cardinality();
189210
else if (operatorname.equals("=")) {
@@ -232,22 +253,45 @@ else if (operatorname.equals(">="))
232253
else if (operatorname.equals("union"))
233254
res = ((IExpression) src)
234255
.union((IExpression) translateAtlOcl(argumentso.get(0)));
256+
else if (operatorname.equals("including"))
257+
res = ((IExpression) src)
258+
.union((IExpression) translateAtlOcl(argumentso.get(0)));
259+
else if (operatorname.equals("excluding"))
260+
res = ((IExpression) src)
261+
.difference((IExpression) translateAtlOcl(argumentso.get(0)));
235262
else if (operatorname.equals("intersection"))
236263
res = ((IExpression) src)
237264
.intersection((IExpression) translateAtlOcl(argumentso
238265
.get(0)));
239266
else if (operatorname.equals("includes"))
240267
res = ((IExpression) translateAtlOcl(argumentso.get(0)))
241268
.in((IExpression) src);
269+
else if (operatorname.equals("includesAll"))
270+
res = ((IExpression) translateAtlOcl(argumentso.get(0)))
271+
.in((IExpression) src);
272+
else if (operatorname.equals("excludes"))
273+
res = ((IExpression) translateAtlOcl(argumentso.get(0)))
274+
.in((IExpression) src).not();
275+
else if (operatorname.equals("excludesAll"))
276+
res = ((IExpression) translateAtlOcl(argumentso.get(0)))
277+
.in((IExpression) src).not();
242278
else if (operatorname.equals("oclAsSet")
243279
|| operatorname.equals("asSet"))
244280
res = src;
281+
else if (operatorname.equals("oclIsKindOf"))
282+
res = ((IExpression) src).in((IExpression) translateAtlOcl(argumentso.get(0)));
283+
else if (operatorname.equals("oclAsType"))
284+
res = ((IExpression) src);
245285
else if (operatorname.equals("+"))
246286
res = ((IIntExpression) src)
247287
.plus((IIntExpression) translateAtlOcl(argumentso.get(0)));
248-
else if (operatorname.equals("-"))
249-
res = ((IIntExpression) src)
250-
.minus((IIntExpression) translateAtlOcl(argumentso.get(0)));
288+
else if (operatorname.equals("-")) {
289+
INode x = translateAtlOcl(argumentso.get(0));
290+
if (src instanceof IIntExpression && x instanceof IIntExpression)
291+
res = ((IIntExpression) src).minus((IIntExpression) x);
292+
else
293+
res = ((IIntExpression) src).difference((IIntExpression) x);
294+
}
251295
else if (operatorname.equals("allInstances"))
252296
res = src;
253297
else if (((EATLTransformation) context.getCallerRel().transformation.transformation).getRelation(operatorname) != null) {

0 commit comments

Comments
 (0)