@@ -175,10 +175,7 @@ private static void DeclareAllRequiredIterators(EncodedTextWriter writer, IClass
175175 {
176176 switch ( ruleElement )
177177 {
178- case AssignmentElement { Value : NonTerminalElement } assignmentElement :
179- DeclareIteratorIfRequired ( writer , umlClass , assignmentElement , ruleGenerationContext ) ;
180- break ;
181- case AssignmentElement { Value : GroupElement } assignmentElement :
178+ case AssignmentElement assignmentElement :
182179 DeclareIteratorIfRequired ( writer , umlClass , assignmentElement , ruleGenerationContext ) ;
183180 break ;
184181 case GroupElement groupElement :
@@ -232,7 +229,7 @@ private static void ProcessRuleElement(EncodedTextWriter writer, IClass umlClass
232229
233230 if ( groupElement . IsCollection )
234231 {
235- var assignmentRule = groupElement . Alternatives . SelectMany ( x => x . Elements ) . FirstOrDefault ( x => x is AssignmentElement { Value : NonTerminalElement } ) ;
232+ var assignmentRule = groupElement . Alternatives . SelectMany ( x => x . Elements ) . FirstOrDefault ( x => x is AssignmentElement { Value : NonTerminalElement } || x is AssignmentElement { Value : ValueLiteralElement } ) ;
236233
237234 if ( assignmentRule is AssignmentElement assignmentElement )
238235 {
@@ -274,6 +271,27 @@ private static void ProcessRuleElement(EncodedTextWriter writer, IClass umlClass
274271
275272 ProcessNonTerminalElement ( writer , umlClass , nonTerminalElement , $ "{ iteratorToUse . IteratorVariableName } .Current", ruleGenerationContext ) ;
276273 }
274+ else if ( assignmentElement . Value is GroupElement groupElement )
275+ {
276+ var previousCaller = ruleGenerationContext . CallerRule ;
277+ ruleGenerationContext . CallerRule = assignmentElement ;
278+ ProcessAlternatives ( writer , umlClass , groupElement . Alternatives , ruleGenerationContext ) ;
279+ ruleGenerationContext . CallerRule = previousCaller ;
280+ }
281+ else if ( assignmentElement . Value is ValueLiteralElement valueLiteralElement && valueLiteralElement . QueryIsQualifiedName ( ) )
282+ {
283+ var iteratorToUse = ruleGenerationContext . DefinedIterators . Single ( x => x . ApplicableRuleElements . Contains ( assignmentElement ) ) ;
284+
285+ if ( assignmentElement . Container is not GroupElement { IsCollection : true } && assignmentElement . Container is not GroupElement { IsOptional : true } )
286+ {
287+ writer . WriteSafeString ( $ "{ iteratorToUse . IteratorVariableName } .MoveNext();{ Environment . NewLine } ") ;
288+ }
289+
290+ writer . WriteSafeString ( $ "{ Environment . NewLine } if({ iteratorToUse . IteratorVariableName } .Current != null){ Environment . NewLine } ") ;
291+ writer . WriteSafeString ( $ "{{{Environment.NewLine}") ;
292+ writer . WriteSafeString ( $ "stringBuilder.Append({ iteratorToUse . IteratorVariableName } .Current.qualifiedName);{ Environment . NewLine } ") ;
293+ writer . WriteSafeString ( "}" ) ;
294+ }
277295 else
278296 {
279297 writer . WriteSafeString ( "throw new System.NotSupportedException(\" Assigment of enumerable with non NonTerminalElement not supported yet\" );" ) ;
@@ -286,7 +304,7 @@ private static void ProcessRuleElement(EncodedTextWriter writer, IClass umlClass
286304 writer . WriteSafeString ( $ "{ Environment . NewLine } if({ targetProperty . QueryIfStatementContentForNonEmpty ( "poco" ) } ){ Environment . NewLine } ") ;
287305 writer . WriteSafeString ( $ "{{{Environment.NewLine}") ;
288306 writer . WriteSafeString ( $ "stringBuilder.Append(poco.{ targetProperty . Name . CapitalizeFirstLetter ( ) } );{ Environment . NewLine } ") ;
289- writer . WriteSafeString ( "}} " ) ;
307+ writer . WriteSafeString ( "}" ) ;
290308 }
291309 else
292310 {
@@ -463,55 +481,75 @@ private static void DeclareIteratorIfRequired(EncodedTextWriter writer, IClass u
463481 {
464482 DeclareIteratorIfRequired ( writer , umlClass , assignment , ruleGenerationContext ) ;
465483 }
466- }
467-
468- if ( assignmentElement . Value is not NonTerminalElement nonTerminalElement )
469- {
484+
470485 return ;
471486 }
472487
473- var referencedRule = ruleGenerationContext . AllRules . SingleOrDefault ( x => x . RuleName == nonTerminalElement . Name ) ;
474-
475- if ( ruleGenerationContext . DefinedIterators . SingleOrDefault ( x => x . IsIteratorValidForProperty ( targetProperty , referencedRule ) || x . ApplicableRuleElements . Contains ( assignmentElement ) ) is { } alreadyDefinedIterator )
488+ switch ( assignmentElement . Value )
476489 {
477- alreadyDefinedIterator . ApplicableRuleElements . Add ( assignmentElement ) ;
478- return ;
479- }
490+ case NonTerminalElement nonTerminalElement :
491+ var referencedRule = ruleGenerationContext . AllRules . SingleOrDefault ( x => x . RuleName == nonTerminalElement . Name ) ;
492+
493+ if ( ruleGenerationContext . DefinedIterators . SingleOrDefault ( x => x . IsIteratorValidForProperty ( targetProperty , referencedRule ) || x . ApplicableRuleElements . Contains ( assignmentElement ) ) is { } alreadyDefinedIterator )
494+ {
495+ alreadyDefinedIterator . ApplicableRuleElements . Add ( assignmentElement ) ;
496+ return ;
497+ }
480498
481- var iteratorToUse = new IteratorDefinition
482- {
483- DefinedForProperty = targetProperty
484- } ;
485-
486- iteratorToUse . ApplicableRuleElements . Add ( assignmentElement ) ;
499+ var iteratorToUse = new IteratorDefinition
500+ {
501+ DefinedForProperty = targetProperty
502+ } ;
503+
504+ iteratorToUse . ApplicableRuleElements . Add ( assignmentElement ) ;
487505
488- string typeTarget ;
489-
490- if ( referencedRule == null )
491- {
492- typeTarget = umlClass . Name ;
493- }
494- else
495- {
496- typeTarget = referencedRule . TargetElementName ?? referencedRule . RuleName ;
497- }
506+ string typeTarget ;
507+
508+ if ( referencedRule == null )
509+ {
510+ typeTarget = umlClass . Name ;
511+ }
512+ else
513+ {
514+ typeTarget = referencedRule . TargetElementName ?? referencedRule . RuleName ;
515+ }
498516
499- if ( typeTarget != targetProperty . Type . Name )
500- {
501- var targetType = umlClass . Cache . Values . OfType < INamedElement > ( ) . SingleOrDefault ( x => x . Name == typeTarget ) ;
502- iteratorToUse . ConstrainedType = targetType ;
517+ if ( typeTarget != targetProperty . Type . Name )
518+ {
519+ var targetType = umlClass . Cache . Values . OfType < INamedElement > ( ) . SingleOrDefault ( x => x . Name == typeTarget ) ;
520+ iteratorToUse . ConstrainedType = targetType ;
503521
504- writer . WriteSafeString ( targetType != null
505- ? $ "using var { iteratorToUse . IteratorVariableName } = poco.{ targetProperty . QueryPropertyNameBasedOnUmlProperties ( ) } .OfType<{ targetType . QueryFullyQualifiedTypeName ( targetInterface : false ) } >().GetEnumerator();"
506- : $ "using var { iteratorToUse . IteratorVariableName } = poco.{ targetProperty . QueryPropertyNameBasedOnUmlProperties ( ) } .GetEnumerator();") ;
507- }
508- else
509- {
510- writer . WriteSafeString ( $ "using var { iteratorToUse . IteratorVariableName } = poco.{ targetProperty . QueryPropertyNameBasedOnUmlProperties ( ) } .GetEnumerator();") ;
522+ writer . WriteSafeString ( targetType != null
523+ ? $ "using var { iteratorToUse . IteratorVariableName } = poco.{ targetProperty . QueryPropertyNameBasedOnUmlProperties ( ) } .OfType<{ targetType . QueryFullyQualifiedTypeName ( targetInterface : false ) } >().GetEnumerator();"
524+ : $ "using var { iteratorToUse . IteratorVariableName } = poco.{ targetProperty . QueryPropertyNameBasedOnUmlProperties ( ) } .GetEnumerator();") ;
525+ }
526+ else
527+ {
528+ writer . WriteSafeString ( $ "using var { iteratorToUse . IteratorVariableName } = poco.{ targetProperty . QueryPropertyNameBasedOnUmlProperties ( ) } .GetEnumerator();") ;
529+ }
530+
531+ writer . WriteSafeString ( Environment . NewLine ) ;
532+ ruleGenerationContext . DefinedIterators . Add ( iteratorToUse ) ;
533+ break ;
534+ case ValueLiteralElement :
535+ if ( ruleGenerationContext . DefinedIterators . SingleOrDefault ( x => x . IsIteratorValidForProperty ( targetProperty , null ) || x . ApplicableRuleElements . Contains ( assignmentElement ) ) is { } existingValueLiteralIterator )
536+ {
537+ existingValueLiteralIterator . ApplicableRuleElements . Add ( assignmentElement ) ;
538+ return ;
539+ }
540+
541+ var valueLiteralIterator = new IteratorDefinition
542+ {
543+ DefinedForProperty = targetProperty
544+ } ;
545+
546+ valueLiteralIterator . ApplicableRuleElements . Add ( assignmentElement ) ;
547+ writer . WriteSafeString ( $ "using var { valueLiteralIterator . IteratorVariableName } = poco.{ targetProperty . QueryPropertyNameBasedOnUmlProperties ( ) } .GetEnumerator();") ;
548+ writer . WriteSafeString ( Environment . NewLine ) ;
549+ ruleGenerationContext . DefinedIterators . Add ( valueLiteralIterator ) ;
550+
551+ break ;
511552 }
512-
513- writer . WriteSafeString ( Environment . NewLine ) ;
514- ruleGenerationContext . DefinedIterators . Add ( iteratorToUse ) ;
515553 }
516554
517555 /// <summary>
0 commit comments