@@ -201,11 +201,13 @@ class TranslatedClassListInitialization extends TranslatedListInitialization {
201201 override ClassAggregateLiteral expr ;
202202
203203 override TranslatedElement getChild ( int id ) {
204- exists ( TranslatedFieldInitialization fieldInit |
205- result = fieldInit and
206- fieldInit = getTranslatedFieldInitialization ( expr , _) and
207- fieldInit .getOrder ( ) = id
208- )
204+ result =
205+ rank [ id + 1 ] ( TranslatedFieldInitialization fieldInit , int ord |
206+ fieldInit = getTranslatedFieldInitialization ( expr , _) and
207+ fieldInit .getOrder ( ) = ord
208+ |
209+ fieldInit order by ord , fieldInit .getRepetitionIndex ( )
210+ )
209211 }
210212}
211213
@@ -222,7 +224,7 @@ class TranslatedArrayListInitialization extends TranslatedListInitialization {
222224 rank [ id + 1 ] ( TranslatedElementInitialization init |
223225 init .getInitList ( ) = expr
224226 |
225- init order by init .getElementIndex ( )
227+ init order by init .getElementIndex ( ) , init . getRepetitionIndex ( )
226228 )
227229 }
228230}
@@ -522,6 +524,12 @@ abstract class TranslatedFieldInitialization extends TranslatedElement {
522524 final InstructionTag getFieldAddressTag ( ) { result = InitializerFieldAddressTag ( ) }
523525
524526 final Field getField ( ) { result = field }
527+
528+ /**
529+ * Gets the index of this initialization, if the field is mentioned
530+ * multiple times in the initializer.
531+ */
532+ int getRepetitionIndex ( ) { result = 0 }
525533}
526534
527535/**
@@ -532,9 +540,10 @@ class TranslatedExplicitFieldInitialization extends TranslatedFieldInitializatio
532540 InitializationContext , TTranslatedExplicitFieldInitialization
533541{
534542 Expr expr ;
543+ int repitition ;
535544
536545 TranslatedExplicitFieldInitialization ( ) {
537- this = TTranslatedExplicitFieldInitialization ( ast , field , expr )
546+ this = TTranslatedExplicitFieldInitialization ( ast , field , expr , repitition )
538547 }
539548
540549 override Instruction getTargetAddress ( ) { result = getInstruction ( getFieldAddressTag ( ) ) }
@@ -556,6 +565,8 @@ class TranslatedExplicitFieldInitialization extends TranslatedFieldInitializatio
556565 private TranslatedInitialization getInitialization ( ) {
557566 result = getTranslatedInitialization ( expr )
558567 }
568+
569+ override int getRepetitionIndex ( ) { result = repitition }
559570}
560571
561572private string getZeroValue ( Type type ) {
@@ -689,6 +700,8 @@ abstract class TranslatedElementInitialization extends TranslatedElement {
689700
690701 abstract int getElementIndex ( ) ;
691702
703+ int getRepetitionIndex ( ) { result = 0 }
704+
692705 final InstructionTag getElementAddressTag ( ) { result = InitializerElementAddressTag ( ) }
693706
694707 final InstructionTag getElementIndexTag ( ) { result = InitializerElementIndexTag ( ) }
@@ -706,9 +719,10 @@ class TranslatedExplicitElementInitialization extends TranslatedElementInitializ
706719 TTranslatedExplicitElementInitialization , InitializationContext
707720{
708721 int elementIndex ;
722+ int repetition ;
709723
710724 TranslatedExplicitElementInitialization ( ) {
711- this = TTranslatedExplicitElementInitialization ( initList , elementIndex )
725+ this = TTranslatedExplicitElementInitialization ( initList , elementIndex , repetition )
712726 }
713727
714728 override Instruction getTargetAddress ( ) { result = getInstruction ( getElementAddressTag ( ) ) }
@@ -731,8 +745,13 @@ class TranslatedExplicitElementInitialization extends TranslatedElementInitializ
731745
732746 override int getElementIndex ( ) { result = elementIndex }
733747
748+ override int getRepetitionIndex ( ) { result = repetition }
749+
734750 TranslatedInitialization getInitialization ( ) {
735- result = getTranslatedInitialization ( initList .getElementExpr ( elementIndex ) .getFullyConverted ( ) )
751+ result =
752+ getTranslatedInitialization ( initList
753+ .getElementExpr ( elementIndex , repetition )
754+ .getFullyConverted ( ) )
736755 }
737756}
738757
0 commit comments