From 69960a08b2d09ddc44df32d207e927e05155b2ee Mon Sep 17 00:00:00 2001 From: Arnaud Dieumegard Date: Mon, 13 May 2024 14:54:53 +0200 Subject: [PATCH] [175] State transition fixes - Add guardExpression into the transitionExpression rule. Not implemented yet. - Prevent transition creation from or to a parallel state - Fix delete state and delete transition issues - Fix direct edit tool on transitions. Is still missing a fully correct behavior on unsetting trigger action. - Adapt transition trigger creation to follow AcceptActionUsage modifications about parameters handling - Modify TransitionUsage creation and connection to its source and target to be specification compliant. Required to rewrite the reconnect tools, the RelatedElementsSwitch and the TransitionUsage source(Feature) target(Feature) relations. - Add payload and receiver to the trigger action creation M2 contributions - Add redefinition of Subsetting.subsettedFeature by ReferenceSubsetting.referencedFeature. Updated code in getter and setter of subsettedFeature on REeerenceSubsetting to ensure consistency. Limitation: Using the Delete tool on a Transition with a trigger or an effect causes an error and does not allows to delete the transition. Bug: https://github.com/eclipse-syson/syson/issues/175 Signed-off-by: Arnaud Dieumegard --- .../sysml/impl/ParameterMembershipImpl.java | 9 + .../sysml/impl/ReferenceSubsettingImpl.java | 27 ++ .../syson/sysml/impl/TransitionUsageImpl.java | 18 +- .../eclipse/syson/sysml/impl/TypeImpl.java | 6 +- .../syson/services/grammars/DirectEdit.interp | 3 +- .../grammars/DirectEditBaseListener.java | 12 + .../services/grammars/DirectEditListener.java | 10 + .../services/grammars/DirectEditParser.java | 365 +++++++++++------- .../services/DiagramDirectEditListener.java | 125 ++++-- .../syson/services/RelatedElementsSwitch.java | 23 ++ .../eclipse/syson/services/UtilService.java | 27 ++ .../src/main/resources/DirectEdit.g4 | 8 +- .../StateTransitionViewEdgeService.java | 51 ++- .../StateTransitionViewToolService.java | 55 ++- ...StateUsageCompartmentNodeToolProvider.java | 4 +- 15 files changed, 530 insertions(+), 213 deletions(-) diff --git a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/ParameterMembershipImpl.java b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/ParameterMembershipImpl.java index 9a2eb6dc2..1302e49ba 100644 --- a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/ParameterMembershipImpl.java +++ b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/ParameterMembershipImpl.java @@ -74,6 +74,15 @@ public Feature basicGetOwnedMemberParameter() { .findFirst() .orElse(null); } + + /** + * ownedMemberParameter : Feature {redefines ownedMemberFeature} + * @generated NOT + */ + @Override + public Feature getOwnedMemberFeature() { + return this.getOwnedMemberParameter(); + } /** * diff --git a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/ReferenceSubsettingImpl.java b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/ReferenceSubsettingImpl.java index 9c1523df4..c17cc28b0 100644 --- a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/ReferenceSubsettingImpl.java +++ b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/ReferenceSubsettingImpl.java @@ -81,6 +81,33 @@ public Feature getReferencedFeature() { } return referencedFeature; } + + /** + * referencedFeature : Feature {redefines subsettedFeature}. + * + * The Feature that is referenced by the referencingFeature of this ReferenceSubsetting. + * + * @generated NOT + */ + @Override + public Feature getSubsettedFeature() { + return this.getReferencedFeature(); + } + + + /** + * referencedFeature : Feature {redefines subsettedFeature}. + * + * The Feature that is referenced by the referencingFeature of this ReferenceSubsetting. + * Setter. + * + * @generated NOT + */ + @Override + public void setSubsettedFeature(Feature newSubsettedFeature) { + super.setSubsettedFeature(newSubsettedFeature); + this.setReferencedFeature(newSubsettedFeature); + } /** * diff --git a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/TransitionUsageImpl.java b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/TransitionUsageImpl.java index bb095f644..bb63594d1 100644 --- a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/TransitionUsageImpl.java +++ b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/TransitionUsageImpl.java @@ -25,6 +25,7 @@ import org.eclipse.syson.sysml.ActionUsage; import org.eclipse.syson.sysml.Element; import org.eclipse.syson.sysml.Expression; +import org.eclipse.syson.sysml.Feature; import org.eclipse.syson.sysml.FeatureMembership; import org.eclipse.syson.sysml.Membership; import org.eclipse.syson.sysml.ReferenceUsage; @@ -220,9 +221,9 @@ public ActionUsage getTarget() { * @generated NOT */ public ActionUsage basicGetTarget() { - Succession succession = getSuccession(); - if (succession != null && !succession.getTarget().isEmpty()) { - EList targets = succession.getTarget(); + Succession succession = this.getSuccession(); + if (succession != null && !succession.getTargetFeature().isEmpty()) { + EList targets = succession.getTargetFeature(); if (!targets.isEmpty() && targets.get(0) instanceof ActionUsage actionUsage) { return actionUsage; } @@ -263,13 +264,18 @@ public EList getTriggerAction() { /** * + * Return the payloadParameter of the triggerAction of this TransitionUsage, if it has one. + * + * body: if triggerAction->isEmpty() then null else triggerAction->first().payloadParameter endif * - * @generated + * @generated NOT */ @Override public ReferenceUsage triggerPayloadParameter() { - // TODO: implement this method - // Ensure that you remove @generated or mark it @generated NOT + AcceptActionUsage triggerAction = this.getTriggerAction().stream().findFirst().orElse(null); + if (triggerAction != null) { + return triggerAction.getPayloadParameter(); + } return null; } diff --git a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/TypeImpl.java b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/TypeImpl.java index cba649366..2dc907f1e 100644 --- a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/TypeImpl.java +++ b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/TypeImpl.java @@ -430,14 +430,16 @@ public EList getOwnedFeature() { } /** - * + * + * The ownedMemberships of this Type that are FeatureMemberships, for which the Type is the + * owningType. Each such FeatureMembership identifies an ownedFeature of the Type. * * @generated NOT */ @Override public EList getOwnedFeatureMembership() { List ownedFeatureMemberships = new ArrayList<>(); - this.getOwnedRelationship().stream() + this.getOwnedMembership().stream() .filter(FeatureMembership.class::isInstance) .map(FeatureMembership.class::cast) .forEach(ownedFeatureMemberships::add); diff --git a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEdit.interp b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEdit.interp index b9d44c677..d3ca709d5 100644 --- a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEdit.interp +++ b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEdit.interp @@ -249,6 +249,7 @@ typingExpression valueExpression transitionExpression triggerExpression +triggerExpressionName guardExpression effectExpression qualifiedName @@ -256,4 +257,4 @@ name atn: -[4, 1, 117, 123, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 1, 0, 3, 0, 30, 8, 0, 1, 0, 3, 0, 33, 8, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 42, 8, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 3, 3, 51, 8, 3, 1, 3, 3, 3, 54, 8, 3, 1, 3, 3, 3, 57, 8, 3, 1, 3, 3, 3, 60, 8, 3, 1, 3, 1, 3, 3, 3, 64, 8, 3, 1, 3, 3, 3, 67, 8, 3, 1, 3, 3, 3, 70, 8, 3, 3, 3, 72, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 3, 8, 87, 8, 8, 1, 8, 3, 8, 90, 8, 8, 1, 9, 1, 9, 1, 9, 5, 9, 95, 8, 9, 10, 9, 12, 9, 98, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 108, 8, 11, 10, 11, 12, 11, 111, 9, 11, 1, 12, 1, 12, 1, 12, 5, 12, 116, 8, 12, 10, 12, 12, 12, 119, 9, 12, 1, 13, 1, 13, 1, 13, 0, 0, 14, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 0, 3, 2, 0, 4, 4, 15, 15, 2, 0, 14, 16, 18, 18, 2, 0, 17, 17, 19, 19, 127, 0, 29, 1, 0, 0, 0, 2, 37, 1, 0, 0, 0, 4, 46, 1, 0, 0, 0, 6, 71, 1, 0, 0, 0, 8, 73, 1, 0, 0, 0, 10, 76, 1, 0, 0, 0, 12, 79, 1, 0, 0, 0, 14, 82, 1, 0, 0, 0, 16, 86, 1, 0, 0, 0, 18, 91, 1, 0, 0, 0, 20, 99, 1, 0, 0, 0, 22, 103, 1, 0, 0, 0, 24, 112, 1, 0, 0, 0, 26, 120, 1, 0, 0, 0, 28, 30, 3, 26, 13, 0, 29, 28, 1, 0, 0, 0, 29, 30, 1, 0, 0, 0, 30, 32, 1, 0, 0, 0, 31, 33, 3, 2, 1, 0, 32, 31, 1, 0, 0, 0, 32, 33, 1, 0, 0, 0, 33, 34, 1, 0, 0, 0, 34, 35, 3, 6, 3, 0, 35, 36, 5, 0, 0, 1, 36, 1, 1, 0, 0, 0, 37, 41, 5, 1, 0, 0, 38, 39, 3, 4, 2, 0, 39, 40, 5, 2, 0, 0, 40, 42, 1, 0, 0, 0, 41, 38, 1, 0, 0, 0, 41, 42, 1, 0, 0, 0, 42, 43, 1, 0, 0, 0, 43, 44, 3, 4, 2, 0, 44, 45, 5, 3, 0, 0, 45, 3, 1, 0, 0, 0, 46, 47, 7, 0, 0, 0, 47, 5, 1, 0, 0, 0, 48, 51, 3, 8, 4, 0, 49, 51, 3, 10, 5, 0, 50, 48, 1, 0, 0, 0, 50, 49, 1, 0, 0, 0, 50, 51, 1, 0, 0, 0, 51, 53, 1, 0, 0, 0, 52, 54, 3, 12, 6, 0, 53, 52, 1, 0, 0, 0, 53, 54, 1, 0, 0, 0, 54, 56, 1, 0, 0, 0, 55, 57, 3, 14, 7, 0, 56, 55, 1, 0, 0, 0, 56, 57, 1, 0, 0, 0, 57, 72, 1, 0, 0, 0, 58, 60, 3, 12, 6, 0, 59, 58, 1, 0, 0, 0, 59, 60, 1, 0, 0, 0, 60, 63, 1, 0, 0, 0, 61, 64, 3, 8, 4, 0, 62, 64, 3, 10, 5, 0, 63, 61, 1, 0, 0, 0, 63, 62, 1, 0, 0, 0, 63, 64, 1, 0, 0, 0, 64, 66, 1, 0, 0, 0, 65, 67, 3, 14, 7, 0, 66, 65, 1, 0, 0, 0, 66, 67, 1, 0, 0, 0, 67, 72, 1, 0, 0, 0, 68, 70, 3, 16, 8, 0, 69, 68, 1, 0, 0, 0, 69, 70, 1, 0, 0, 0, 70, 72, 1, 0, 0, 0, 71, 50, 1, 0, 0, 0, 71, 59, 1, 0, 0, 0, 71, 69, 1, 0, 0, 0, 72, 7, 1, 0, 0, 0, 73, 74, 5, 5, 0, 0, 74, 75, 3, 24, 12, 0, 75, 9, 1, 0, 0, 0, 76, 77, 5, 6, 0, 0, 77, 78, 3, 24, 12, 0, 78, 11, 1, 0, 0, 0, 79, 80, 5, 7, 0, 0, 80, 81, 3, 24, 12, 0, 81, 13, 1, 0, 0, 0, 82, 83, 5, 8, 0, 0, 83, 84, 7, 1, 0, 0, 84, 15, 1, 0, 0, 0, 85, 87, 3, 18, 9, 0, 86, 85, 1, 0, 0, 0, 86, 87, 1, 0, 0, 0, 87, 89, 1, 0, 0, 0, 88, 90, 3, 22, 11, 0, 89, 88, 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 17, 1, 0, 0, 0, 91, 96, 3, 24, 12, 0, 92, 93, 5, 9, 0, 0, 93, 95, 3, 24, 12, 0, 94, 92, 1, 0, 0, 0, 95, 98, 1, 0, 0, 0, 96, 94, 1, 0, 0, 0, 96, 97, 1, 0, 0, 0, 97, 19, 1, 0, 0, 0, 98, 96, 1, 0, 0, 0, 99, 100, 5, 1, 0, 0, 100, 101, 3, 14, 7, 0, 101, 102, 5, 3, 0, 0, 102, 21, 1, 0, 0, 0, 103, 104, 5, 10, 0, 0, 104, 109, 3, 24, 12, 0, 105, 106, 5, 11, 0, 0, 106, 108, 3, 24, 12, 0, 107, 105, 1, 0, 0, 0, 108, 111, 1, 0, 0, 0, 109, 107, 1, 0, 0, 0, 109, 110, 1, 0, 0, 0, 110, 23, 1, 0, 0, 0, 111, 109, 1, 0, 0, 0, 112, 117, 3, 26, 13, 0, 113, 114, 5, 12, 0, 0, 114, 116, 3, 26, 13, 0, 115, 113, 1, 0, 0, 0, 116, 119, 1, 0, 0, 0, 117, 115, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 25, 1, 0, 0, 0, 119, 117, 1, 0, 0, 0, 120, 121, 7, 2, 0, 0, 121, 27, 1, 0, 0, 0, 16, 29, 32, 41, 50, 53, 56, 59, 63, 66, 69, 71, 86, 89, 96, 109, 117] \ No newline at end of file +[4, 1, 117, 132, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 1, 0, 3, 0, 32, 8, 0, 1, 0, 3, 0, 35, 8, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 44, 8, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 3, 3, 53, 8, 3, 1, 3, 3, 3, 56, 8, 3, 1, 3, 3, 3, 59, 8, 3, 1, 3, 3, 3, 62, 8, 3, 1, 3, 1, 3, 3, 3, 66, 8, 3, 1, 3, 3, 3, 69, 8, 3, 1, 3, 3, 3, 72, 8, 3, 3, 3, 74, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 3, 8, 89, 8, 8, 1, 8, 3, 8, 92, 8, 8, 1, 8, 3, 8, 95, 8, 8, 1, 9, 1, 9, 1, 9, 5, 9, 100, 8, 9, 10, 9, 12, 9, 103, 9, 9, 1, 10, 1, 10, 3, 10, 107, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 117, 8, 12, 10, 12, 12, 12, 120, 9, 12, 1, 13, 1, 13, 1, 13, 5, 13, 125, 8, 13, 10, 13, 12, 13, 128, 9, 13, 1, 14, 1, 14, 1, 14, 0, 0, 15, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 0, 3, 2, 0, 4, 4, 15, 15, 2, 0, 14, 16, 18, 18, 2, 0, 17, 17, 19, 19, 137, 0, 31, 1, 0, 0, 0, 2, 39, 1, 0, 0, 0, 4, 48, 1, 0, 0, 0, 6, 73, 1, 0, 0, 0, 8, 75, 1, 0, 0, 0, 10, 78, 1, 0, 0, 0, 12, 81, 1, 0, 0, 0, 14, 84, 1, 0, 0, 0, 16, 88, 1, 0, 0, 0, 18, 96, 1, 0, 0, 0, 20, 104, 1, 0, 0, 0, 22, 108, 1, 0, 0, 0, 24, 112, 1, 0, 0, 0, 26, 121, 1, 0, 0, 0, 28, 129, 1, 0, 0, 0, 30, 32, 3, 28, 14, 0, 31, 30, 1, 0, 0, 0, 31, 32, 1, 0, 0, 0, 32, 34, 1, 0, 0, 0, 33, 35, 3, 2, 1, 0, 34, 33, 1, 0, 0, 0, 34, 35, 1, 0, 0, 0, 35, 36, 1, 0, 0, 0, 36, 37, 3, 6, 3, 0, 37, 38, 5, 0, 0, 1, 38, 1, 1, 0, 0, 0, 39, 43, 5, 1, 0, 0, 40, 41, 3, 4, 2, 0, 41, 42, 5, 2, 0, 0, 42, 44, 1, 0, 0, 0, 43, 40, 1, 0, 0, 0, 43, 44, 1, 0, 0, 0, 44, 45, 1, 0, 0, 0, 45, 46, 3, 4, 2, 0, 46, 47, 5, 3, 0, 0, 47, 3, 1, 0, 0, 0, 48, 49, 7, 0, 0, 0, 49, 5, 1, 0, 0, 0, 50, 53, 3, 8, 4, 0, 51, 53, 3, 10, 5, 0, 52, 50, 1, 0, 0, 0, 52, 51, 1, 0, 0, 0, 52, 53, 1, 0, 0, 0, 53, 55, 1, 0, 0, 0, 54, 56, 3, 12, 6, 0, 55, 54, 1, 0, 0, 0, 55, 56, 1, 0, 0, 0, 56, 58, 1, 0, 0, 0, 57, 59, 3, 14, 7, 0, 58, 57, 1, 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 74, 1, 0, 0, 0, 60, 62, 3, 12, 6, 0, 61, 60, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 65, 1, 0, 0, 0, 63, 66, 3, 8, 4, 0, 64, 66, 3, 10, 5, 0, 65, 63, 1, 0, 0, 0, 65, 64, 1, 0, 0, 0, 65, 66, 1, 0, 0, 0, 66, 68, 1, 0, 0, 0, 67, 69, 3, 14, 7, 0, 68, 67, 1, 0, 0, 0, 68, 69, 1, 0, 0, 0, 69, 74, 1, 0, 0, 0, 70, 72, 3, 16, 8, 0, 71, 70, 1, 0, 0, 0, 71, 72, 1, 0, 0, 0, 72, 74, 1, 0, 0, 0, 73, 52, 1, 0, 0, 0, 73, 61, 1, 0, 0, 0, 73, 71, 1, 0, 0, 0, 74, 7, 1, 0, 0, 0, 75, 76, 5, 5, 0, 0, 76, 77, 3, 26, 13, 0, 77, 9, 1, 0, 0, 0, 78, 79, 5, 6, 0, 0, 79, 80, 3, 26, 13, 0, 80, 11, 1, 0, 0, 0, 81, 82, 5, 7, 0, 0, 82, 83, 3, 26, 13, 0, 83, 13, 1, 0, 0, 0, 84, 85, 5, 8, 0, 0, 85, 86, 7, 1, 0, 0, 86, 15, 1, 0, 0, 0, 87, 89, 3, 18, 9, 0, 88, 87, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 91, 1, 0, 0, 0, 90, 92, 3, 22, 11, 0, 91, 90, 1, 0, 0, 0, 91, 92, 1, 0, 0, 0, 92, 94, 1, 0, 0, 0, 93, 95, 3, 24, 12, 0, 94, 93, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 17, 1, 0, 0, 0, 96, 101, 3, 20, 10, 0, 97, 98, 5, 9, 0, 0, 98, 100, 3, 20, 10, 0, 99, 97, 1, 0, 0, 0, 100, 103, 1, 0, 0, 0, 101, 99, 1, 0, 0, 0, 101, 102, 1, 0, 0, 0, 102, 19, 1, 0, 0, 0, 103, 101, 1, 0, 0, 0, 104, 106, 3, 28, 14, 0, 105, 107, 3, 12, 6, 0, 106, 105, 1, 0, 0, 0, 106, 107, 1, 0, 0, 0, 107, 21, 1, 0, 0, 0, 108, 109, 5, 1, 0, 0, 109, 110, 3, 14, 7, 0, 110, 111, 5, 3, 0, 0, 111, 23, 1, 0, 0, 0, 112, 113, 5, 10, 0, 0, 113, 118, 3, 26, 13, 0, 114, 115, 5, 11, 0, 0, 115, 117, 3, 26, 13, 0, 116, 114, 1, 0, 0, 0, 117, 120, 1, 0, 0, 0, 118, 116, 1, 0, 0, 0, 118, 119, 1, 0, 0, 0, 119, 25, 1, 0, 0, 0, 120, 118, 1, 0, 0, 0, 121, 126, 3, 28, 14, 0, 122, 123, 5, 12, 0, 0, 123, 125, 3, 28, 14, 0, 124, 122, 1, 0, 0, 0, 125, 128, 1, 0, 0, 0, 126, 124, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 27, 1, 0, 0, 0, 128, 126, 1, 0, 0, 0, 129, 130, 7, 2, 0, 0, 130, 29, 1, 0, 0, 0, 18, 31, 34, 43, 52, 55, 58, 61, 65, 68, 71, 73, 88, 91, 94, 101, 106, 118, 126] \ No newline at end of file diff --git a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditBaseListener.java b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditBaseListener.java index d0cca93be..422e57a51 100644 --- a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditBaseListener.java +++ b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditBaseListener.java @@ -145,6 +145,18 @@ public class DirectEditBaseListener implements DirectEditListener { *

The default implementation does nothing.

*/ @Override public void exitTriggerExpression(DirectEditParser.TriggerExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTriggerExpressionName(DirectEditParser.TriggerExpressionNameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTriggerExpressionName(DirectEditParser.TriggerExpressionNameContext ctx) { } /** * {@inheritDoc} * diff --git a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditListener.java b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditListener.java index 60e277bd4..504115ede 100644 --- a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditListener.java +++ b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditListener.java @@ -121,6 +121,16 @@ public interface DirectEditListener extends ParseTreeListener { * @param ctx the parse tree */ void exitTriggerExpression(DirectEditParser.TriggerExpressionContext ctx); + /** + * Enter a parse tree produced by {@link DirectEditParser#triggerExpressionName}. + * @param ctx the parse tree + */ + void enterTriggerExpressionName(DirectEditParser.TriggerExpressionNameContext ctx); + /** + * Exit a parse tree produced by {@link DirectEditParser#triggerExpressionName}. + * @param ctx the parse tree + */ + void exitTriggerExpressionName(DirectEditParser.TriggerExpressionNameContext ctx); /** * Enter a parse tree produced by {@link DirectEditParser#guardExpression}. * @param ctx the parse tree diff --git a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditParser.java b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditParser.java index d4acc740e..e7568f0af 100644 --- a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditParser.java +++ b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditParser.java @@ -53,14 +53,15 @@ public class DirectEditParser extends Parser { RULE_expression = 0, RULE_multiplicityExpression = 1, RULE_multiplicityExpressionMember = 2, RULE_featureExpressions = 3, RULE_subsettingExpression = 4, RULE_redefinitionExpression = 5, RULE_typingExpression = 6, RULE_valueExpression = 7, RULE_transitionExpression = 8, - RULE_triggerExpression = 9, RULE_guardExpression = 10, RULE_effectExpression = 11, - RULE_qualifiedName = 12, RULE_name = 13; + RULE_triggerExpression = 9, RULE_triggerExpressionName = 10, RULE_guardExpression = 11, + RULE_effectExpression = 12, RULE_qualifiedName = 13, RULE_name = 14; private static String[] makeRuleNames() { return new String[] { "expression", "multiplicityExpression", "multiplicityExpressionMember", "featureExpressions", "subsettingExpression", "redefinitionExpression", "typingExpression", "valueExpression", "transitionExpression", "triggerExpression", - "guardExpression", "effectExpression", "qualifiedName", "name" + "triggerExpressionName", "guardExpression", "effectExpression", "qualifiedName", + "name" }; } public static final String[] ruleNames = makeRuleNames(); @@ -188,33 +189,32 @@ public void exitRule(ParseTreeListener listener) { public final ExpressionContext expression() throws RecognitionException { ExpressionContext _localctx = new ExpressionContext(_ctx, getState()); enterRule(_localctx, 0, RULE_expression); - int _la; try { enterOuterAlt(_localctx, 1); { - setState(29); + setState(31); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,0,_ctx) ) { case 1: { - setState(28); + setState(30); name(); } break; } - setState(32); + setState(34); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==T__0) { + switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { + case 1: { - setState(31); + setState(33); multiplicityExpression(); } + break; } - - setState(34); + setState(36); featureExpressions(); - setState(35); + setState(37); match(EOF); } } @@ -258,23 +258,23 @@ public final MultiplicityExpressionContext multiplicityExpression() throws Recog try { enterOuterAlt(_localctx, 1); { - setState(37); + setState(39); match(T__0); - setState(41); + setState(43); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: { - setState(38); + setState(40); ((MultiplicityExpressionContext)_localctx).lowerBound = multiplicityExpressionMember(); - setState(39); + setState(41); match(T__1); } break; } - setState(43); + setState(45); ((MultiplicityExpressionContext)_localctx).upperBound = multiplicityExpressionMember(); - setState(44); + setState(46); match(T__2); } } @@ -312,7 +312,7 @@ public final MultiplicityExpressionMemberContext multiplicityExpressionMember() try { enterOuterAlt(_localctx, 1); { - setState(46); + setState(48); _la = _input.LA(1); if ( !(_la==T__3 || _la==Integer) ) { _errHandler.recoverInline(this); @@ -370,24 +370,24 @@ public final FeatureExpressionsContext featureExpressions() throws RecognitionEx enterRule(_localctx, 6, RULE_featureExpressions); int _la; try { - setState(71); + setState(73); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(50); + setState(52); _errHandler.sync(this); switch (_input.LA(1)) { case T__4: { - setState(48); + setState(50); subsettingExpression(); } break; case T__5: { - setState(49); + setState(51); redefinitionExpression(); } break; @@ -398,22 +398,22 @@ public final FeatureExpressionsContext featureExpressions() throws RecognitionEx default: break; } - setState(53); + setState(55); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__6) { { - setState(52); + setState(54); typingExpression(); } } - setState(56); + setState(58); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__7) { { - setState(55); + setState(57); valueExpression(); } } @@ -423,28 +423,28 @@ public final FeatureExpressionsContext featureExpressions() throws RecognitionEx case 2: enterOuterAlt(_localctx, 2); { - setState(59); + setState(61); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__6) { { - setState(58); + setState(60); typingExpression(); } } - setState(63); + setState(65); _errHandler.sync(this); switch (_input.LA(1)) { case T__4: { - setState(61); + setState(63); subsettingExpression(); } break; case T__5: { - setState(62); + setState(64); redefinitionExpression(); } break; @@ -454,12 +454,12 @@ public final FeatureExpressionsContext featureExpressions() throws RecognitionEx default: break; } - setState(66); + setState(68); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__7) { { - setState(65); + setState(67); valueExpression(); } } @@ -469,12 +469,12 @@ public final FeatureExpressionsContext featureExpressions() throws RecognitionEx case 3: enterOuterAlt(_localctx, 3); { - setState(69); + setState(71); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) { case 1: { - setState(68); + setState(70); transitionExpression(); } break; @@ -518,9 +518,9 @@ public final SubsettingExpressionContext subsettingExpression() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(73); + setState(75); match(T__4); - setState(74); + setState(76); qualifiedName(); } } @@ -559,9 +559,9 @@ public final RedefinitionExpressionContext redefinitionExpression() throws Recog try { enterOuterAlt(_localctx, 1); { - setState(76); + setState(78); match(T__5); - setState(77); + setState(79); qualifiedName(); } } @@ -600,9 +600,9 @@ public final TypingExpressionContext typingExpression() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(79); + setState(81); match(T__6); - setState(80); + setState(82); qualifiedName(); } } @@ -643,9 +643,9 @@ public final ValueExpressionContext valueExpression() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(82); + setState(84); match(T__7); - setState(83); + setState(85); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << Boolean) | (1L << Integer) | (1L << Real) | (1L << DoubleQuotedString))) != 0)) ) { _errHandler.recoverInline(this); @@ -672,6 +672,9 @@ public static class TransitionExpressionContext extends ParserRuleContext { public TriggerExpressionContext triggerExpression() { return getRuleContext(TriggerExpressionContext.class,0); } + public GuardExpressionContext guardExpression() { + return getRuleContext(GuardExpressionContext.class,0); + } public EffectExpressionContext effectExpression() { return getRuleContext(EffectExpressionContext.class,0); } @@ -696,22 +699,32 @@ public final TransitionExpressionContext transitionExpression() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(86); + setState(88); _errHandler.sync(this); _la = _input.LA(1); if (_la==SingleQuotedString || _la==BasicName) { { - setState(85); + setState(87); triggerExpression(); } } - setState(89); + setState(91); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__0) { + { + setState(90); + guardExpression(); + } + } + + setState(94); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__9) { { - setState(88); + setState(93); effectExpression(); } } @@ -730,11 +743,11 @@ public final TransitionExpressionContext transitionExpression() throws Recogniti } public static class TriggerExpressionContext extends ParserRuleContext { - public List qualifiedName() { - return getRuleContexts(QualifiedNameContext.class); + public List triggerExpressionName() { + return getRuleContexts(TriggerExpressionNameContext.class); } - public QualifiedNameContext qualifiedName(int i) { - return getRuleContext(QualifiedNameContext.class,i); + public TriggerExpressionNameContext triggerExpressionName(int i) { + return getRuleContext(TriggerExpressionNameContext.class,i); } public TriggerExpressionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -757,21 +770,21 @@ public final TriggerExpressionContext triggerExpression() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(91); - qualifiedName(); setState(96); + triggerExpressionName(); + setState(101); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__8) { { { - setState(92); + setState(97); match(T__8); - setState(93); - qualifiedName(); + setState(98); + triggerExpressionName(); } } - setState(98); + setState(103); _errHandler.sync(this); _la = _input.LA(1); } @@ -788,6 +801,59 @@ public final TriggerExpressionContext triggerExpression() throws RecognitionExce return _localctx; } + public static class TriggerExpressionNameContext extends ParserRuleContext { + public NameContext name() { + return getRuleContext(NameContext.class,0); + } + public TypingExpressionContext typingExpression() { + return getRuleContext(TypingExpressionContext.class,0); + } + public TriggerExpressionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_triggerExpressionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterTriggerExpressionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitTriggerExpressionName(this); + } + } + + public final TriggerExpressionNameContext triggerExpressionName() throws RecognitionException { + TriggerExpressionNameContext _localctx = new TriggerExpressionNameContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_triggerExpressionName); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(104); + name(); + setState(106); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__6) { + { + setState(105); + typingExpression(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class GuardExpressionContext extends ParserRuleContext { public ValueExpressionContext valueExpression() { return getRuleContext(ValueExpressionContext.class,0); @@ -808,15 +874,15 @@ public void exitRule(ParseTreeListener listener) { public final GuardExpressionContext guardExpression() throws RecognitionException { GuardExpressionContext _localctx = new GuardExpressionContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_guardExpression); + enterRule(_localctx, 22, RULE_guardExpression); try { enterOuterAlt(_localctx, 1); { - setState(99); + setState(108); match(T__0); - setState(100); + setState(109); valueExpression(); - setState(101); + setState(110); match(T__2); } } @@ -854,28 +920,28 @@ public void exitRule(ParseTreeListener listener) { public final EffectExpressionContext effectExpression() throws RecognitionException { EffectExpressionContext _localctx = new EffectExpressionContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_effectExpression); + enterRule(_localctx, 24, RULE_effectExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(103); + setState(112); match(T__9); - setState(104); + setState(113); qualifiedName(); - setState(109); + setState(118); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__10) { { { - setState(105); + setState(114); match(T__10); - setState(106); + setState(115); qualifiedName(); } } - setState(111); + setState(120); _errHandler.sync(this); _la = _input.LA(1); } @@ -915,26 +981,26 @@ public void exitRule(ParseTreeListener listener) { public final QualifiedNameContext qualifiedName() throws RecognitionException { QualifiedNameContext _localctx = new QualifiedNameContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_qualifiedName); + enterRule(_localctx, 26, RULE_qualifiedName); int _la; try { enterOuterAlt(_localctx, 1); { - setState(112); + setState(121); name(); - setState(117); + setState(126); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__11) { { { - setState(113); + setState(122); match(T__11); - setState(114); + setState(123); name(); } } - setState(119); + setState(128); _errHandler.sync(this); _la = _input.LA(1); } @@ -970,12 +1036,12 @@ public void exitRule(ParseTreeListener listener) { public final NameContext name() throws RecognitionException { NameContext _localctx = new NameContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_name); + enterRule(_localctx, 28, RULE_name); int _la; try { enterOuterAlt(_localctx, 1); { - setState(120); + setState(129); _la = _input.LA(1); if ( !(_la==SingleQuotedString || _la==BasicName) ) { _errHandler.recoverInline(this); @@ -999,75 +1065,80 @@ public final NameContext name() throws RecognitionException { } public static final String _serializedATN = - "\u0004\u0001u{\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002"+ - "\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005"+ - "\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007"+ - "\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007"+ - "\f\u0002\r\u0007\r\u0001\u0000\u0003\u0000\u001e\b\u0000\u0001\u0000\u0003"+ - "\u0000!\b\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0003\u0001*\b\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0003"+ - "\u00033\b\u0003\u0001\u0003\u0003\u00036\b\u0003\u0001\u0003\u0003\u0003"+ - "9\b\u0003\u0001\u0003\u0003\u0003<\b\u0003\u0001\u0003\u0001\u0003\u0003"+ - "\u0003@\b\u0003\u0001\u0003\u0003\u0003C\b\u0003\u0001\u0003\u0003\u0003"+ - "F\b\u0003\u0003\u0003H\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\b\u0003\bW\b\b\u0001\b\u0003\bZ\b"+ - "\b\u0001\t\u0001\t\u0001\t\u0005\t_\b\t\n\t\f\tb\t\t\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0005\u000b"+ - "l\b\u000b\n\u000b\f\u000bo\t\u000b\u0001\f\u0001\f\u0001\f\u0005\ft\b"+ - "\f\n\f\f\fw\t\f\u0001\r\u0001\r\u0001\r\u0000\u0000\u000e\u0000\u0002"+ - "\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u0000\u0003"+ - "\u0002\u0000\u0004\u0004\u000f\u000f\u0002\u0000\u000e\u0010\u0012\u0012"+ - "\u0002\u0000\u0011\u0011\u0013\u0013\u007f\u0000\u001d\u0001\u0000\u0000"+ - "\u0000\u0002%\u0001\u0000\u0000\u0000\u0004.\u0001\u0000\u0000\u0000\u0006"+ - "G\u0001\u0000\u0000\u0000\bI\u0001\u0000\u0000\u0000\nL\u0001\u0000\u0000"+ - "\u0000\fO\u0001\u0000\u0000\u0000\u000eR\u0001\u0000\u0000\u0000\u0010"+ - "V\u0001\u0000\u0000\u0000\u0012[\u0001\u0000\u0000\u0000\u0014c\u0001"+ - "\u0000\u0000\u0000\u0016g\u0001\u0000\u0000\u0000\u0018p\u0001\u0000\u0000"+ - "\u0000\u001ax\u0001\u0000\u0000\u0000\u001c\u001e\u0003\u001a\r\u0000"+ - "\u001d\u001c\u0001\u0000\u0000\u0000\u001d\u001e\u0001\u0000\u0000\u0000"+ - "\u001e \u0001\u0000\u0000\u0000\u001f!\u0003\u0002\u0001\u0000 \u001f"+ - "\u0001\u0000\u0000\u0000 !\u0001\u0000\u0000\u0000!\"\u0001\u0000\u0000"+ - "\u0000\"#\u0003\u0006\u0003\u0000#$\u0005\u0000\u0000\u0001$\u0001\u0001"+ - "\u0000\u0000\u0000%)\u0005\u0001\u0000\u0000&\'\u0003\u0004\u0002\u0000"+ - "\'(\u0005\u0002\u0000\u0000(*\u0001\u0000\u0000\u0000)&\u0001\u0000\u0000"+ - "\u0000)*\u0001\u0000\u0000\u0000*+\u0001\u0000\u0000\u0000+,\u0003\u0004"+ - "\u0002\u0000,-\u0005\u0003\u0000\u0000-\u0003\u0001\u0000\u0000\u0000"+ - "./\u0007\u0000\u0000\u0000/\u0005\u0001\u0000\u0000\u000003\u0003\b\u0004"+ - "\u000013\u0003\n\u0005\u000020\u0001\u0000\u0000\u000021\u0001\u0000\u0000"+ - "\u000023\u0001\u0000\u0000\u000035\u0001\u0000\u0000\u000046\u0003\f\u0006"+ - "\u000054\u0001\u0000\u0000\u000056\u0001\u0000\u0000\u000068\u0001\u0000"+ - "\u0000\u000079\u0003\u000e\u0007\u000087\u0001\u0000\u0000\u000089\u0001"+ - "\u0000\u0000\u00009H\u0001\u0000\u0000\u0000:<\u0003\f\u0006\u0000;:\u0001"+ - "\u0000\u0000\u0000;<\u0001\u0000\u0000\u0000@\u0003\n\u0005\u0000?=\u0001\u0000\u0000\u0000"+ - "?>\u0001\u0000\u0000\u0000?@\u0001\u0000\u0000\u0000@B\u0001\u0000\u0000"+ - "\u0000AC\u0003\u000e\u0007\u0000BA\u0001\u0000\u0000\u0000BC\u0001\u0000"+ - "\u0000\u0000CH\u0001\u0000\u0000\u0000DF\u0003\u0010\b\u0000ED\u0001\u0000"+ - "\u0000\u0000EF\u0001\u0000\u0000\u0000FH\u0001\u0000\u0000\u0000G2\u0001"+ - "\u0000\u0000\u0000G;\u0001\u0000\u0000\u0000GE\u0001\u0000\u0000\u0000"+ - "H\u0007\u0001\u0000\u0000\u0000IJ\u0005\u0005\u0000\u0000JK\u0003\u0018"+ - "\f\u0000K\t\u0001\u0000\u0000\u0000LM\u0005\u0006\u0000\u0000MN\u0003"+ - "\u0018\f\u0000N\u000b\u0001\u0000\u0000\u0000OP\u0005\u0007\u0000\u0000"+ - "PQ\u0003\u0018\f\u0000Q\r\u0001\u0000\u0000\u0000RS\u0005\b\u0000\u0000"+ - "ST\u0007\u0001\u0000\u0000T\u000f\u0001\u0000\u0000\u0000UW\u0003\u0012"+ - "\t\u0000VU\u0001\u0000\u0000\u0000VW\u0001\u0000\u0000\u0000WY\u0001\u0000"+ - "\u0000\u0000XZ\u0003\u0016\u000b\u0000YX\u0001\u0000\u0000\u0000YZ\u0001"+ - "\u0000\u0000\u0000Z\u0011\u0001\u0000\u0000\u0000[`\u0003\u0018\f\u0000"+ - "\\]\u0005\t\u0000\u0000]_\u0003\u0018\f\u0000^\\\u0001\u0000\u0000\u0000"+ - "_b\u0001\u0000\u0000\u0000`^\u0001\u0000\u0000\u0000`a\u0001\u0000\u0000"+ - "\u0000a\u0013\u0001\u0000\u0000\u0000b`\u0001\u0000\u0000\u0000cd\u0005"+ - "\u0001\u0000\u0000de\u0003\u000e\u0007\u0000ef\u0005\u0003\u0000\u0000"+ - "f\u0015\u0001\u0000\u0000\u0000gh\u0005\n\u0000\u0000hm\u0003\u0018\f"+ - "\u0000ij\u0005\u000b\u0000\u0000jl\u0003\u0018\f\u0000ki\u0001\u0000\u0000"+ - "\u0000lo\u0001\u0000\u0000\u0000mk\u0001\u0000\u0000\u0000mn\u0001\u0000"+ - "\u0000\u0000n\u0017\u0001\u0000\u0000\u0000om\u0001\u0000\u0000\u0000"+ - "pu\u0003\u001a\r\u0000qr\u0005\f\u0000\u0000rt\u0003\u001a\r\u0000sq\u0001"+ - "\u0000\u0000\u0000tw\u0001\u0000\u0000\u0000us\u0001\u0000\u0000\u0000"+ - "uv\u0001\u0000\u0000\u0000v\u0019\u0001\u0000\u0000\u0000wu\u0001\u0000"+ - "\u0000\u0000xy\u0007\u0002\u0000\u0000y\u001b\u0001\u0000\u0000\u0000"+ - "\u0010\u001d )258;?BEGVY`mu"; + "\u0004\u0001u\u0084\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ + "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ + "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ + "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0001\u0000\u0003\u0000"+ + " \b\u0000\u0001\u0000\u0003\u0000#\b\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001,\b"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001"+ + "\u0003\u0001\u0003\u0003\u00035\b\u0003\u0001\u0003\u0003\u00038\b\u0003"+ + "\u0001\u0003\u0003\u0003;\b\u0003\u0001\u0003\u0003\u0003>\b\u0003\u0001"+ + "\u0003\u0001\u0003\u0003\u0003B\b\u0003\u0001\u0003\u0003\u0003E\b\u0003"+ + "\u0001\u0003\u0003\u0003H\b\u0003\u0003\u0003J\b\u0003\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0003\b"+ + "Y\b\b\u0001\b\u0003\b\\\b\b\u0001\b\u0003\b_\b\b\u0001\t\u0001\t\u0001"+ + "\t\u0005\td\b\t\n\t\f\tg\t\t\u0001\n\u0001\n\u0003\nk\b\n\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0005"+ + "\fu\b\f\n\f\f\fx\t\f\u0001\r\u0001\r\u0001\r\u0005\r}\b\r\n\r\f\r\u0080"+ + "\t\r\u0001\u000e\u0001\u000e\u0001\u000e\u0000\u0000\u000f\u0000\u0002"+ + "\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u0000"+ + "\u0003\u0002\u0000\u0004\u0004\u000f\u000f\u0002\u0000\u000e\u0010\u0012"+ + "\u0012\u0002\u0000\u0011\u0011\u0013\u0013\u0089\u0000\u001f\u0001\u0000"+ + "\u0000\u0000\u0002\'\u0001\u0000\u0000\u0000\u00040\u0001\u0000\u0000"+ + "\u0000\u0006I\u0001\u0000\u0000\u0000\bK\u0001\u0000\u0000\u0000\nN\u0001"+ + "\u0000\u0000\u0000\fQ\u0001\u0000\u0000\u0000\u000eT\u0001\u0000\u0000"+ + "\u0000\u0010X\u0001\u0000\u0000\u0000\u0012`\u0001\u0000\u0000\u0000\u0014"+ + "h\u0001\u0000\u0000\u0000\u0016l\u0001\u0000\u0000\u0000\u0018p\u0001"+ + "\u0000\u0000\u0000\u001ay\u0001\u0000\u0000\u0000\u001c\u0081\u0001\u0000"+ + "\u0000\u0000\u001e \u0003\u001c\u000e\u0000\u001f\u001e\u0001\u0000\u0000"+ + "\u0000\u001f \u0001\u0000\u0000\u0000 \"\u0001\u0000\u0000\u0000!#\u0003"+ + "\u0002\u0001\u0000\"!\u0001\u0000\u0000\u0000\"#\u0001\u0000\u0000\u0000"+ + "#$\u0001\u0000\u0000\u0000$%\u0003\u0006\u0003\u0000%&\u0005\u0000\u0000"+ + "\u0001&\u0001\u0001\u0000\u0000\u0000\'+\u0005\u0001\u0000\u0000()\u0003"+ + "\u0004\u0002\u0000)*\u0005\u0002\u0000\u0000*,\u0001\u0000\u0000\u0000"+ + "+(\u0001\u0000\u0000\u0000+,\u0001\u0000\u0000\u0000,-\u0001\u0000\u0000"+ + "\u0000-.\u0003\u0004\u0002\u0000./\u0005\u0003\u0000\u0000/\u0003\u0001"+ + "\u0000\u0000\u000001\u0007\u0000\u0000\u00001\u0005\u0001\u0000\u0000"+ + "\u000025\u0003\b\u0004\u000035\u0003\n\u0005\u000042\u0001\u0000\u0000"+ + "\u000043\u0001\u0000\u0000\u000045\u0001\u0000\u0000\u000057\u0001\u0000"+ + "\u0000\u000068\u0003\f\u0006\u000076\u0001\u0000\u0000\u000078\u0001\u0000"+ + "\u0000\u00008:\u0001\u0000\u0000\u00009;\u0003\u000e\u0007\u0000:9\u0001"+ + "\u0000\u0000\u0000:;\u0001\u0000\u0000\u0000;J\u0001\u0000\u0000\u0000"+ + "<>\u0003\f\u0006\u0000=<\u0001\u0000\u0000\u0000=>\u0001\u0000\u0000\u0000"+ + ">A\u0001\u0000\u0000\u0000?B\u0003\b\u0004\u0000@B\u0003\n\u0005\u0000"+ + "A?\u0001\u0000\u0000\u0000A@\u0001\u0000\u0000\u0000AB\u0001\u0000\u0000"+ + "\u0000BD\u0001\u0000\u0000\u0000CE\u0003\u000e\u0007\u0000DC\u0001\u0000"+ + "\u0000\u0000DE\u0001\u0000\u0000\u0000EJ\u0001\u0000\u0000\u0000FH\u0003"+ + "\u0010\b\u0000GF\u0001\u0000\u0000\u0000GH\u0001\u0000\u0000\u0000HJ\u0001"+ + "\u0000\u0000\u0000I4\u0001\u0000\u0000\u0000I=\u0001\u0000\u0000\u0000"+ + "IG\u0001\u0000\u0000\u0000J\u0007\u0001\u0000\u0000\u0000KL\u0005\u0005"+ + "\u0000\u0000LM\u0003\u001a\r\u0000M\t\u0001\u0000\u0000\u0000NO\u0005"+ + "\u0006\u0000\u0000OP\u0003\u001a\r\u0000P\u000b\u0001\u0000\u0000\u0000"+ + "QR\u0005\u0007\u0000\u0000RS\u0003\u001a\r\u0000S\r\u0001\u0000\u0000"+ + "\u0000TU\u0005\b\u0000\u0000UV\u0007\u0001\u0000\u0000V\u000f\u0001\u0000"+ + "\u0000\u0000WY\u0003\u0012\t\u0000XW\u0001\u0000\u0000\u0000XY\u0001\u0000"+ + "\u0000\u0000Y[\u0001\u0000\u0000\u0000Z\\\u0003\u0016\u000b\u0000[Z\u0001"+ + "\u0000\u0000\u0000[\\\u0001\u0000\u0000\u0000\\^\u0001\u0000\u0000\u0000"+ + "]_\u0003\u0018\f\u0000^]\u0001\u0000\u0000\u0000^_\u0001\u0000\u0000\u0000"+ + "_\u0011\u0001\u0000\u0000\u0000`e\u0003\u0014\n\u0000ab\u0005\t\u0000"+ + "\u0000bd\u0003\u0014\n\u0000ca\u0001\u0000\u0000\u0000dg\u0001\u0000\u0000"+ + "\u0000ec\u0001\u0000\u0000\u0000ef\u0001\u0000\u0000\u0000f\u0013\u0001"+ + "\u0000\u0000\u0000ge\u0001\u0000\u0000\u0000hj\u0003\u001c\u000e\u0000"+ + "ik\u0003\f\u0006\u0000ji\u0001\u0000\u0000\u0000jk\u0001\u0000\u0000\u0000"+ + "k\u0015\u0001\u0000\u0000\u0000lm\u0005\u0001\u0000\u0000mn\u0003\u000e"+ + "\u0007\u0000no\u0005\u0003\u0000\u0000o\u0017\u0001\u0000\u0000\u0000"+ + "pq\u0005\n\u0000\u0000qv\u0003\u001a\r\u0000rs\u0005\u000b\u0000\u0000"+ + "su\u0003\u001a\r\u0000tr\u0001\u0000\u0000\u0000ux\u0001\u0000\u0000\u0000"+ + "vt\u0001\u0000\u0000\u0000vw\u0001\u0000\u0000\u0000w\u0019\u0001\u0000"+ + "\u0000\u0000xv\u0001\u0000\u0000\u0000y~\u0003\u001c\u000e\u0000z{\u0005"+ + "\f\u0000\u0000{}\u0003\u001c\u000e\u0000|z\u0001\u0000\u0000\u0000}\u0080"+ + "\u0001\u0000\u0000\u0000~|\u0001\u0000\u0000\u0000~\u007f\u0001\u0000"+ + "\u0000\u0000\u007f\u001b\u0001\u0000\u0000\u0000\u0080~\u0001\u0000\u0000"+ + "\u0000\u0081\u0082\u0007\u0002\u0000\u0000\u0082\u001d\u0001\u0000\u0000"+ + "\u0000\u0012\u001f\"+47:=ADGIX[^ejv~"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/DiagramDirectEditListener.java b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/DiagramDirectEditListener.java index 807ef3ad0..5cc9c3663 100644 --- a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/DiagramDirectEditListener.java +++ b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/DiagramDirectEditListener.java @@ -39,6 +39,7 @@ import org.eclipse.syson.services.grammars.DirectEditParser.RedefinitionExpressionContext; import org.eclipse.syson.services.grammars.DirectEditParser.SubsettingExpressionContext; import org.eclipse.syson.services.grammars.DirectEditParser.TriggerExpressionContext; +import org.eclipse.syson.services.grammars.DirectEditParser.TriggerExpressionNameContext; import org.eclipse.syson.services.grammars.DirectEditParser.TypingExpressionContext; import org.eclipse.syson.services.grammars.DirectEditParser.ValueExpressionContext; import org.eclipse.syson.sysml.AcceptActionUsage; @@ -49,7 +50,7 @@ import org.eclipse.syson.sysml.Definition; import org.eclipse.syson.sysml.Element; import org.eclipse.syson.sysml.Feature; -import org.eclipse.syson.sysml.FeatureMembership; +import org.eclipse.syson.sysml.FeatureDirectionKind; import org.eclipse.syson.sysml.FeatureTyping; import org.eclipse.syson.sysml.FeatureValue; import org.eclipse.syson.sysml.LiteralBoolean; @@ -60,8 +61,6 @@ import org.eclipse.syson.sysml.MultiplicityRange; import org.eclipse.syson.sysml.OwningMembership; import org.eclipse.syson.sysml.Redefinition; -import org.eclipse.syson.sysml.ReferenceUsage; -import org.eclipse.syson.sysml.Step; import org.eclipse.syson.sysml.Subclassification; import org.eclipse.syson.sysml.Subsetting; import org.eclipse.syson.sysml.SysmlFactory; @@ -456,24 +455,55 @@ public void exitValueExpression(ValueExpressionContext ctx) { } @Override - public void exitTriggerExpression(TriggerExpressionContext ctx) { + public void enterTriggerExpression(TriggerExpressionContext ctx) { if (this.options.contains(LabelService.TRANSITION_EXPRESSION_OFF)) { return; } if (this.element instanceof TransitionUsage transition) { this.utilService.removeTransitionFeaturesOfSpecificKind(transition, TransitionFeatureKind.TRIGGER); this.getVisitedTransitionFeatures().put(TransitionFeatureKind.TRIGGER, true); - this.handleTriggerExpression(transition, ctx); + } + super.enterTriggerExpression(ctx); + } + + @Override + public void exitTriggerExpression(TriggerExpressionContext ctx) { + if (this.options.contains(LabelService.TRANSITION_EXPRESSION_OFF)) { + return; + } + if (this.element instanceof TransitionUsage transition) { + this.getVisitedTransitionFeatures().put(TransitionFeatureKind.TRIGGER, true); } super.exitTriggerExpression(ctx); } - private void handleTriggerExpression(TransitionUsage transition, TriggerExpressionContext triggerExpression) { - triggerExpression.qualifiedName().stream().forEach(identifier -> { - var name = identifier.getText(); - var actionUsage = this.utilService.findByNameAndType(this.element, name, ActionUsage.class); - this.addTransitionFeature(transition, TransitionFeatureKind.TRIGGER, actionUsage); - }); + @Override + public void exitTriggerExpressionName(TriggerExpressionNameContext ctx) { + if (this.options.contains(LabelService.TRANSITION_EXPRESSION_OFF)) { + return; + } + if (this.element instanceof TransitionUsage transition) { + this.handleTriggerExpressionName(transition, ctx); + } + super.exitTriggerExpressionName(ctx); + } + + private void handleTriggerExpressionName(TransitionUsage transition, TriggerExpressionNameContext triggerExpressionName) { + String name = triggerExpressionName.name().getText(); + TypingExpressionContext typingExpression = triggerExpressionName.typingExpression(); + String type; + if (typingExpression != null) { + // Here the user have provided both a name and a type + type = typingExpression.qualifiedName().getText(); + } else { + // Here only a type is provided, name is considered null + type = name; + name = null; + } + var typeValue = this.utilService.findByNameAndType(this.element, type, Type.class); + if (typeValue != null) { + this.addTransitionFeature(transition, TransitionFeatureKind.TRIGGER, name, typeValue); + } } @Override @@ -493,31 +523,80 @@ private void handleEffectExpression(TransitionUsage transition, EffectExpression effectExpression.qualifiedName().stream().forEach(identifier -> { var name = identifier.getText(); var actionUsage = this.utilService.findByNameAndType(this.element, name, ActionUsage.class); - this.addTransitionFeature(transition, TransitionFeatureKind.EFFECT, actionUsage); + if (actionUsage != null) { + this.addTransitionFeature(transition, TransitionFeatureKind.EFFECT, null, actionUsage); + } }); } - private void addTransitionFeature(TransitionUsage transition, TransitionFeatureKind kind, Step au) { + private void addTransitionFeature(TransitionUsage transition, TransitionFeatureKind kind, String name, Type typeValue) { TransitionFeatureMembership tfMembership = SysmlFactory.eINSTANCE.createTransitionFeatureMembership(); tfMembership.setKind(kind); - transition.getOwnedRelationship().add(tfMembership); if (kind.equals(TransitionFeatureKind.TRIGGER)) { + // Add the root membership + transition.getOwnedRelationship().add(tfMembership); + AcceptActionUsage acceptActionUsage = SysmlFactory.eINSTANCE.createAcceptActionUsage(); tfMembership.getOwnedRelatedElement().add(acceptActionUsage); tfMembership.setFeature(acceptActionUsage); - ReferenceUsage refUsage = SysmlFactory.eINSTANCE.createReferenceUsage(); - FeatureMembership refFeatureFromAcceptActionUsage = SysmlFactory.eINSTANCE.createFeatureMembership(); - refFeatureFromAcceptActionUsage.getOwnedRelatedElement().add(refUsage); - acceptActionUsage.getOwnedRelationship().add(refFeatureFromAcceptActionUsage); + // Set AcceptActionUsage payload as first Parameter. See paragraph 7.16.8 + var payloadParam = SysmlFactory.eINSTANCE.createParameterMembership(); + acceptActionUsage.getOwnedRelationship().add(payloadParam); - FeatureMembership refFeatureFromRefUsage = SysmlFactory.eINSTANCE.createFeatureMembership(); - refFeatureFromRefUsage.getTarget().add(au); - refUsage.getOwnedRelationship().add(refFeatureFromRefUsage); + // create the reference usage to be contained in the parameter membership + var payloadRef = SysmlFactory.eINSTANCE.createReferenceUsage(); + payloadRef.setDirection(FeatureDirectionKind.INOUT); + payloadParam.getOwnedRelatedElement().add(payloadRef); + if (name != null) { + payloadRef.setDeclaredName(name); + } else { + payloadRef.setDeclaredName("payload"); + } + + var ft = SysmlFactory.eINSTANCE.createFeatureTyping(); + payloadRef.getOwnedRelationship().add(ft); + ft.setType(typeValue); + + // Set AcceptActionUsage receiver as second Parameter + var receiverParam = SysmlFactory.eINSTANCE.createParameterMembership(); + acceptActionUsage.getOwnedRelationship().add(receiverParam); + + // create the reference usage to be contained in the parameter membership + var receiverRef = SysmlFactory.eINSTANCE.createReferenceUsage(); + receiverRef.setDirection(FeatureDirectionKind.IN); + receiverParam.getOwnedRelatedElement().add(receiverRef); + + // create the feature value relationship to be contained inside the reference usage + var receiverFeatureVal = SysmlFactory.eINSTANCE.createFeatureValue(); + receiverRef.getOwnedRelationship().add(receiverFeatureVal); + + // create the feature reference expression to be contained inside the feature value relationship + var receiverFeatureRefExpr = SysmlFactory.eINSTANCE.createFeatureReferenceExpression(); + receiverFeatureVal.getOwnedRelatedElement().add(receiverFeatureRefExpr); + + // find or create the membership relationship contained inside the feature reference expression + var receiverMembership = SysmlFactory.eINSTANCE.createMembership(); + receiverFeatureRefExpr.getOwnedRelationship().add(receiverMembership); + Type containerPart = this.utilService.getReceiverContainerDefinitionOrUsage(acceptActionUsage); + receiverMembership.setMemberElement(containerPart); + + // find or create the return parameter membership relationship contained inside the feature reference + // expression + var receiverReturn = SysmlFactory.eINSTANCE.createReturnParameterMembership(); + receiverFeatureRefExpr.getOwnedRelationship().add(receiverReturn); + + // find or create the feature contained inside the parameter membership relationship + var receiverFeature = SysmlFactory.eINSTANCE.createFeature(); + receiverFeature.setDirection(FeatureDirectionKind.OUT); + receiverReturn.getOwnedRelatedElement().add(receiverFeature); } else { - tfMembership.setFeature(au); + if (typeValue instanceof ActionUsage au) { + tfMembership.setFeature(au); + transition.getOwnedRelationship().add(tfMembership); + } } - this.importService.handleImport(this.element, au); + this.importService.handleImport(this.element, typeValue); } @Override diff --git a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/RelatedElementsSwitch.java b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/RelatedElementsSwitch.java index 021f714dc..a90e9c2e5 100644 --- a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/RelatedElementsSwitch.java +++ b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/RelatedElementsSwitch.java @@ -18,11 +18,16 @@ import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.syson.sysml.ActionUsage; import org.eclipse.syson.sysml.Dependency; import org.eclipse.syson.sysml.Element; +import org.eclipse.syson.sysml.EndFeatureMembership; +import org.eclipse.syson.sysml.Feature; +import org.eclipse.syson.sysml.FeatureMembership; import org.eclipse.syson.sysml.FeatureTyping; import org.eclipse.syson.sysml.Membership; import org.eclipse.syson.sysml.Redefinition; +import org.eclipse.syson.sysml.ReferenceSubsetting; import org.eclipse.syson.sysml.Subclassification; import org.eclipse.syson.sysml.Succession; import org.eclipse.syson.sysml.SysmlPackage; @@ -83,6 +88,19 @@ public Set caseRedefinition(Redefinition object) { return relatedElements; } + @Override + public Set caseReferenceSubsetting(ReferenceSubsetting object) { + Set relatedElements = new HashSet<>(); + if (object.getReferencedFeature() instanceof ActionUsage && object.eContainer() instanceof Feature feat) { + if (feat.eContainer() instanceof EndFeatureMembership efm && efm.eContainer() instanceof Succession succ) { + if (succ.eContainer() instanceof FeatureMembership fm && fm.eContainer() instanceof TransitionUsage tu) { + relatedElements.add(tu); + } + } + } + return relatedElements; + } + @Override public Set caseSubclassification(Subclassification object) { Set relatedElements = new HashSet<>(); @@ -97,6 +115,11 @@ public Set caseSuccession(Succession object) { Set relatedElements = new HashSet<>(); if (this.eStructuralFeature.equals(SysmlPackage.eINSTANCE.getRelationship_Target()) || this.eStructuralFeature.equals(SysmlPackage.eINSTANCE.getRelationship_Source())) { + // Handle the case where the succession source or target has already been deleted + if ((!object.getSource().isEmpty() && object.getSource().get(0).getOwner() == null) + || (!object.getTarget().isEmpty() && object.getTarget().get(0).getOwner() == null)) { + return relatedElements; + } relatedElements.add(object); if (object.eContainer() instanceof Membership membership) { relatedElements.add(membership); diff --git a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/UtilService.java b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/UtilService.java index a5f3c441f..2ea8b539d 100644 --- a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/UtilService.java +++ b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/UtilService.java @@ -27,6 +27,8 @@ import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.syson.sysml.AcceptActionUsage; +import org.eclipse.syson.sysml.Definition; import org.eclipse.syson.sysml.Element; import org.eclipse.syson.sysml.Package; import org.eclipse.syson.sysml.PartUsage; @@ -34,6 +36,7 @@ import org.eclipse.syson.sysml.TransitionFeatureKind; import org.eclipse.syson.sysml.TransitionFeatureMembership; import org.eclipse.syson.sysml.TransitionUsage; +import org.eclipse.syson.sysml.Type; import org.eclipse.syson.sysml.Usage; import org.eclipse.syson.util.SysMLMetamodelHelper; import org.eclipse.syson.util.SysONEContentAdapter; @@ -78,6 +81,30 @@ public PartUsage getContainerPart(PortUsage portUsage) { return containerPart; } + /** + * When an accept action usage is directly or indirectly a composite feature of a part definition or usage, then the + * default for the receiver (via) of the accept action usage is the containing part, not the accept action itself. + * This is known as the default accepting context. + * + * @param aau + * the acceptActionUsage {@link AcceptActionUsage}. + * @return the first container that is a {@link Definition} or a {@link Usage} for the given + * {@link AcceptActionUsage} if found, null otherwise. + */ + public Type getReceiverContainerDefinitionOrUsage(AcceptActionUsage aau) { + EObject container = aau.eContainer(); + while (container != null) { + if (container instanceof Definition || container instanceof Usage) { + break; + } + container = container.eContainer(); + } + if (container instanceof Definition || container instanceof Usage) { + return (Type) container; + } + return null; + } + /** * Get all reachable elements of a type in the {@link ResourceSet} of given {@link EObject}. * diff --git a/backend/services/syson-services/src/main/resources/DirectEdit.g4 b/backend/services/syson-services/src/main/resources/DirectEdit.g4 index ec89200ce..bba87b473 100644 --- a/backend/services/syson-services/src/main/resources/DirectEdit.g4 +++ b/backend/services/syson-services/src/main/resources/DirectEdit.g4 @@ -63,11 +63,15 @@ valueExpression : ; transitionExpression : - (triggerExpression)? (effectExpression)? + (triggerExpression)? (guardExpression)? (effectExpression)? ; triggerExpression : - qualifiedName ('|' qualifiedName)* + triggerExpressionName ('|' triggerExpressionName)* +; + +triggerExpressionName : + name (typingExpression)? ; guardExpression : diff --git a/backend/views/syson-diagram-statetransition-view/src/main/java/org/eclipse/syson/diagram/statetransition/view/services/StateTransitionViewEdgeService.java b/backend/views/syson-diagram-statetransition-view/src/main/java/org/eclipse/syson/diagram/statetransition/view/services/StateTransitionViewEdgeService.java index 1285cf4f5..677611f30 100644 --- a/backend/views/syson-diagram-statetransition-view/src/main/java/org/eclipse/syson/diagram/statetransition/view/services/StateTransitionViewEdgeService.java +++ b/backend/views/syson-diagram-statetransition-view/src/main/java/org/eclipse/syson/diagram/statetransition/view/services/StateTransitionViewEdgeService.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.syson.diagram.statetransition.view.services; +import java.util.List; import java.util.Objects; import java.util.function.BinaryOperator; @@ -31,8 +32,10 @@ import org.eclipse.syson.sysml.AcceptActionUsage; import org.eclipse.syson.sysml.ActionUsage; import org.eclipse.syson.sysml.Element; +import org.eclipse.syson.sysml.EndFeatureMembership; import org.eclipse.syson.sysml.Expression; -import org.eclipse.syson.sysml.FeatureMembership; +import org.eclipse.syson.sysml.Membership; +import org.eclipse.syson.sysml.ReferenceSubsetting; import org.eclipse.syson.sysml.Succession; import org.eclipse.syson.sysml.TransitionFeatureKind; import org.eclipse.syson.sysml.TransitionUsage; @@ -152,21 +155,27 @@ public Element editTransitionEdgeLabel(TransitionUsage element, String newLabel) * @return the given {@link TransitionUsage}. */ public TransitionUsage setTransitionSource(TransitionUsage transition, ActionUsage newSource) { - ActionUsage currentSource = transition.getSource(); // Update transition source - transition.getOwnedRelationship().stream() - .filter(FeatureMembership.class::isInstance) - .map(FeatureMembership.class::cast) + transition.getOwnedMembership().stream() + .filter(Membership.class::isInstance) + .map(Membership.class::cast) .findFirst() .ifPresent(mem -> mem.setMemberElement(newSource)); // Update succession source Succession succession = transition.getSuccession(); - succession.getSource().replaceAll(e -> { - if (e.equals(currentSource)) { - return newSource; - } - return e; - }); + succession.getFeatureMembership().stream() + .filter(EndFeatureMembership.class::isInstance) + .map(EndFeatureMembership.class::cast) + .findFirst() + .ifPresent(endFeat -> { + endFeat.getOwnedRelatedElement().stream() + .findFirst() + .ifPresent(feat -> feat.getOwnedRelationship().stream() + .filter(ReferenceSubsetting.class::isInstance) + .map(ReferenceSubsetting.class::cast) + .findFirst() + .ifPresent(refSub -> refSub.setReferencedFeature(newSource))); + }); return transition; } @@ -181,15 +190,21 @@ public TransitionUsage setTransitionSource(TransitionUsage transition, ActionUsa * @return the given {@link TransitionUsage}. */ public TransitionUsage setTransitionTarget(TransitionUsage transition, ActionUsage newTarget) { - ActionUsage currentTarget = transition.getTarget(); // Update succession target Succession succession = transition.getSuccession(); - succession.getTarget().replaceAll(e -> { - if (e.equals(currentTarget)) { - return newTarget; - } - return e; - }); + List succFeatMemberships = succession.getFeatureMembership().stream() + .filter(EndFeatureMembership.class::isInstance) + .map(EndFeatureMembership.class::cast) + .toList(); + if (succFeatMemberships.size() > 1) { + succFeatMemberships.get(1).getOwnedRelatedElement().stream() + .findFirst() + .ifPresent(feat -> feat.getOwnedRelationship().stream() + .filter(ReferenceSubsetting.class::isInstance) + .map(ReferenceSubsetting.class::cast) + .findFirst() + .ifPresent(refSub -> refSub.setReferencedFeature(newTarget))); + } return transition; } diff --git a/backend/views/syson-diagram-statetransition-view/src/main/java/org/eclipse/syson/diagram/statetransition/view/services/StateTransitionViewToolService.java b/backend/views/syson-diagram-statetransition-view/src/main/java/org/eclipse/syson/diagram/statetransition/view/services/StateTransitionViewToolService.java index 88817ea4e..80482f062 100644 --- a/backend/views/syson-diagram-statetransition-view/src/main/java/org/eclipse/syson/diagram/statetransition/view/services/StateTransitionViewToolService.java +++ b/backend/views/syson-diagram-statetransition-view/src/main/java/org/eclipse/syson/diagram/statetransition/view/services/StateTransitionViewToolService.java @@ -29,6 +29,8 @@ import org.eclipse.syson.sysml.ActionUsage; import org.eclipse.syson.sysml.Definition; import org.eclipse.syson.sysml.Element; +import org.eclipse.syson.sysml.EndFeatureMembership; +import org.eclipse.syson.sysml.Feature; import org.eclipse.syson.sysml.StateDefinition; import org.eclipse.syson.sysml.StateUsage; import org.eclipse.syson.sysml.Succession; @@ -130,11 +132,14 @@ public ActionUsage createTransitionUsage(ActionUsage sourceAction, ActionUsage t // Check source and target have the same parent Element sourceParentElement = sourceAction.getOwner(); Element targetParentElement = targetAction.getOwner(); - if (sourceParentElement != targetParentElement) { + if (sourceParentElement != targetParentElement + // Handle the case where source state or target state is a Parallel state + || isParallelState(sourceAction) || isParallelState(targetAction)) { // Should probably not be here as the transition creation should not be allowed. return sourceAction; } // Create transition usage and add it to the parent element + // sourceParentElement <>-> FeatureMembership -> RelatedElement = TransitionUsage TransitionUsage newTransitionUsage = SysmlFactory.eINSTANCE.createTransitionUsage(); this.elementInitializerSwitch.doSwitch(newTransitionUsage); var featureMembership = SysmlFactory.eINSTANCE.createFeatureMembership(); @@ -142,34 +147,60 @@ public ActionUsage createTransitionUsage(ActionUsage sourceAction, ActionUsage t sourceParentElement.getOwnedRelationship().add(featureMembership); // Create EndFeature - var sourceMembership = SysmlFactory.eINSTANCE.createFeatureMembership(); + // TransitionUsage <>-> Membership -> MemberElement = sourceAction + var sourceMembership = SysmlFactory.eINSTANCE.createMembership(); newTransitionUsage.getOwnedRelationship().add(sourceMembership); sourceMembership.setMemberElement(sourceAction); // Create Succession + // TransitionUsage <>-> FeatureMembership -> RelatedElement = succession Succession succession = SysmlFactory.eINSTANCE.createSuccession(); this.elementInitializerSwitch.doSwitch(succession); var successionFeatureMembership = SysmlFactory.eINSTANCE.createFeatureMembership(); successionFeatureMembership.getOwnedRelatedElement().add(succession); newTransitionUsage.getOwnedRelationship().add(successionFeatureMembership); - // Set Succession - succession.getSource().add(sourceAction); - succession.getTarget().add(targetAction); + // Set Succession Source and Target Features + succession.getOwnedRelationship().add(createConnectorEndFeatureMembership(sourceAction)); + succession.getOwnedRelationship().add(createConnectorEndFeatureMembership(targetAction)); return sourceAction; } + /** + * <>-> EndFeatureMembership -> RelatedElement = Feature <>-> ReferenceSubsetting -> ReferencedFeature = feature + * + * @param feature The feature to reference subset + * @return + */ + private EndFeatureMembership createConnectorEndFeatureMembership(Feature feature) { + var successionSourceEndFeatureMembership = SysmlFactory.eINSTANCE.createEndFeatureMembership(); + var successionSourceEndFeatureFeature = SysmlFactory.eINSTANCE.createFeature(); + successionSourceEndFeatureMembership.getOwnedRelatedElement().add(successionSourceEndFeatureFeature); + + var successionSourceRefSubsetting = SysmlFactory.eINSTANCE.createReferenceSubsetting(); + successionSourceRefSubsetting.setReferencedFeature(feature); + successionSourceEndFeatureFeature.getOwnedRelationship().add(successionSourceRefSubsetting); + return successionSourceEndFeatureMembership; + } + + private boolean isParallelState(ActionUsage action) { + return action instanceof StateUsage su && su.isIsParallel(); + } + @Override public Usage addExistingSubElements(Usage usage, IEditingContext editingContext, IDiagramContext diagramContext, Node selectedNode, Object parentNode, DiagramDescription diagramDescription, Map convertedNodes) { - var nestedUsages = usage.getNestedUsage(); - - nestedUsages.stream().forEach(subUsage -> { - this.createView(subUsage, editingContext, diagramContext, selectedNode, convertedNodes); - Node fakeNode = this.createFakeNode(subUsage, selectedNode, diagramContext, diagramDescription, convertedNodes); - this.addExistingSubElements(subUsage, editingContext, diagramContext, fakeNode, selectedNode, diagramDescription, convertedNodes); - }); + if (!(usage instanceof StateUsage)) { + var nestedUsages = usage.getNestedUsage(); + + nestedUsages.stream() + .forEach(subUsage -> { + this.createView(subUsage, editingContext, diagramContext, selectedNode, convertedNodes); + Node fakeNode = this.createFakeNode(subUsage, selectedNode, diagramContext, diagramDescription, convertedNodes); + this.addExistingSubElements(subUsage, editingContext, diagramContext, fakeNode, selectedNode, diagramDescription, convertedNodes); + }); + } return usage; } diff --git a/backend/views/syson-diagram-statetransition-view/src/main/java/org/eclipse/syson/diagram/statetransition/view/tools/StateUsageCompartmentNodeToolProvider.java b/backend/views/syson-diagram-statetransition-view/src/main/java/org/eclipse/syson/diagram/statetransition/view/tools/StateUsageCompartmentNodeToolProvider.java index 463784a61..228c0e827 100644 --- a/backend/views/syson-diagram-statetransition-view/src/main/java/org/eclipse/syson/diagram/statetransition/view/tools/StateUsageCompartmentNodeToolProvider.java +++ b/backend/views/syson-diagram-statetransition-view/src/main/java/org/eclipse/syson/diagram/statetransition/view/tools/StateUsageCompartmentNodeToolProvider.java @@ -40,9 +40,9 @@ protected String getServiceCallExpression() { @Override protected String getNodeToolName() { if (this.isParallel) { - return "Parallel"; + return "New Parallel State"; } else { - return "State"; + return "New State"; } }