package Ġcom . ap ol log raph ql . apollo 3 . compiler . codegen . java . selections Ċ Ċ import Ġcom . ap ol log raph ql . apollo 3 . api . B Variable Ċ import Ġcom . ap ol log raph ql . apollo 3 . api . Boolean Expression Ċ import Ġcom . ap ol log raph ql . apollo 3 . api . Compiled Argument Ċ import Ġcom . ap ol log raph ql . apollo 3 . api . Compiled Field Ċ import Ġcom . ap ol log raph ql . apollo 3 . api . Compiled Variable Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Argument Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Boolean Value Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL EnumValue Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Field Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Float Value Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Fragment Definition Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Fragment Spread Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Inline Fragment Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Int Value Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Interface Type Definition Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL ListType Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL List Value Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Named Type Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL NonNull Type Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL NullValue Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL ObjectType Definition Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Object Value Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Selection Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL StringValue Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Type Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Type Definition Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Value Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . G QL Variable Value Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . Schema Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . definition From Scope Ċ import Ġcom . ap ol log raph ql . apollo 3 . ast . leaf Type Ċ import Ġcom . ap ol log raph ql . apollo 3 . compiler . capitalize First Letter Ċ import Ġcom . ap ol log raph ql . apollo 3 . compiler . codegen . java . Java ClassNames Ċ import Ġcom . ap ol log raph ql . apollo 3 . compiler . codegen . java . Java Context Ċ import Ġcom . ap ol log raph ql . apollo 3 . compiler . codegen . java . L Ċ import Ġcom . ap ol log raph ql . apollo 3 . compiler . codegen . java . S Ċ import Ġcom . ap ol log raph ql . apollo 3 . compiler . codegen . java . T Ċ import Ġcom . ap ol log raph ql . apollo 3 . compiler . codegen . java . helpers . toList Initializer Code block Ċ import Ġcom . ap ol log raph ql . apollo 3 . compiler . codegen . java . helpers . toMap Initializer Code block Ċ import Ġcom . ap ol log raph ql . apollo 3 . compiler . ir . to Boolean Expression Ċ import Ġcom . squareup . jav ap o et . Code Block Ċ import Ġcom . squareup . jav ap o et . Field Spec Ċ import Ġcom . squareup . jav ap o et . Parameterized TypeName Ċ import Ġcom . squareup . jav ap o et . Type Spec Ċ import Ġjavax . lang . model . element . Modifier Ċ Ċ class ĠComp iled Selections Builder ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠJava Context , ĊĠĠĠ Ġprivate Ġval Ġall Fragment Definitions : ĠMap < String , ĠG QL Fragment Definition >, ĊĠĠĠ Ġprivate Ġval Ġschema : ĠSchema , Ċ ) Ġ{ ĊĠ Ġprivate Ġval Ġused Names Ġ= Ġmutable Set Of < String >() ĊĊĠ Ġ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 ĊĠ Ġ} ĊĊĠ Ġfun Ġbuild ( selections : ĠList < G QL Selection >, Ġroot Name : ĠString , Ġparent Type : ĠString ): ĠType Spec Ġ{ ĊĠĠĠ Ġreturn ĠType Spec . class Builder ( root Name ) ĊĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠ Ġ. add Fields ( selections . walk ( context . layout . root Selections PropertyName (), Ġfalse , Ġparent Type )) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠList < G QL Selection >. walk ( name : ĠString , Ġprivate : ĠBoolean , Ġparent Type : ĠString ): ĠList < Field Spec > Ġ{ ĊĠĠĠ Ġval ĠpropertyName Ġ= Ġresolve Name Cl ashes ( used Names , Ġcontext . layout . propertyName ( name )) ĊĊĠĠĠ Ġval Ġresults Ġ= Ġmap NotNull Ġ{ Ġit . walk ( true , Ġparent Type ) Ġ} ĊĊĠĠĠ Ġval Ġproperty Ġ= ĠField Spec . builder ( Parameterized TypeName . get ( Java ClassNames . List , ĠJava ClassNames . Compiled Selection ), ĠpropertyName ) ĊĠĠĠĠĠĠĠ Ġ. initializer ( results . map Ġ{ Ġit . initializer Ġ}. toList Initializer Code block ( with New Lines Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . STATIC ) ĊĠĠĠĠĠĠĠ Ġ. add Modifiers ( if Ġ( private ) ĠModifier . PRIVATE Ġelse ĠModifier . PUBLIC ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġreturn Ġresults . flatMap Ġ{ Ġit . nested Field Specs Ġ} Ġ+ Ġproperty ĊĠ Ġ} ĊĊĠ Ġclass ĠSelection Result ( val Ġinitializer : ĠCode Block , Ġval Ġnested Field Specs : ĠList < Field Spec >) ĊĊĠ Ġprivate Ġfun ĠG QL Selection . walk ( private : ĠBoolean , Ġparent Type : ĠString ): ĠSelection Result ? Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠ Ġis ĠG QL Field Ġ-> Ġthis . walk ( private , Ġparent Type ) ĊĠĠĠĠĠ Ġis ĠG QL Inline Fragment Ġ-> Ġwalk ( private ) ĊĠĠĠĠĠ Ġis ĠG QL Fragment Spread Ġ-> Ġwalk () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠBoolean Expression < B Variable >. to Compiled Condition Initializer (): ĠCode Block Ġ{ ĊĠĠĠ Ġval Ġconditions Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠ Ġis ĠBoolean Expression . And Ġ-> Ġoperands . map Ġ{ Ġit . single Initializer () Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> ĠlistOf ( single Initializer ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġconditions . toList Initializer Code block () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠBoolean Expression < B Variable >. single Initializer (): ĠCode Block Ġ{ ĊĠĠĠ Ġvar Ġexpression Ġ= Ġthis ĊĠĠĠ Ġvar Ġinverted Ġ= Ġfalse ĊĠĠĠ Ġif Ġ( this Ġis ĠBoolean Expression . Not ) Ġ{ ĊĠĠĠĠĠ Ġexpression Ġ= Ġthis . operand ĊĠĠĠĠĠ Ġinverted Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcheck ( expression Ġis ĠBoolean Expression . Element ) ĊĊĠĠĠ Ġreturn ĠCode Block . of (" new Ġ$ T ($ S , Ġ$ L )", ĠJava ClassNames . Compiled Condition , Ġexpression . value . name , Ġinverted . toString ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠG QL Field . walk ( private : ĠBoolean , Ġparent Type : ĠString ): ĠSelection Result ? Ġ{ ĊĠĠĠ Ġval Ġexpression Ġ= Ġdirectives . to Boolean Expression () ĊĠĠĠ Ġif Ġ( expression Ġ== ĠBoolean Expression . False ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġval Ġbuilder Ġ= ĠCode Block . builder () ĊĊĠĠĠ Ġval Ġfield Definition Ġ= Ġdefinition From Scope ( schema , Ġparent Type ) !! ĊĊĠĠĠ Ġbuilder . add ("$ T . builder ($ S , Ġ$ L )", ĠJava ClassNames . Compiled Field , Ġname , Ġfield Definition . type . code Block ()) ĊĠĠĠ Ġbuilder . indent () ĊĊĠĠĠ Ġif Ġ( alias Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġbuilder . add (". alias ($ S )", Ġalias ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( expression Ġ!= ĠBoolean Expression . True ) Ġ{ ĊĠĠĠĠĠ Ġbuilder . add (". condition ($ L )", Ġexpression . to Compiled Condition Initializer ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( arguments ?. arguments ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠ Ġbuilder . add (". arguments ($ L )", Ġarguments !!. arguments . code Block ( name , Ġparent Type )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġnest eded Field Specs : ĠList < Field Spec > Ġ= Ġempty List () ĊĠĠĠ Ġval Ġselections Ġ= Ġselection Set ?. selections Ġ?: Ġempty List () ĊĠĠĠ Ġif Ġ( selections . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġnest eded Field Specs Ġ= Ġselections . walk ( alias Ġ?: Ġname , Ġprivate , Ġfield Definition . type . leaf Type (). name ) ĊĠĠĠĠĠ Ġbuilder . add (". selections ($ L )", Ġnest eded Field Specs . last (). name ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġbuilder . un indent () ĊĠĠĠ Ġbuilder . add (". build () ") ĊĊĠĠĠ Ġreturn ĠSelection Result ( builder . build (), Ġnest eded Field Specs ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠG QL Inline Fragment . walk ( private : ĠBoolean ): ĠSelection Result ? Ġ{ ĊĠĠĠ Ġval Ġexpression Ġ= Ġdirectives . to Boolean Expression () ĊĠĠĠ Ġif Ġ( expression Ġ== ĠBoolean Expression . False ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġname Ġ= Ġ" on ${ type Condition . name . capitalize First Letter () }" ĊĊĠĠĠ Ġval Ġbuilder Ġ= ĠCode Block . builder () ĊĠĠĠ Ġbuilder . add ("$ T . builder ($ L )", ĠJava ClassNames . Compiled Fragment , Ġpossible Types Code Block ( type Condition . name )) ĊĠĠĠ Ġbuilder . indent () ĊĠĠĠ Ġif Ġ( expression Ġ! is ĠBoolean Expression . True ) Ġ{ ĊĠĠĠĠĠ Ġbuilder . add (". condition ($ L )", Ġexpression . to Compiled Condition Initializer ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġnest eded Field Specs : ĠList < Field Spec > Ġ= Ġempty List () ĊĠĠĠ Ġval Ġselections Ġ= Ġselection Set . selections ĊĠĠĠ Ġif Ġ( selections . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġnest eded Field Specs Ġ= Ġselections . walk ( name , Ġprivate , Ġtype Condition . name ) ĊĠĠĠĠĠ Ġbuilder . add (". selections ($ L )", Ġ Ġnest eded Field Specs . last (). name ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġbuilder . un indent () ĊĠĠĠ Ġbuilder . add (". build () ") ĊĊĠĠĠ Ġreturn ĠSelection Result ( builder . build (), Ġnest eded Field Specs ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠG QL Fragment Spread . walk (): ĠSelection Result ? Ġ{ ĊĠĠĠ Ġval Ġexpression Ġ= Ġdirectives . to Boolean Expression () ĊĠĠĠ Ġif Ġ( expression Ġ== ĠBoolean Expression . False ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġfragment Definition Ġ= Ġall Fragment Definitions [ name ] !! ĊĊĠĠĠ Ġval Ġbuilder Ġ= ĠCode Block . builder () ĊĠĠĠ Ġbuilder . add ("$ T . builder ($ L )", ĠJava ClassNames . Compiled Fragment , Ġpossible Types Code Block ( fragment Definition . type Condition . name )) ĊĠĠĠ Ġbuilder . indent () ĊĠĠĠ Ġif Ġ( expression Ġ! is ĠBoolean Expression . True ) Ġ{ ĊĠĠĠĠĠ Ġbuilder . add (". condition ($ L )", Ġexpression . to Compiled Condition Initializer ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġbuilder . add (". selections ($ T .$ L )", Ġcontext . resolver . resolve Fragment Selections ( name ), Ġcontext . layout . root Selections PropertyName ()) ĊĠĠĠ Ġbuilder . un indent () ĊĠĠĠ Ġbuilder . add (". build () ") ĊĊĠĠĠ Ġreturn ĠSelection Result ( builder . build (), Ġempty List ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġpossible Types Code Block ( type Condition : ĠString ): ĠCode Block Ġ{ ĊĠĠĠ Ġreturn Ġschema . possible Types ( type Condition ). map Ġ{ ĠCode Block . of ( S , Ġit ) Ġ}. toList Initializer Code block () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠG QL Type . code Block (): ĠCode Block Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠ Ġis ĠG QL NonNull Type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ ĠCode Block . of (" new Ġ$ T ($ L )", ĠJava ClassNames . Compiled NotNull Type , Ġtype . code Block ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠG QL ListType Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ ĠCode Block . of (" new Ġ$ T ($ L )", ĠJava ClassNames . Compiled ListType , Ġtype . code Block ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠG QL Named Type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . resolver . resolve Compiled Type ( name ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠG QL List Value . code Block (): ĠCode Block Ġ{ ĊĠĠĠ Ġreturn Ġvalues . map Ġ{ ĊĠĠĠĠĠ Ġit . code Block () ĊĠĠĠ Ġ}. toList Initializer Code block () ĊĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠG QL Object Value . code Block (): ĠCode Block Ġ{ ĊĠĠĠ Ġreturn Ġfields . map Ġ{ ĊĠĠĠĠĠ Ġit . name Ġto Ġit . value . code Block () ĊĠĠĠ Ġ}. toMap Initializer Code block () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠG QL Value . code Block (): ĠCode Block Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠ Ġis ĠG QL Object Value Ġ-> Ġcode Block () ĊĠĠĠĠĠ Ġis ĠG QL List Value Ġ-> Ġcode Block () ĊĠĠĠĠĠ Ġis ĠG QL EnumValue Ġ-> ĠCode Block . of ( S , Ġvalue ) Ġ// ĠFIXME ĊĠĠĠĠĠ Ġis ĠG QL Int Value Ġ-> ĠCode Block . of ( L , Ġvalue ) ĊĠĠĠĠĠ Ġis ĠG QL Float Value Ġ-> ĠCode Block . of ( L , Ġvalue ) ĊĠĠĠĠĠ Ġis ĠG QL Boolean Value Ġ-> ĠCode Block . of ( L , Ġvalue ) ĊĠĠĠĠĠ Ġis ĠG QL StringValue Ġ-> ĠCode Block . of ( S , Ġvalue ) ĊĠĠĠĠĠ Ġis ĠG QL Variable Value Ġ-> ĠCode Block . of (" new Ġ$ T ($ S )", ĠJava ClassNames . Compiled Variable , Ġname ) ĊĠĠĠĠĠ Ġis ĠG QL NullValue Ġ-> ĠCode Block . of (" null ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠList < G QL Argument >. code Block ( fieldName : ĠString , Ġparent Type : ĠString ): ĠCode Block Ġ{ ĊĠĠĠ Ġval Ġtype Definition Ġ= Ġschema . type Definition ( parent Type ) ĊĠĠĠ Ġval Ġkey Args Ġ= Ġtype Definition . key Args ( fieldName ) ĊĊĠĠĠ Ġval Ġarguments Ġ= Ġsorted By Ġ{ Ġit . name Ġ}. map Ġ{ ĊĠĠĠĠĠ Ġval Ġargument Builder Ġ= ĠCode Block . builder () ĊĠĠĠĠĠ Ġargument Builder . add ( ĊĠĠĠĠĠĠĠĠĠ Ġ" new Ġ$ T ($ S , Ġ$ L , Ġ$ L )", ĊĠĠĠĠĠĠĠĠĠ ĠJava ClassNames . Compiled Argument , ĊĠĠĠĠĠĠĠĠĠ Ġit . name , ĊĠĠĠĠĠĠĠĠĠ Ġit . value . code Block (), ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Args . contains ( it . name )) Ġ" true " Ġelse Ġ" false " ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġargument Builder . build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġarguments . toList Initializer Code block () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠG QL Type Definition . key Args ( fieldName : ĠString ): ĠSet < String > Ġ{ ĊĠĠĠ Ġval Ġdirectives Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠ Ġis ĠG QL ObjectType Definition Ġ-> Ġdirectives ĊĠĠĠĠĠ Ġis ĠG QL Interface Type Definition Ġ-> Ġdirectives ĊĠĠĠĠĠ Ġelse Ġ-> Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġdirectives . filter Ġ{ Ġit . name Ġ== ĠSchema . FIELD _ POLICY Ġ}. filter Ġ{ ĊĠĠĠĠĠ Ġ( it . arguments ?. arguments ?. single Ġ{ Ġit . name Ġ== ĠSchema . FIELD _ POLICY _ FOR _ FIELD Ġ} ?. value Ġas ĠG QL StringValue ). value Ġ== ĠfieldName ĊĠĠĠ Ġ}. flatMap Ġ{ ĊĠĠĠĠĠ Ġ( it . arguments ?. arguments ?. single Ġ{ Ġit . name Ġ== ĠSchema . FIELD _ POLICY _ KEY _ ARGS Ġ} ?. value Ġas ? ĠG QL List Value )?. values Ġ?: Ġempty List () ĊĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠ Ġ( it Ġas ĠG QL StringValue ). value ĊĠĠĠ Ġ}. toSet () ĊĠ Ġ} Ċ } ĊĊ