Skip to content

Commit a312e31

Browse files
[WIP] ix FeatureMembershipTextualNotationBuilder
1 parent d247538 commit a312e31

2 files changed

Lines changed: 86 additions & 26 deletions

File tree

SysML2.NET.CodeGenerator/HandleBarHelpers/RulesHelper.cs

Lines changed: 52 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ private static void ProcessAlternatives(EncodedTextWriter writer, IClass umlClas
9393
var elements = alternative.Elements;
9494
DeclareAllRequiredIterators(writer, umlClass, alternative, ruleGenerationContext);
9595

96-
if (ruleGenerationContext.CallerRule is { IsOptional: true, IsCollection: false })
96+
if (ruleGenerationContext.CallerContext?.CallerRule is { IsOptional: true, IsCollection: false })
9797
{
9898
var targetPropertiesName = elements.OfType<AssignmentElement>().Select(x => x.Property).Distinct().ToList();
9999
var allProperties = umlClass.QueryAllProperties();
@@ -127,9 +127,9 @@ private static void ProcessAlternatives(EncodedTextWriter writer, IClass umlClas
127127

128128
foreach (var textualRuleElement in elements)
129129
{
130-
var previousCaller = ruleGenerationContext.CallerRule;
130+
var previousCaller = ruleGenerationContext.CallerContext;
131131
ProcessRuleElement(writer, umlClass, textualRuleElement, ruleGenerationContext);
132-
ruleGenerationContext.CallerRule = previousCaller;
132+
ruleGenerationContext.CallerContext = previousCaller;
133133
}
134134
}
135135
else
@@ -150,9 +150,9 @@ private static void ProcessAlternatives(EncodedTextWriter writer, IClass umlClas
150150
{
151151
foreach (var textualRuleElement in elements)
152152
{
153-
var previousCaller = ruleGenerationContext.CallerRule;
153+
var previousCaller = ruleGenerationContext.CallerContext;
154154
ProcessRuleElement(writer, umlClass, textualRuleElement, ruleGenerationContext);
155-
ruleGenerationContext.CallerRule = previousCaller;
155+
ruleGenerationContext.CallerContext = previousCaller;
156156
}
157157
}
158158
}
@@ -215,11 +215,18 @@ private static void ProcessRuleElement(EncodedTextWriter writer, IClass umlClass
215215
writer.WriteSafeString($"stringBuilder.Append(\"{valueToAdd}\");");
216216
break;
217217
case NonTerminalElement nonTerminalElement:
218-
ProcessNonTerminalElement(writer, umlClass, nonTerminalElement, "poco", umlClass, ruleGenerationContext);
218+
if (ruleGenerationContext.CallerContext?.CallerRule is NonTerminalElement callerNonTerminalElement && callerNonTerminalElement.Container is AssignmentElement)
219+
{
220+
ProcessNonTerminalElement(writer, umlClass, nonTerminalElement, "poco", ruleGenerationContext.CallerContext.CallerClassContext, ruleGenerationContext);
221+
}
222+
else
223+
{
224+
ProcessNonTerminalElement(writer, umlClass, nonTerminalElement, "poco", umlClass, ruleGenerationContext);
225+
}
219226

220227
break;
221228
case GroupElement groupElement:
222-
ruleGenerationContext.CallerRule = groupElement;
229+
ruleGenerationContext.CallerContext = new CallerContext(groupElement);
223230

224231
if (groupElement.IsCollection)
225232
{
@@ -304,10 +311,10 @@ private static void ProcessRuleElement(EncodedTextWriter writer, IClass umlClass
304311
{
305312
if (assignmentElement.Value is NonTerminalElement nonTerminalElement)
306313
{
307-
var previousCaller = ruleGenerationContext.CallerRule;
308-
ruleGenerationContext.CallerRule = nonTerminalElement;
314+
var previousCaller = ruleGenerationContext.CallerContext;
315+
ruleGenerationContext.CallerContext = new CallerContext(nonTerminalElement);
309316
ProcessNonTerminalElement(writer, targetProperty.Type as IClass, nonTerminalElement, $"poco.{targetProperty.QueryPropertyNameBasedOnUmlProperties()}", umlClass, ruleGenerationContext);
310-
ruleGenerationContext.CallerRule = previousCaller;
317+
ruleGenerationContext.CallerContext = previousCaller;
311318
}
312319
else
313320
{
@@ -385,18 +392,18 @@ private static void ProcessNonTerminalElement(EncodedTextWriter writer, IClass u
385392
}
386393
else
387394
{
388-
var previousCaller = ruleGenerationContext.CallerRule;
389-
ruleGenerationContext.CallerRule = nonTerminalElement;
390-
ProcessAlternatives(writer, umlClass, referencedRule?.Alternatives, ruleGenerationContext);
391-
ruleGenerationContext.CallerRule = previousCaller;
395+
var previousCaller = ruleGenerationContext.CallerContext;
396+
ruleGenerationContext.CallerContext = new CallerContext(nonTerminalElement, targetType as IClass);
397+
ProcessAlternatives(writer, callerClass, referencedRule?.Alternatives, ruleGenerationContext);
398+
ruleGenerationContext.CallerContext = previousCaller;
392399
}
393400
}
394401
else
395402
{
396-
var previousCaller = ruleGenerationContext.CallerRule;
397-
ruleGenerationContext.CallerRule = nonTerminalElement;
398-
ProcessAlternatives(writer, umlClass, referencedRule?.Alternatives, ruleGenerationContext);
399-
ruleGenerationContext.CallerRule = previousCaller;
403+
var previousCaller = ruleGenerationContext.CallerContext;
404+
ruleGenerationContext.CallerContext = new CallerContext(nonTerminalElement);
405+
ProcessAlternatives(writer, callerClass, referencedRule?.Alternatives, ruleGenerationContext);
406+
ruleGenerationContext.CallerContext = previousCaller;
400407
}
401408
}
402409
else
@@ -552,6 +559,29 @@ public bool IsIteratorValidForProperty(IProperty property, TextualNotationRule t
552559
}
553560
}
554561

562+
/// <summary>
563+
/// Provide context about the caller context
564+
/// </summary>
565+
private class CallerContext
566+
{
567+
/// <summary>Initializes a new instance of the <see cref="CallerContext" /> class.</summary>
568+
public CallerContext(RuleElement callerRule, IClass callerClassContext = null)
569+
{
570+
this.CallerRule = callerRule;
571+
this.CallerClassContext = callerClassContext;
572+
}
573+
574+
/// <summary>
575+
/// Gets or sets the <see cref="RuleElement"/> that called other rule
576+
/// </summary>
577+
public RuleElement CallerRule { get; }
578+
579+
/// <summary>
580+
/// Gets or sets the <see cref="IClass"/> used during the caller rule
581+
/// </summary>
582+
public IClass CallerClassContext { get; }
583+
}
584+
555585
/// <summary>
556586
/// Provides context over the rule generation history
557587
/// </summary>
@@ -563,14 +593,14 @@ private class RuleGenerationContext
563593
public List<IteratorDefinition> DefinedIterators { get; set; }
564594

565595
/// <summary>
566-
/// Gets or sets the <see cref="RuleElement"/> that called other rule
596+
/// Gets the collection of all available <see cref="TextualNotationRule"/>
567597
/// </summary>
568-
public RuleElement CallerRule { get; set; }
598+
public List<TextualNotationRule> AllRules { get; } = [];
569599

570600
/// <summary>
571-
/// Gets the collection of all available <see cref="TextualNotationRule"/>
601+
/// Gets or sets the <see cref="CallerContext"/>
572602
/// </summary>
573-
public List<TextualNotationRule> AllRules { get; } = [];
603+
public CallerContext CallerContext { get; set; }
574604
}
575605
}
576606
}

SysML2.NET/TextualNotation/AutoGenTextualNotationBuilder/FeatureMembershipTextualNotationBuilder.cs

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -379,9 +379,21 @@ public static void BuildMetadataBodyUsageMember(SysML2.NET.Core.POCO.Core.Types.
379379
{
380380
RedefinitionTextualNotationBuilder.BuildOwnedRedefinition(ownedRelationshipOfRedefinitionIterator.Current, stringBuilder);
381381
}
382-
BuildFeatureSpecializationPart(poco, stringBuilder);
383-
BuildValuePart(poco, stringBuilder);
384-
TypeTextualNotationBuilder.BuildMetadataBody(poco, stringBuilder);
382+
throw new System.NotSupportedException("Multiple alternatives not implemented yet");
383+
using var ownedRelationshipOfFeatureValueIterator = poco.OwnedRelationship.OfType<SysML2.NET.Core.POCO.Kernel.FeatureValues.FeatureValue>().GetEnumerator();
384+
385+
if (ownedRelationshipOfFeatureValueIterator.MoveNext())
386+
{
387+
ownedRelationshipOfFeatureValueIterator.MoveNext();
388+
389+
if (ownedRelationshipOfFeatureValueIterator.Current != null)
390+
{
391+
FeatureValueTextualNotationBuilder.BuildFeatureValue(ownedRelationshipOfFeatureValueIterator.Current, stringBuilder);
392+
}
393+
stringBuilder.Append(' ');
394+
}
395+
396+
throw new System.NotSupportedException("Multiple alternatives not implemented yet");
385397

386398
}
387399

@@ -503,7 +515,25 @@ public static void BuildExpressionBodyMember(SysML2.NET.Core.POCO.Core.Types.IFe
503515
if (poco.ownedMemberFeature != null)
504516
{
505517
stringBuilder.Append("{");
506-
TypeTextualNotationBuilder.BuildFunctionBodyPart(poco, stringBuilder);
518+
using var ownedRelationshipOfReturnParameterMembershipIterator = poco.OwnedRelationship.OfType<SysML2.NET.Core.POCO.Kernel.Functions.ReturnParameterMembership>().GetEnumerator();
519+
using var ownedRelationshipOfResultExpressionMembershipIterator = poco.OwnedRelationship.OfType<SysML2.NET.Core.POCO.Kernel.Functions.ResultExpressionMembership>().GetEnumerator();
520+
521+
while (ownedRelationshipOfReturnParameterMembershipIterator.MoveNext())
522+
{
523+
throw new System.NotSupportedException("Multiple alternatives not implemented yet");
524+
}
525+
526+
if (ownedRelationshipOfResultExpressionMembershipIterator.MoveNext())
527+
{
528+
529+
if (ownedRelationshipOfResultExpressionMembershipIterator.Current != null)
530+
{
531+
ResultExpressionMembershipTextualNotationBuilder.BuildResultExpressionMember(ownedRelationshipOfResultExpressionMembershipIterator.Current, stringBuilder);
532+
}
533+
stringBuilder.Append(' ');
534+
}
535+
536+
507537
stringBuilder.Append("}");
508538

509539
}

0 commit comments

Comments
 (0)