Skip to content

Commit 37063f9

Browse files
adaussyAxelRICHARD
authored andcommitted
[1252] Implement textual export of TriggerInvocationExpression
Bug: #1252 Signed-off-by: Arthur Daussy <[email protected]>
1 parent 6f42a56 commit 37063f9

File tree

4 files changed

+86
-109
lines changed

4 files changed

+86
-109
lines changed

CHANGELOG.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
- https://github.com/eclipse-syson/syson/issues/1249[#1249] [import][export] Implement textual import/export of `AcceptActionUsage`.
2323
- https://github.com/eclipse-syson/syson/issues/1247[#1247] [explorer] Type new `ViewUsage` from _Explorer_ view with _General View_ `ViewDefinition`.
2424
When end-users click on _New Object_ on a semantic element, and select a `ViewUsage`, then a `ViewUsage` typed by default with the _General View_ `ViewDefinition` from the standard library will be created.
25+
- https://github.com/eclipse-syson/syson/issues/1252[#1252] [exort] Implement textual export of `TriggerInvocationExpression`.
2526

2627
=== New features
2728

backend/application/syson-application/src/test/java/org/eclipse/syson/application/export/ImportExportTests.java

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -221,16 +221,25 @@ public void checkTransitionUsageBetweenActions() throws IOException {
221221
@DisplayName("Given a model with AcceptActionUsage, when importing/exporting the file, then the exported text file should be the same as the imported one.")
222222
public void checkAcceptActionUsage() throws IOException {
223223
var input = """
224-
action a1 {
225-
item def S1;
226-
item def S2;
227-
item def S3;
228-
port p1;
229-
port p2;
230-
port p3;
231-
action a1 accept s1 : S1 via p1;
232-
action a2 accept S2 via p2;
233-
accept S3 via p3;
224+
part part1 {
225+
private import SI::*;
226+
private import ScalarValues::*;
227+
action b {
228+
attribute f : Boolean;
229+
}
230+
action a1 {
231+
item def S1;
232+
item def S2;
233+
item def S3;
234+
port p1;
235+
port p2;
236+
port p3;
237+
action a1 accept s1 : S1 via p1;
238+
action a2 accept S2 via p2;
239+
accept S3 via p3;
240+
accept after 5 [minute];
241+
accept when b.f;
242+
}
234243
}""";
235244
this.checker.check(input, input);
236245
}

backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/textual/SysMLElementSerializer.java

Lines changed: 52 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static org.eclipse.syson.sysml.textual.utils.SysMLRelationPredicates.IS_MEMBERSHIP;
1919
import static org.eclipse.syson.sysml.textual.utils.SysMLRelationPredicates.IS_METADATA_USAGE;
2020

21+
import java.lang.Class;
2122
import java.util.ArrayList;
2223
import java.util.Collection;
2324
import java.util.HashSet;
@@ -34,105 +35,8 @@
3435
import org.eclipse.emf.common.util.EList;
3536
import org.eclipse.emf.ecore.EObject;
3637
import org.eclipse.emf.ecore.InternalEObject;
37-
import org.eclipse.syson.sysml.AcceptActionUsage;
38-
import org.eclipse.syson.sysml.ActionDefinition;
39-
import org.eclipse.syson.sysml.ActionUsage;
40-
import org.eclipse.syson.sysml.ActorMembership;
41-
import org.eclipse.syson.sysml.AnalysisCaseUsage;
42-
import org.eclipse.syson.sysml.AssertConstraintUsage;
43-
import org.eclipse.syson.sysml.AttributeDefinition;
44-
import org.eclipse.syson.sysml.AttributeUsage;
45-
import org.eclipse.syson.sysml.CalculationDefinition;
46-
import org.eclipse.syson.sysml.Classifier;
47-
import org.eclipse.syson.sysml.CollectExpression;
48-
import org.eclipse.syson.sysml.Comment;
49-
import org.eclipse.syson.sysml.ConjugatedPortDefinition;
50-
import org.eclipse.syson.sysml.ConjugatedPortTyping;
51-
import org.eclipse.syson.sysml.ConstraintUsage;
52-
import org.eclipse.syson.sysml.ControlNode;
53-
import org.eclipse.syson.sysml.DecisionNode;
54-
import org.eclipse.syson.sysml.Definition;
55-
import org.eclipse.syson.sysml.Documentation;
56-
import org.eclipse.syson.sysml.Element;
57-
import org.eclipse.syson.sysml.EndFeatureMembership;
58-
import org.eclipse.syson.sysml.EnumerationDefinition;
59-
import org.eclipse.syson.sysml.EnumerationUsage;
60-
import org.eclipse.syson.sysml.Expression;
61-
import org.eclipse.syson.sysml.Feature;
62-
import org.eclipse.syson.sysml.FeatureChainExpression;
63-
import org.eclipse.syson.sysml.FeatureChaining;
64-
import org.eclipse.syson.sysml.FeatureDirectionKind;
65-
import org.eclipse.syson.sysml.FeatureMembership;
66-
import org.eclipse.syson.sysml.FeatureReferenceExpression;
67-
import org.eclipse.syson.sysml.FeatureTyping;
68-
import org.eclipse.syson.sysml.FeatureValue;
69-
import org.eclipse.syson.sysml.ForkNode;
70-
import org.eclipse.syson.sysml.Import;
71-
import org.eclipse.syson.sysml.IncludeUseCaseUsage;
72-
import org.eclipse.syson.sysml.InterfaceDefinition;
73-
import org.eclipse.syson.sysml.InvocationExpression;
74-
import org.eclipse.syson.sysml.ItemDefinition;
75-
import org.eclipse.syson.sysml.ItemUsage;
76-
import org.eclipse.syson.sysml.JoinNode;
77-
import org.eclipse.syson.sysml.LibraryPackage;
78-
import org.eclipse.syson.sysml.LiteralBoolean;
79-
import org.eclipse.syson.sysml.LiteralExpression;
80-
import org.eclipse.syson.sysml.LiteralInfinity;
81-
import org.eclipse.syson.sysml.LiteralInteger;
82-
import org.eclipse.syson.sysml.LiteralRational;
83-
import org.eclipse.syson.sysml.LiteralString;
84-
import org.eclipse.syson.sysml.Membership;
85-
import org.eclipse.syson.sysml.MembershipImport;
86-
import org.eclipse.syson.sysml.MergeNode;
87-
import org.eclipse.syson.sysml.Metaclass;
88-
import org.eclipse.syson.sysml.MetadataAccessExpression;
89-
import org.eclipse.syson.sysml.MetadataDefinition;
90-
import org.eclipse.syson.sysml.MetadataUsage;
91-
import org.eclipse.syson.sysml.MultiplicityRange;
92-
import org.eclipse.syson.sysml.Namespace;
93-
import org.eclipse.syson.sysml.NamespaceImport;
94-
import org.eclipse.syson.sysml.NullExpression;
95-
import org.eclipse.syson.sysml.ObjectiveMembership;
96-
import org.eclipse.syson.sysml.OccurrenceDefinition;
97-
import org.eclipse.syson.sysml.OccurrenceUsage;
98-
import org.eclipse.syson.sysml.OperatorExpression;
99-
import org.eclipse.syson.sysml.OwningMembership;
38+
import org.eclipse.syson.sysml.*;
10039
import org.eclipse.syson.sysml.Package;
101-
import org.eclipse.syson.sysml.ParameterMembership;
102-
import org.eclipse.syson.sysml.PartDefinition;
103-
import org.eclipse.syson.sysml.PartUsage;
104-
import org.eclipse.syson.sysml.PerformActionUsage;
105-
import org.eclipse.syson.sysml.PortDefinition;
106-
import org.eclipse.syson.sysml.PortUsage;
107-
import org.eclipse.syson.sysml.PortionKind;
108-
import org.eclipse.syson.sysml.Redefinition;
109-
import org.eclipse.syson.sysml.ReferenceSubsetting;
110-
import org.eclipse.syson.sysml.ReferenceUsage;
111-
import org.eclipse.syson.sysml.Relationship;
112-
import org.eclipse.syson.sysml.RequirementDefinition;
113-
import org.eclipse.syson.sysml.RequirementUsage;
114-
import org.eclipse.syson.sysml.ReturnParameterMembership;
115-
import org.eclipse.syson.sysml.SatisfyRequirementUsage;
116-
import org.eclipse.syson.sysml.SelectExpression;
117-
import org.eclipse.syson.sysml.Specialization;
118-
import org.eclipse.syson.sysml.StakeholderMembership;
119-
import org.eclipse.syson.sysml.StateUsage;
120-
import org.eclipse.syson.sysml.Subclassification;
121-
import org.eclipse.syson.sysml.SubjectMembership;
122-
import org.eclipse.syson.sysml.Subsetting;
123-
import org.eclipse.syson.sysml.SuccessionAsUsage;
124-
import org.eclipse.syson.sysml.SysmlPackage;
125-
import org.eclipse.syson.sysml.TextualRepresentation;
126-
import org.eclipse.syson.sysml.TransitionFeatureKind;
127-
import org.eclipse.syson.sysml.TransitionFeatureMembership;
128-
import org.eclipse.syson.sysml.TransitionUsage;
129-
import org.eclipse.syson.sysml.Type;
130-
import org.eclipse.syson.sysml.Usage;
131-
import org.eclipse.syson.sysml.UseCaseDefinition;
132-
import org.eclipse.syson.sysml.UseCaseUsage;
133-
import org.eclipse.syson.sysml.VerificationCaseUsage;
134-
import org.eclipse.syson.sysml.ViewpointDefinition;
135-
import org.eclipse.syson.sysml.VisibilityKind;
13640
import org.eclipse.syson.sysml.helper.EMFUtils;
13741
import org.eclipse.syson.sysml.helper.LabelConstants;
13842
import org.eclipse.syson.sysml.textual.utils.Appender;
@@ -1040,6 +944,23 @@ public String caseTransitionUsage(TransitionUsage transitionUsage) {
1040944
return builder.toString();
1041945
}
1042946

947+
@Override
948+
public String caseTriggerInvocationExpression(TriggerInvocationExpression triggerInvocationExpression) {
949+
var builder = this.newAppender();
950+
951+
builder.append(triggerInvocationExpression.getKind().toString().toLowerCase());
952+
if (triggerInvocationExpression.getKind() == TriggerKind.WHEN) {
953+
for (Expression argument : triggerInvocationExpression.getArgument()) {
954+
this.appendArgumentExpression(builder, argument);
955+
}
956+
} else {
957+
for (Feature parameter : triggerInvocationExpression.getParameter()) {
958+
this.appendArgument(builder, parameter);
959+
}
960+
}
961+
return builder.toString();
962+
}
963+
1043964
@Override
1044965
public String caseUseCaseDefinition(UseCaseDefinition useCase) {
1045966
Appender builder = this.newAppender();
@@ -2071,13 +1992,24 @@ private void appendAcceptParameterPart(Appender builder, AcceptActionUsage accep
20711992
if (!parameters.isEmpty()) {
20721993
ReferenceUsage payload = acceptActionUsage.getPayloadParameter();
20731994
Appender payloadBuilder = this.newAppender();
1995+
// Payload feature
20741996
this.appendUsageDeclaration(payloadBuilder, payload);
20751997
if (payloadBuilder.toString().startsWith(": ")) {
2076-
// Set the type only
1998+
// The type only is defined. To avoid the valid but not pretty notation " : X", we skip the heading ":"
20771999
builder.appendWithSpaceIfNeeded(payloadBuilder.toString().substring(2));
20782000
} else {
20792001
builder.appendWithSpaceIfNeeded(payloadBuilder.toString());
20802002
}
2003+
2004+
Expression payloadArgument = acceptActionUsage.getPayloadArgument();
2005+
2006+
if (payloadArgument != null) {
2007+
String payloadArgStr = this.doSwitch(payloadArgument);
2008+
if (payloadArgStr != null) {
2009+
builder.appendWithSpaceIfNeeded(payloadArgStr);
2010+
}
2011+
}
2012+
20812013
this.childrenMembershipToSkip.add(parameters.get(0).getOwningMembership());
20822014

20832015
if (parameters.size() > 1) {
@@ -2259,4 +2191,25 @@ private void appendControlNode(Appender appender, ControlNode controlNode, Strin
22592191
this.appendUsageDeclaration(appender, controlNode);
22602192
this.appendActionNodeBody(appender, controlNode);
22612193
}
2194+
2195+
private void appendArgument(Appender builder, Feature parameter) {
2196+
FeatureValue valuation = parameter.getValuation();
2197+
if (valuation != null) {
2198+
builder.appendWithSpaceIfNeeded(this.doSwitch(valuation.getValue()));
2199+
}
2200+
}
2201+
2202+
private void appendArgumentExpression(Appender builder, Expression argument) {
2203+
if (argument instanceof FeatureReferenceExpression refExpression) {
2204+
Expression expression = refExpression.getOwnedFeatureMembership().stream()
2205+
.map(FeatureMembership::getMemberElement)
2206+
.filter(Expression.class::isInstance)
2207+
.map(Expression.class::cast)
2208+
.findFirst()
2209+
.orElse(null);
2210+
if (expression != null) {
2211+
builder.appendWithSpaceIfNeeded(this.doSwitch(expression));
2212+
}
2213+
}
2214+
}
22622215
}

doc/content/modules/user-manual/pages/release-notes/2025.6.0.adoc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,20 @@ action a1 {
100100
- Type new `ViewUsage` from _Explorer_ view with _General View_ `ViewDefinition`.
101101
When end-users click on _New Object_ on a semantic element, and select a `ViewUsage`, then a `ViewUsage` typed by default with the _General View_ `ViewDefinition` from the standard library will be created.
102102

103+
- Implement textual export of `TriggerInvocationExpression` such as in the following `TransitionUsage` using as a trigger a `TriggerInvocationExpression`:
104+
105+
```
106+
part part1 {
107+
private import ScalarValues::*;
108+
action b {
109+
attribute f : Boolean;
110+
}
111+
action a1 {
112+
accept when b.f; // <- AcceptActionUsage using a TriggerInvocationExpression : when b.f
113+
}
114+
}
115+
```
116+
103117
== Dependency update
104118

105119
== Technical details

0 commit comments

Comments
 (0)