package Ġcom . ap ol log raph ql . apollo 3 . compiler . codegen Ċ Ċ import Ġcom . ap ol log raph ql . apollo 3 . compiler . ir . Ir Model Group Ċ Ċ private Ġfun Ġresolve Name Cl ashes ( used Names : ĠMutable Set < String >, Ġmodel Name : ĠString ): ĠString Ġ{ ĊĠ Ġvar Ġi Ġ= Ġ 0 ĊĠ Ġvar Ġname Ġ= Ġmodel Name ĊĠ Ġwhile Ġ( used Names . contains ( name )) Ġ{ ĊĠĠĠ Ġi ++ ĊĠĠĠ Ġname Ġ= Ġ"$ model Name $ i " ĊĠ Ġ} ĊĠ Ġused Names . add ( name ) ĊĠ Ġreturn Ġname Ċ } Ċ Ċ private Ġfun ĠList < Ir Model Group >. flatten ( exclude Names : ĠSet < String >): ĠList < Ir Model Group > Ġ{ ĊĠ Ġval Ġused Names Ġ= Ġexclude Names . to Mutable Set () ĊĠ Ġval Ġcollected Ir Model Groups Ġ= Ġmutable ListOf < Ir Model Group >() ĊĊĠ Ġreturn Ġmap Ġ{ ĊĠĠĠ Ġit . walk 2 ( used Names , Ġcollected Ir Model Groups ) ĊĠ Ġ} Ġ+ Ġcollected Ir Model Groups Ċ } Ċ Ċ /** Ċ Ġ* Ġwalk 2 Ġpotentially Ġdet aches Ġthe Ġmodel Ġgroups Ċ Ġ*/ Ċ private Ġfun ĠIr Model Group . walk 2 ( ĊĠĠĠ Ġused Names : ĠMutable Set < String >, ĊĠĠĠ Ġcollected Ir Model Groups : ĠMutable List < Ir Model Group >, Ċ ): ĠIr Model Group Ġ{ ĊĠ Ġreturn Ġcopy ( ĊĠĠĠĠĠ Ġmodels Ġ= Ġmodels . map Ġ{ Ġmodel Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġresolve Name Cl ashes ( used Names , Ġmodel . model Name ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnested Model Groups Ġ= Ġmutable ListOf < Ir Model Group >() ĊĠĠĠĠĠĠĠ Ġmodel . model Groups . forEach Ġ{ Ġmodel Group Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( model Group . models . single OrNull ()?. model Name Ġ== Ġ" Fragments ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSpecial Ġcase , Ġ" Fragments " Ġare Ġalways Ġnested ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnested Model Groups . add ( model Group ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġoutput Ġthe Ġmodels Ġin Ġpre - order ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollected Ġ= Ġmutable ListOf < Ir Model Group >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollected Ir Model Groups . add ( model Group . walk 2 ( used Names , Ġcollected )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollected Ir Model Groups . addAll ( collected ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmodel . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Name Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Groups Ġ= Ġnested Model Groups ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* Ġwalk Ġtra ver ses Ġthe Ġmodels Ġuntil Ġit Ġreaches Ġthe Ġdesired Ġdepth Ċ Ġ*/ Ċ private Ġfun ĠList < Ir Model Group >. walk ( depth : ĠInt , Ġat Depth : ĠInt , Ġexclude Names : ĠSet < String >): ĠList < Ir Model Group > Ġ{ ĊĠ Ġreturn Ġif Ġ( depth Ġ== Ġat Depth ) Ġ{ ĊĠĠĠ Ġflatten ( exclude Names ) ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġmap Ġ{ Ġmodel Group Ġ-> ĊĠĠĠĠĠ Ġmodel Group . walk ( depth , Ġat Depth , Ġexclude Names ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠIr Model Group . walk ( depth : ĠInt , Ġat Depth : ĠInt , Ġexclude Names : ĠSet < String >): ĠIr Model Group Ġ{ ĊĠ Ġreturn Ġcopy ( ĊĠĠĠĠĠ Ġmodels Ġ= Ġmodels . map Ġ{ Ġmodel Ġ-> ĊĠĠĠĠĠĠĠ Ġmodel . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Groups Ġ= Ġmodel . model Groups . walk ( depth Ġ+ Ġ 1 , Ġat Depth , Ġexclude Names ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠ Ġ) Ċ } Ċ Ċ internal Ġfun ĠIr Model Group . maybe Flatten ( ĊĠĠĠ Ġflatten : ĠBoolean , ĊĠĠĠ Ġat Depth : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġexclude Names : ĠSet < String > Ġ= Ġempty Set () Ċ ): ĠList < Ir Model Group > Ġ{ ĊĠ Ġreturn Ġif Ġ( flatten ) Ġ{ ĊĠĠĠ ĠlistOf ( this ). walk ( 0 , Ġat Depth , Ġexclude Names ) ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ ĠlistOf ( this ) ĊĠ Ġ} Ċ }