/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠNet flix , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . netflix . d gs . plugin . services Ċ Ċ import Ġcom . intellij . psi . Psi Annotation Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġcom . intellij . util . Processor Ċ import Ġcom . intellij . util . containers . or Null Ċ import Ġcom . netflix . d gs . plugin .* Ċ import Ġcom . netflix . d gs . plugin . services . internal . GraphQL Schema Registry Ċ import Ġorg . jetbrains . u ast . U Annotation Ċ import Ġorg . jetbrains . u ast . U Class Ċ import Ġorg . jetbrains . u ast . U Method Ċ import Ġorg . jetbrains . u ast . getParent OfType Ċ Ċ class ĠD gs Component Processor ( ĊĠĠĠ Ġprivate Ġval Ġgraph QL Schema Registry : ĠGraphQL Schema Registry , ĊĠĠĠ Ġprivate Ġval Ġd gs Component Index : ĠD gs Component Index Ċ ) Ġ: ĠProcessor < U Annotation > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprocess ( u Annotation : ĠU Annotation ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġu Method Ġ= Ġu Annotation . getParent OfType < U Method >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( u Method Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD gs Data Fetcher . is Data Fetcher Annotation ( u Annotation ) Ġ-> Ġprocess Data Fetcher ( u Method , Ġu Annotation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD gs Entity Fetcher . is Entity Fetcher Annotation ( u Annotation ) Ġ-> Ġprocess Entity Fetcher ( u Method , Ġu Annotation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD gs Runtime W iring . is D gs Runtime W iring Annotation ( u Annotation ) Ġ-> Ġprocess Runtime W iring ( u Method , Ġu Annotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu Class Ġ= Ġu Annotation . getParent OfType < U Class >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( u Class Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD gs DataLoader . is DataLoader Annotation ( u Annotation ) Ġ-> Ġprocess DataLoader ( u Class , Ġu Annotation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD gs Directive . is D gs Directive Annotation ( u Annotation ) Ġ-> Ġprocess Directive ( u Annotation , Ġu Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD gs Scalar . is D gs Scalar Annotation ( u Annotation ) Ġ-> Ġprocess Scalar ( u Annotation , Ġu Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Scalar ( u Annotation : ĠU Annotation , Ġu Class : ĠU Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname From Annotation Ġ= ĠD gs Directive . getName From Annotation ( u Annotation ) ĊĠĠĠĠĠĠĠ Ġif Ġ( name From Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd gs Scalar Ġ= ĠD gs Scalar ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname From Annotation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Class . source Psi !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Annotation . source Psi !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Annotation . source Psi !!. containing File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph QL Schema Registry . psi For Scalar ( u Annotation . source Psi !! , Ġname From Annotation ). or Null () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġd gs Component Index . scal ars . add ( d gs Scalar ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Runtime W iring ( u Method : ĠU Method , Ġu Annotation : ĠU Annotation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġd gs Runtime W iring Ġ= ĠD gs Runtime W iring ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu Method . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu Method . source Psi !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu Annotation . source Psi !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu Method . source Psi !!. containing File ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġd gs Component Index . runtime W ir ings . add ( d gs Runtime W iring ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Directive ( u Annotation : ĠU Annotation , Ġu Class : ĠU Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname From Annotation Ġ= ĠD gs Directive . getName From Annotation ( u Annotation ) ĊĠĠĠĠĠĠĠ Ġif Ġ( name From Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd gs Directive Ġ= ĠD gs Directive ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname From Annotation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Class . source Psi !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Annotation . source Psi !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Annotation . source Psi ?. containing File !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph QL Schema Registry . psi For Directive ( u Annotation . source Psi !! , Ġname From Annotation ). or Null () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġd gs Component Index . directives . add ( d gs Directive ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess DataLoader ( u Class : ĠU Class , Ġu Annotation : ĠU Annotation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname From Annotation Ġ= ĠD gs DataLoader . getName From Annotation ( u Annotation ) ĊĠĠĠĠĠĠĠ Ġif Ġ( name From Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd gs DataLoader Ġ= ĠD gs DataLoader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname From Annotation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Class . source Psi !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Annotation . source Psi !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Annotation . source Psi ?. containing File !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd gs Component Index . data Lo aders . add ( d gs DataLoader ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Entity Fetcher ( u Method : ĠU Method , Ġu Annotation : ĠU Annotation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= ĠD gs Entity Fetcher . getName ( u Method ) ĊĊĠĠĠĠĠĠĠ Ġval Ġd gs Entity Fetcher Ġ= ĠD gs Entity Fetcher ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu Method . source Psi !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu Annotation . source Psi !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu Annotation . source Psi ?. containing File !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph QL Schema Registry . psi For Schema Type ( u Method , Ġ"_ entities ", Ġfield )?. or Null () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġd gs Component Index . entity Fetch ers . add ( d gs Entity Fetcher ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Data Fetcher ( u Method : ĠU Method , Ġu Annotation : ĠU Annotation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Annotation Ġ= Ġu Method . getAnnotation (" com . netflix . graphql . d gs . D gs Data . List ") ĊĠĠĠĠĠĠĠ Ġif ( list Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Tree Util . find Children OfType ( list Annotation , ĠPsi Annotation :: class . java ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Type Ġ= ĠD gs Data Fetcher . getParent Type ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= ĠD gs Data Fetcher . getField From Annotation ( it ) ?: u Method . name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Because Ġwe Ġuse Ġthe Ġstub s Ġindex , Ġwe Ġmight Ġprocess Ġa Ġ@ D gs Query Ġannotation Ġas Ġ@ D gs Data Ġas Ġwell , Ġwhich Ġwon 't Ġhave Ġparent Type . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd gs Data Fetcher Ġ= ĠD gs Data Fetcher ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Method . source Psi !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Annotation . source Psi ?. containing File !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph QL Schema Registry . psi For Schema Type ( u Method , Ġparent Type , Ġfield )?. or Null () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd gs Component Index . data Fetch ers . add ( d gs Data Fetcher ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Type Ġ= ĠD gs Data Fetcher . getParent Type ( u Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= ĠD gs Data Fetcher . getField ( u Method ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Because Ġwe Ġuse Ġthe Ġstub s Ġindex , Ġwe Ġmight Ġprocess Ġa Ġ@ D gs Query Ġannotation Ġas Ġ@ D gs Data Ġas Ġwell , Ġwhich Ġwon 't Ġhave Ġparent Type . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd gs Data Fetcher Ġ= ĠD gs Data Fetcher ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Method . source Psi !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Annotation . source Psi !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Annotation . source Psi ?. containing File !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph QL Schema Registry . psi For Schema Type ( u Method , Ġparent Type , Ġfield )?. or Null () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd gs Component Index . data Fetch ers . add ( d gs Data Fetcher ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }