@@ -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}
0 commit comments