diff options
author | cbrun | 2017-01-18 15:41:37 +0000 |
---|---|---|
committer | cbrun | 2017-02-01 16:41:45 +0000 |
commit | 221f7c18b29aa15ac627bc8fcf78e06a602eedcd (patch) | |
tree | 1e7edddb7a8c1208d666f04c69a70c7130ec72ad | |
parent | 98974c7851a4f1e4fb3ecbc6b309336b545109c3 (diff) | |
download | org.eclipse.sirius-221f7c18b29aa15ac627bc8fcf78e06a602eedcd.tar.gz org.eclipse.sirius-221f7c18b29aa15ac627bc8fcf78e06a602eedcd.tar.xz org.eclipse.sirius-221f7c18b29aa15ac627bc8fcf78e06a602eedcd.zip |
[510126] Use predicate type inference for Switch/Case
Add the code and supporting test case so that the predicate which is
currently valid when we are in the context of a 'Case' is used to infer
more specific types.
Bug: 510126
Change-Id: I335e1fb158502a0a79960a858510499553b97e53
Signed-off-by: Cedric Brun <cedric.brun@obeo.fr>
2 files changed, 30 insertions, 0 deletions
diff --git a/plugins/org.eclipse.sirius.tests.junit/data/unit/vsm/validateVariableTypes.odesign b/plugins/org.eclipse.sirius.tests.junit/data/unit/vsm/validateVariableTypes.odesign index 6b31cd40c3..7fbf3fdf80 100644 --- a/plugins/org.eclipse.sirius.tests.junit/data/unit/vsm/validateVariableTypes.odesign +++ b/plugins/org.eclipse.sirius.tests.junit/data/unit/vsm/validateVariableTypes.odesign @@ -450,6 +450,21 @@ <subModelOperations xsi:type="tool:If" conditionExpression="aql:not self.oclIsKindOf(interactions::Interaction)"> <subModelOperations xsi:type="tool:ChangeContext" browseExpression="feature:type"/> </subModelOperations> + <subModelOperations xsi:type="tool:Switch"> + <cases conditionExpression="aql:self.oclIsKindOf(interactions::Interaction)"> + <subModelOperations xsi:type="tool:ChangeContext" browseExpression="feature:executions"/> + </cases> + <cases conditionExpression="aql:self.oclIsKindOf(interactions::Participant)"> + <subModelOperations xsi:type="tool:ChangeContext" browseExpression="feature:type"/> + </cases> + <cases conditionExpression="aql:self.name <> null and self.oclIsKindOf(interactions::Interaction)"> + <subModelOperations xsi:type="tool:ChangeContext" browseExpression="feature:executions"/> + </cases> + <cases conditionExpression="aql:not self.oclIsKindOf(interactions::Interaction)"> + <subModelOperations xsi:type="tool:ChangeContext" browseExpression="feature:type"/> + </cases> + <default/> + </subModelOperations> </firstModelOperations> </initialOperation> </ownedTools> diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/dialect/description/AbstractInterpretedExpressionQuery.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/dialect/description/AbstractInterpretedExpressionQuery.java index 4f4c170f53..d51660bce1 100644 --- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/dialect/description/AbstractInterpretedExpressionQuery.java +++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/dialect/description/AbstractInterpretedExpressionQuery.java @@ -42,6 +42,7 @@ import org.eclipse.sirius.viewpoint.description.RepresentationDescription; import org.eclipse.sirius.viewpoint.description.Viewpoint; import org.eclipse.sirius.viewpoint.description.tool.AbstractToolDescription; import org.eclipse.sirius.viewpoint.description.tool.AcceleoVariable; +import org.eclipse.sirius.viewpoint.description.tool.Case; import org.eclipse.sirius.viewpoint.description.tool.ChangeContext; import org.eclipse.sirius.viewpoint.description.tool.CreateInstance; import org.eclipse.sirius.viewpoint.description.tool.EditMaskVariables; @@ -535,6 +536,20 @@ public abstract class AbstractInterpretedExpressionQuery implements IInterpreted } } + if (current instanceof Case) { + Case switchCase = (Case) current; + IInterpreterContext caseContext = SiriusInterpreterContextFactory.createInterpreterContext(switchCase, ToolPackage.Literals.CASE__CONDITION_EXPRESSION); + ValidationResult res = MultiLanguagesValidator.getInstance().validateExpression(caseContext, switchCase.getConditionExpression()); + Map<String, VariableType> inferedTypes = res.getInferredVariableTypes(Boolean.TRUE); + for (Entry<String, VariableType> infered : inferedTypes.entrySet()) { + if (SELF.equals(infered.getKey())) { + changeSelfType(infered.getValue()); + } else { + addDefinition(definitions, infered.getKey(), infered.getValue()); + } + + } + } if (current instanceof ChangeContext) { ChangeContext f = (ChangeContext) current; |