|
128 | 128 | import org.eclipse.syson.sysml.SelectExpression; |
129 | 129 | import org.eclipse.syson.sysml.Specialization; |
130 | 130 | import org.eclipse.syson.sysml.StakeholderMembership; |
| 131 | +import org.eclipse.syson.sysml.StateDefinition; |
| 132 | +import org.eclipse.syson.sysml.StateSubactionMembership; |
131 | 133 | import org.eclipse.syson.sysml.StateUsage; |
132 | 134 | import org.eclipse.syson.sysml.Subclassification; |
133 | 135 | import org.eclipse.syson.sysml.SubjectMembership; |
@@ -228,13 +230,24 @@ public String caseActionDefinition(ActionDefinition actionDef) { |
228 | 230 | @Override |
229 | 231 | public String caseActionUsage(ActionUsage actionUsage) { |
230 | 232 | Appender builder = new Appender(this.lineSeparator, this.indentation); |
231 | | - this.appendOccurrenceUsagePrefix(builder, actionUsage); |
232 | | - builder.appendWithSpaceIfNeeded("action"); |
233 | | - this.appendActionUsageDeclaration(builder, actionUsage); |
| 233 | + if (!this.isEmptyActionAsStateSubAction(actionUsage)) { |
| 234 | + // Normal rule "ActionUsage" |
| 235 | + this.appendOccurrenceUsagePrefix(builder, actionUsage); |
| 236 | + builder.appendWithSpaceIfNeeded("action"); |
| 237 | + this.appendActionUsageDeclaration(builder, actionUsage); |
| 238 | + |
| 239 | + } // Rule "EmptyActionUsage" when store in StateSubactionMembership => Do nothing |
| 240 | + |
234 | 241 | this.appendChildrenContent(builder, actionUsage, actionUsage.getOwnedMembership()); |
| 242 | + |
235 | 243 | return builder.toString(); |
236 | 244 | } |
237 | 245 |
|
| 246 | + private boolean isEmptyActionAsStateSubAction(ActionUsage actionUsage) { |
| 247 | + return actionUsage.getOwningMembership() instanceof StateSubactionMembership && actionUsage.getOwnedRelationship() |
| 248 | + .isEmpty() && actionUsage.getDeclaredName() == null && actionUsage.getShortName() == null; |
| 249 | + } |
| 250 | + |
238 | 251 | @Override |
239 | 252 | public String caseAnalysisCaseUsage(AnalysisCaseUsage analysisCaseUsage) { |
240 | 253 | this.reportUnhandledType(analysisCaseUsage); |
@@ -863,29 +876,21 @@ public String casePartUsage(PartUsage partUsage) { |
863 | 876 | } |
864 | 877 |
|
865 | 878 | @Override |
866 | | - public String casePerformActionUsage(PerformActionUsage perfomActionUsage) { |
| 879 | + public String casePerformActionUsage(PerformActionUsage performActionUsage) { |
867 | 880 |
|
868 | 881 | Appender builder = new Appender(this.lineSeparator, this.indentation); |
| 882 | + if (!(performActionUsage.getOwningMembership() instanceof StateSubactionMembership)) { |
| 883 | + // Rule simple "PerformActionUsage" from BehaviorUsageElement |
| 884 | + this.appendOccurrenceUsagePrefix(builder, performActionUsage); |
869 | 885 |
|
870 | | - this.appendOccurrenceUsagePrefix(builder, perfomActionUsage); |
| 886 | + builder.appendWithSpaceIfNeeded("perform"); |
| 887 | + } // Else do nothing using rule PerformActionUsageDeclaration |
871 | 888 |
|
872 | | - builder.appendWithSpaceIfNeeded("perform"); |
| 889 | + this.appendPerformActionUsageDeclaration(performActionUsage, builder); |
873 | 890 |
|
874 | | - Appender nameAppender = new Appender(this.lineSeparator, this.indentation); |
875 | | - this.appendNameWithShortName(nameAppender, perfomActionUsage); |
876 | | - |
877 | | - if (nameAppender.isEmpty() && perfomActionUsage.getOwnedReferenceSubsetting() != null) { |
878 | | - // Use simple form : perfom <nameOfReferenceSubSetting> |
879 | | - this.appendOwnedReferenceSubsetting(builder, perfomActionUsage.getOwnedReferenceSubsetting()); |
880 | | - } else { |
881 | | - // Use complete form |
882 | | - builder.appendWithSpaceIfNeeded("action"); |
883 | | - this.appendUsageDeclaration(builder, perfomActionUsage); |
884 | | - } |
| 891 | + this.appendValuePart(builder, performActionUsage); |
885 | 892 |
|
886 | | - this.appendValuePart(builder, perfomActionUsage); |
887 | | - |
888 | | - this.appendChildrenContent(builder, perfomActionUsage, perfomActionUsage.getOwnedMembership()); |
| 893 | + this.appendChildrenContent(builder, performActionUsage, performActionUsage.getOwnedMembership()); |
889 | 894 |
|
890 | 895 | return builder.toString(); |
891 | 896 | } |
@@ -1065,10 +1070,56 @@ public String caseStakeholderMembership(StakeholderMembership stakeholderMembers |
1065 | 1070 | return builder.toString(); |
1066 | 1071 | } |
1067 | 1072 |
|
| 1073 | + @Override |
| 1074 | + public String caseStateDefinition(StateDefinition stateDefinition) { |
| 1075 | + Appender builder = this.newAppender(); |
| 1076 | + this.appendDefinitionPrefix(builder, stateDefinition); |
| 1077 | + builder.appendSpaceIfNeeded().append(SysMLv2Keywords.STATE + " " + SysMLv2Keywords.DEF); |
| 1078 | + this.appendDefinitionDeclaration(builder, stateDefinition); |
| 1079 | + |
| 1080 | + if (stateDefinition.isIsParallel()) { |
| 1081 | + builder.appendWithSpaceIfNeeded(SysMLv2Keywords.PARALLEL); |
| 1082 | + } |
| 1083 | + |
| 1084 | + this.appendChildrenContent(builder, stateDefinition, stateDefinition.getOwnedMembership()); |
| 1085 | + return builder.toString(); |
| 1086 | + } |
| 1087 | + |
| 1088 | + @Override |
| 1089 | + public String caseStateSubactionMembership(StateSubactionMembership stateSubactionMembership) { |
| 1090 | + Appender builder = this.newAppender(); |
| 1091 | + |
| 1092 | + this.appendMembershipPrefix(stateSubactionMembership, builder); |
| 1093 | + |
| 1094 | + String stateKind = switch (stateSubactionMembership.getKind()) { |
| 1095 | + case DO -> SysMLv2Keywords.DO; |
| 1096 | + case ENTRY -> SysMLv2Keywords.ENTRY; |
| 1097 | + case EXIT -> SysMLv2Keywords.EXIT; |
| 1098 | + }; |
| 1099 | + |
| 1100 | + builder.appendWithSpaceIfNeeded(stateKind); |
| 1101 | + |
| 1102 | + String content = stateSubactionMembership.getOwnedRelatedElement().stream() |
| 1103 | + .map(this::doSwitch).filter(Objects::nonNull).collect(joining(builder.getNewLine())); |
| 1104 | + builder.appendSpaceIfNeeded().append(content); |
| 1105 | + |
| 1106 | + return builder.toString(); |
| 1107 | + } |
| 1108 | + |
1068 | 1109 | @Override |
1069 | 1110 | public String caseStateUsage(StateUsage stateUsage) { |
1070 | | - this.reportUnhandledType(stateUsage); |
1071 | | - return ""; |
| 1111 | + Appender builder = this.newAppender(); |
| 1112 | + |
| 1113 | + this.appendOccurrenceUsagePrefix(builder, stateUsage); |
| 1114 | + builder.appendWithSpaceIfNeeded(SysMLv2Keywords.STATE); |
| 1115 | + this.appendActionUsageDeclaration(builder, stateUsage); |
| 1116 | + |
| 1117 | + if (stateUsage.isIsParallel()) { |
| 1118 | + builder.appendWithSpaceIfNeeded(SysMLv2Keywords.PARALLEL); |
| 1119 | + } |
| 1120 | + |
| 1121 | + this.appendChildrenContent(builder, stateUsage, stateUsage.getOwnedMembership()); |
| 1122 | + return builder.toString(); |
1072 | 1123 | } |
1073 | 1124 |
|
1074 | 1125 | @Override |
@@ -2803,4 +2854,18 @@ private boolean useRequirementConstraintUsageShortHandNotation(ConstraintUsage c |
2803 | 2854 | && constraintUsage.getOwnedReferenceSubsetting() != null |
2804 | 2855 | && constraintUsage.getNestedMetadata().isEmpty(); |
2805 | 2856 | } |
| 2857 | + |
| 2858 | + private void appendPerformActionUsageDeclaration(PerformActionUsage performActionUsage, Appender builder) { |
| 2859 | + Appender nameAppender = new Appender(this.lineSeparator, this.indentation); |
| 2860 | + this.appendNameWithShortName(nameAppender, performActionUsage); |
| 2861 | + |
| 2862 | + if (nameAppender.isEmpty() && performActionUsage.getOwnedReferenceSubsetting() != null) { |
| 2863 | + // Use simple form : perfom <nameOfReferenceSubSetting> |
| 2864 | + this.appendOwnedReferenceSubsetting(builder, performActionUsage.getOwnedReferenceSubsetting()); |
| 2865 | + } else { |
| 2866 | + // Use complete form |
| 2867 | + builder.appendWithSpaceIfNeeded("action"); |
| 2868 | + this.appendUsageDeclaration(builder, performActionUsage); |
| 2869 | + } |
| 2870 | + } |
2806 | 2871 | } |
0 commit comments