package Ġcom . ap ol log raph ql . apollo . compiler . ast . builder Ċ Ċ import Ġcom . ap ol log raph ql . apollo . compiler . ast . Custom Types Ċ import Ġcom . ap ol log raph ql . apollo . compiler . ast . Enum Type Ċ import Ġcom . ap ol log raph ql . apollo . compiler . ast . ObjectType Ċ import Ġcom . ap ol log raph ql . apollo . compiler . ast . Type Ref Ċ import Ġcom . ap ol log raph ql . apollo . compiler . escape Kotlin Reserved Word Ċ import Ġcom . ap ol log raph ql . apollo . compiler . ir . Field Ċ import Ġcom . ap ol log raph ql . apollo . compiler . ir . Fragment Ċ import Ġcom . ap ol log raph ql . apollo . compiler . ir . Fragment Ref Ċ import Ġcom . ap ol log raph ql . apollo . compiler . ir . Inline Fragment Ċ import Ġcom . ap ol log raph ql . apollo . compiler . singular ize Ċ Ċ internal Ġclass ĠContext ( ĊĠĠĠ Ġval Ġcustom TypeMap : ĠCustom Types , ĊĠĠĠ Ġval Ġenums : ĠList < Enum Type >, ĊĠĠĠ Ġval Ġtypes PackageName : ĠString , ĊĠĠĠ Ġval Ġfragments Package : ĠString , ĊĠĠĠ Ġval Ġfragments : ĠMap < String , ĠFragment >, ĊĠĠĠ Ġprivate Ġval Ġobject Type Container : ĠMutable Map < Type Ref , ĠObjectType > Ġ= ĠLinkedHashMap () Ċ ) Ġ: ĠMap < Type Ref , ĠObjectType > Ġby Ġobject Type Container Ġ{ ĊĊĠ Ġprivate Ġval Ġreserved ObjectType Refs Ġ= ĠHashSet < Type Ref >() ĊĊĠ Ġfun Ġregister ObjectType ( ĊĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠ Ġschema TypeName : ĠString , ĊĠĠĠĠĠ Ġfragment Refs : ĠList < Fragment Ref >, ĊĠĠĠĠĠ Ġinline Fragments : ĠList < Inline Fragment >, ĊĠĠĠĠĠ Ġfields : ĠList < Field >, ĊĠĠĠĠĠ Ġkind : ĠObjectType . Kind , ĊĠĠĠĠĠ Ġsingular ize : ĠBoolean Ġ= Ġtrue ĊĠ Ġ): ĠType Ref Ġ{ ĊĠĠĠ Ġval Ġinline Fragment Fields Ġ= Ġif Ġ( inline Fragments . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġinline Fragment Super Ġ= Ġregister Inline Fragment Super ( ĊĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠ Ġschema Type Ġ= Ġschema TypeName ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġinline Fragments . map Ġ{ ĊĠĠĠĠĠĠĠ Ġit . inline Fragment Field ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Super Ġ= Ġinline Fragment Super ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġempty List () ĊĠĠĠ Ġval Ġ( fragments Field , Ġfragments ObjectType ) Ġ= Ġfragment Refs ĊĠĠĠĠĠĠĠ Ġ. associate With Ġ{ Ġfragment Ref Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġfragments [ fragment Ref . name ] Ġ?: Ġthrow ĠIllegalArgumentException (" Unable Ġto Ġfind Ġfragment Ġdefinition : Ġ${ fragment Ref . name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. ast Fragments Object FieldType ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragments Package Ġ= Ġfragments Package , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Optional Ġ= Ġ{ Ġtype Condition Ġ!= Ġschema TypeName Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġnormalized ClassName Ġ= Ġname . escape Kotlin Reserved Word (). let Ġ{ Ġoriginal ClassName Ġ-> ĊĠĠĠĠĠ Ġvar ĠclassName Ġ= Ġoriginal ClassName ĊĠĠĠĠĠ Ġwhile Ġ( className . first () Ġ== Ġ'_ ') Ġ{ ĊĠĠĠĠĠĠĠ ĠclassName Ġ= ĠclassName . remove Range ( 0 , Ġ 1 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ"_ ". repeat ( original ClassName . length Ġ- ĠclassName . length ) Ġ+ ĠclassName . capitalize () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġunique Type Ref Ġ= Ġ( reserved ObjectType Refs ). generate Unique Type Ref ( ĊĠĠĠĠĠĠĠ ĠtypeName Ġ= Ġnormalized ClassName . let Ġ{ Ġif Ġ( singular ize ) Ġit . singular ize () Ġelse Ġit Ġ} ĊĠĠĠ Ġ) ĊĠĠĠ Ġreserved ObjectType Refs . add ( unique Type Ref ) ĊĠĠĠ Ġobject Type Container [ unique Type Ref ] Ġ= ĠObjectType ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġunique Type Ref . name , ĊĠĠĠĠĠĠĠ Ġschema TypeName Ġ= Ġschema TypeName , ĊĠĠĠĠĠĠĠ Ġfields Ġ= Ġfields . map Ġ{ Ġit . ast ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġif Ġ( fragments Field Ġ!= Ġnull ) Ġit Ġ+ Ġfragments Field Ġelse Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġinline Fragment Fields , ĊĠĠĠĠĠĠĠ Ġfragments Type Ġ= Ġfragments ObjectType , ĊĠĠĠĠĠĠĠ Ġkind Ġ= Ġkind ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn Ġunique Type Ref ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠSet < Type Ref >. generate Unique Type Ref ( typeName : ĠString ): ĠType Ref Ġ{ ĊĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġunique Type Ref Ġ= ĠType Ref ( name Ġ= ĠtypeName ) ĊĠĠĠ Ġwhile Ġ( find Ġ{ Ġit . name . toLowerCase () Ġ== Ġunique Type Ref . name . toLowerCase () Ġ} Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġunique Type Ref Ġ= ĠType Ref ( name Ġ= Ġ"$ typeName ${ ++ index }") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġunique Type Ref ĊĠ Ġ} Ċ } Ċ