Skip to content

Commit 0c9fa8f

Browse files
[WIP] Implemented the NonBehaviorBodyItem rule
1 parent 26883c1 commit 0c9fa8f

2 files changed

Lines changed: 80 additions & 0 deletions

File tree

SysML2.NET/Core/Poco/FeatureMembership.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,16 @@ namespace SysML2.NET.Core.POCO.Core.Types
2323
using System.Linq;
2424

2525
using SysML2.NET.Core.POCO.Root.Elements;
26+
using SysML2.NET.Core.POCO.Systems.Allocations;
2627
using SysML2.NET.Core.POCO.Systems.Connections;
2728
using SysML2.NET.Core.POCO.Systems.DefinitionAndUsage;
29+
using SysML2.NET.Core.POCO.Systems.Flows;
30+
using SysML2.NET.Core.POCO.Systems.Interfaces;
31+
using SysML2.NET.Core.POCO.Systems.Items;
2832
using SysML2.NET.Core.POCO.Systems.Occurrences;
33+
using SysML2.NET.Core.POCO.Systems.Parts;
34+
using SysML2.NET.Core.POCO.Systems.Ports;
35+
using SysML2.NET.Core.POCO.Systems.Views;
2936

3037
/// <summary>
3138
/// A FeatureMembership is an OwningMembership between an ownedMemberFeature and an owningType. If the
@@ -75,5 +82,26 @@ private bool HasRelatedElementOfType<T>() where T : IElement
7582
{
7683
return this.OwnedRelatedElement.OfType<T>().Any();
7784
}
85+
86+
/// <summary>
87+
/// Asserts that the current <see cref="FeatureMembership"/> have valid <see cref="IElement" /> typeinto the
88+
/// <see cref="OwnedRelatedElement" /> collection for the StructureUsageMember
89+
/// </summary>
90+
/// <returns>True if contains any of the required element type</returns>
91+
internal bool IsValidForStructureUsageMember()
92+
{
93+
return this.HasRelatedElementOfType<OccurrenceUsage>()
94+
|| this.HasRelatedElementOfType<EventOccurrenceUsage>()
95+
|| this.HasRelatedElementOfType<ItemUsage>()
96+
|| this.HasRelatedElementOfType<PartUsage>()
97+
|| this.HasRelatedElementOfType<ViewUsage>()
98+
|| this.HasRelatedElementOfType<RenderingUsage>()
99+
|| this.HasRelatedElementOfType<PortUsage>()
100+
|| this.HasRelatedElementOfType<ConnectionUsage>()
101+
|| this.HasRelatedElementOfType<InterfaceUsage>()
102+
|| this.HasRelatedElementOfType<AllocationUsage>()
103+
|| this.HasRelatedElementOfType<FlowUsage>()
104+
|| this.HasRelatedElementOfType<SuccessionFlowUsage>();
105+
}
78106
}
79107
}

SysML2.NET/TextualNotation/TypeTextualNotationBuilder.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,58 @@ private static int BuildActionBodyItem(int relationshipIndex, List<IRelationship
117117
return relationshipIndex;
118118
}
119119

120+
/// <summary>
121+
/// Build the logic for the NonBehaviorBodyItem =ownedRelationship+=Import|ownedRelationship+=AliasMember|ownedRelationship+=DefinitionMember|ownedRelationship+=VariantUsageMember|ownedRelationship+=NonOccurrenceUsageMember|(ownedRelationship+=SourceSuccessionMember)?ownedRelationship+=StructureUsageMember rule
122+
/// </summary>
123+
/// <param name="relationshipIndex">The index of the <see cref="IRelationship"/> inside the <paramref name="relationships"/> to process</param>
124+
/// <param name="relationships">A collection of <see cref="IRelationship"/> to process</param>
125+
/// <param name="stringBuilder">The <see cref="StringBuilder" /></param>
126+
/// <returns>The current index that could have been modified during the process</returns>
127+
private static int BuildNonBehaviorBodyItem(int relationshipIndex, List<IRelationship> relationships, StringBuilder stringBuilder)
128+
{
129+
var elementInOwnedRelationship = relationships[relationshipIndex];
130+
131+
switch (elementInOwnedRelationship)
132+
{
133+
case IImport import:
134+
ImportTextualNotationBuilder.BuildImport(import, stringBuilder);
135+
break;
136+
case Membership membership:
137+
MembershipTextualNotationBuilder.BuildAliasMember(membership, stringBuilder);
138+
break;
139+
case OwningMembership owningMembership:
140+
OwningMembershipTextualNotationBuilder.BuildDefinitionMember(owningMembership, stringBuilder);
141+
break;
142+
case VariantMembership variantMembership:
143+
VariantMembershipTextualNotationBuilder.BuildVariantUsageMember(variantMembership, stringBuilder);
144+
break;
145+
146+
case FeatureMembership featureMembershipForSuccession when featureMembershipForSuccession.IsValidForSourceSuccessionMember():
147+
{
148+
var nextElement = relationshipIndex + 1 < relationships.Count ? relationships[relationshipIndex + 1] : null;
149+
150+
if (nextElement is FeatureMembership featureMembership && featureMembership.IsValidForStructureUsageMember())
151+
{
152+
FeatureMembershipTextualNotationBuilder.BuildSourceSuccessionMember(featureMembershipForSuccession, stringBuilder);
153+
FeatureMembershipTextualNotationBuilder.BuildStructureUsageMember(featureMembership, stringBuilder);
154+
return relationshipIndex + 1;
155+
}
156+
157+
break;
158+
}
159+
160+
case FeatureMembership featureMembershipForOccurenceUsageMember when featureMembershipForOccurenceUsageMember.IsValidForStructureUsageMember():
161+
FeatureMembershipTextualNotationBuilder.BuildStructureUsageMember(featureMembershipForOccurenceUsageMember, stringBuilder);
162+
break;
163+
164+
case FeatureMembership featureMembershipForNonOccurenceUsageMember when featureMembershipForNonOccurenceUsageMember.IsValidForNonOccurrenceUsageMember():
165+
FeatureMembershipTextualNotationBuilder.BuildNonOccurrenceUsageMember(featureMembershipForNonOccurenceUsageMember, stringBuilder);
166+
break;
167+
}
168+
169+
return relationshipIndex;
170+
}
171+
120172
/// <summary>
121173
/// Build the logic for the ypeBodyElement:Type=ownedRelationship+=NonFeatureMember|ownedRelationship+=FeatureMember|ownedRelationship+=AliasMember|ownedRelationship+=Import rule
122174
/// <remarks>This implementation is a copy paste from the other one but required for Other rules</remarks>

0 commit comments

Comments
 (0)