/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 . android . tools . idea . lang . android Sql . room Ċ Ċ import Ġcom . android . support . Android x Name Ċ import Ġcom . android . tools . idea . kotlin . find Argument Expression Ċ import Ġcom . android . tools . idea . kotlin . fq Name Matches Ċ import Ġcom . android . tools . idea . kotlin . try Evaluate Constant Ċ import Ġcom . android . tools . idea . lang . android Sql . resolution . Android Sql Column Ċ import Ġcom . android . tools . idea . lang . android Sql . resolution . PRIMARY _ KEY _ NAMES Ċ import Ġcom . android . tools . idea . lang . android Sql . resolution . PRIMARY _ KEY _ NAMES _ FOR _ FT S Ċ import Ġcom . android . tools . idea . project system . Scope Type Ċ import Ġcom . android . tools . idea . project system . getModule System Ċ import Ġcom . android . tools . idea . project system . get Scope Type Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . diagnostic . debug Ċ import Ġcom . intellij . openapi . module . Module Ċ import Ġcom . intellij . psi .* Ċ import Ġcom . intellij . psi . Java Psi Facade Ċ import Ġcom . intellij . psi . Psi Annotation Ċ import Ġcom . intellij . psi . Psi Array Initializer Member Value Ċ import Ġcom . intellij . psi . Psi Class Ċ import Ġcom . intellij . psi . Psi Class Object Access Expression Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Field Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . Psi Modifier Ċ import Ġcom . intellij . psi . Psi Modifier List Ċ import Ġcom . intellij . psi . Psi Modifier List Owner Ċ import Ġcom . intellij . psi . Psi Named Element Ċ import Ġcom . intellij . psi . Smart Pointer Manager Ċ import Ġcom . intellij . psi . search . Global Search Scope Ċ import Ġcom . intellij . psi . search . sear ches . Annotated Elements Search . search Psi Classes Ċ import Ġcom . intellij . psi . util .* Ċ import Ġcom . intellij . test Framework . Light Virtual File Ċ import Ġorg . jetbrains . kotlin . as Java . elements . Kt Light Field Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ Ċ private Ġval ĠLOG Ġ= ĠLogger . getInstance ( Room Schema Manager :: class . java ) Ċ Ċ /** ĠUtility Ġfor Ġconstructing Ġa Ġ[ Room Schema ] Ġusing ĠIDE Ġindices . Ġ*/ Ċ class ĠRoom Schema Manager ( val Ġmodule : ĠModule ) Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġfun ĠgetInstance ( module : ĠModule ): ĠRoom Schema Manager Ġ= Ġmodule . getService ( Room Schema Manager :: class . java ) !! ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġschemas Ġ= ĠScope Type . values (). associate Ġ{ Ġit Ġto Ġcreate Cached Value ( it ) Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Cached Value ( scope : ĠScope Type ): ĠCached Value < Room Schema > Ġ{ ĊĠĠĠ Ġreturn ĠCached Values Manager . getManager ( module . project ). create Cached Value Ġ{ ĊĠĠĠĠĠ ĠCached Value Provider . Result ( build Schema ( module , Ġscope ), ĠPsi Modification Tracker . MO DIF ICATION _ COUNT ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġthe Ġ[ Room Schema ] Ġvisible Ġfrom Ġthe Ġgiven Ġ[ Psi File ] Ġor Ġnull Ġif ĠRoom Ġis Ġnot Ġused Ġin Ġthe Ġproject . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠThe Ġschema Ġis Ġcached Ġin Ġthe Ġfile Ġand Ġre computed Ġafter Ġa Ġchange Ġto ĠP SI . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġget Schema ( psi File : ĠPsi File ): ĠRoom Schema ? Ġ{ ĊĠĠĠ Ġvar Ġv File Ġ= Ġpsi File . original File . virtual File Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġ// ĠWhen Ġwe Ġare Ġinside ĠEdit ing ĠFragment Ġv File Ġdoes Ġnot Ġbelong Ġto Ġmodule . ĠWe Ġneed Ġto Ġuse Ġoriginal Ġone . ĊĠĠĠ Ġif Ġ( v File Ġis ĠLight Virtual File Ġ&& Ġv File . original File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġv File Ġ= Ġv File . original File ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! module . module Content Scope . contains ( v File )) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġscope Type Ġ= Ġmodule . getModule System (). get Scope Type ( v File , Ġmodule . project ) ĊĠĠĠ Ġreturn Ġschemas [ scope Type ] !!. value ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġconstant Evaluation Helper Ġ= ĠJava Psi Facade . getInstance ( module . project ). constant Evaluation Helper ĊĠ Ġprivate Ġval Ġpointer Manager Ġ= ĠSmart Pointer Manager . getInstance ( module . project ) ĊĊĠ Ġ/** ĠBuilds Ġthe Ġschema Ġusing ĠI J Ġindexes . Ġ*/ ĊĠ Ġprivate Ġfun Ġbuild Schema ( module : ĠModule , Ġscope Type : ĠScope Type ): ĠRoom Schema ? Ġ{ ĊĠĠĠ Ġval Ġscope Ġ= Ġmodule . getModule System (). get Resolve Scope ( scope Type ) ĊĊĠĠĠ Ġif Ġ(! is Room Present In Scope ( scope )) Ġreturn Ġnull ĊĊĠĠĠ ĠLOG . debug Ġ{ Ġ" Re calcul ating ĠRoom Ġschema Ġfor Ġmodule Ġ${ module . name } Ġfor Ġscope Ġ${ scope Type }" Ġ} ĊĊĠĠĠ Ġval Ġpsi Facade Ġ= ĠJava Psi Facade . getInstance ( module . project ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġ// ĠSome Ġof Ġthis Ġlogic Ġis Ġrepeated Ġin Ġ[ Room Reference Search Executor ], Ġmake Ġsure Ġto Ġkeep Ġthem Ġin Ġsync . ĊĠĠĠ Ġval Ġentities Ġ= Ġprocess Annotated Classes ( psi Facade , Ġscope , ĠRoom Annotations . ENTITY ) Ġ{ Ġcreate Table ( it , ĠRoom Table . Type . ENTITY ) Ġ} ĊĠĠĠ Ġval Ġviews Ġ= Ġprocess Annotated Classes ( psi Facade , Ġscope , ĠRoom Annotations . DATABASE _ VIEW ) Ġ{ Ġcreate Table ( it , ĠRoom Table . Type . VIEW ) Ġ} ĊĠĠĠ Ġval Ġdatabases Ġ= Ġprocess Annotated Classes ( psi Facade , Ġscope , ĠRoom Annotations . DATABASE ) Ġ{ Ġthis . create Database ( it , Ġpointer Manager ) Ġ} ĊĠĠĠ Ġval Ġda os Ġ= Ġprocess Annotated Classes ( psi Facade , Ġscope , ĠRoom Annotations . DAO ) Ġ{ ĊĠĠĠĠĠ ĠDao ( pointer Manager . create Smart Psi Element Pointer ( it )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠRoom Schema ( databases , Ġentities Ġ+ Ġviews , Ġda os ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFinds Ġclasses Ġannotated Ġwith Ġthe Ġgiven Ġannotation Ġ( both Ġold Ġand Ġnew Ġnames ) Ġand Ġprocesses Ġthem Ġusing Ġthe Ġsupplied Ġ[ processor ] Ġfunction , ĊĠĠ Ġ* Ġgather ing Ġnon - null Ġresults . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > Ġprocess Annotated Classes ( ĊĠĠĠ Ġpsi Facade : ĠJava Psi Facade , ĊĠĠĠ Ġscope : ĠGlobal Search Scope , ĊĠĠĠ Ġannotation : ĠAndroid x Name , ĊĠĠĠ Ġprocessor : Ġ( Psi Class ) Ġ-> ĠT ? ĊĠ Ġ): ĠSet < T > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠHashSet < T >() ĊĠĠĠ Ġannotation . both Names Ġ{ Ġname Ġ-> ĊĠĠĠĠĠ Ġpsi Facade . find Class ( name , Ġscope )?. let Ġ{ Ġsearch Psi Classes ( it , Ġscope ). map NotNull To ( result , Ġprocessor ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Table ( psi Class : ĠPsi Class , Ġtype : ĠRoom Table . Type ): ĠRoom Table ? Ġ{ ĊĠĠĠ Ġval Ġ( tableName , ĠtableName Element ) Ġ= ĠgetName And Name Element ( ĊĠĠĠĠĠ Ġpsi Class , ĊĠĠĠĠĠ Ġannotation Name Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠRoom Table . Type . ENTITY Ġ-> ĠRoom Annotations . ENTITY ĊĠĠĠĠĠĠĠ ĠRoom Table . Type . VIEW Ġ-> ĠRoom Annotations . DATABASE _ VIEW ĊĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠ Ġannotation AttributeName Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠRoom Table . Type . ENTITY Ġ-> Ġ" tableName " ĊĠĠĠĠĠĠĠ ĠRoom Table . Type . VIEW Ġ-> Ġ" view Name " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġreturn ĠRoom Table ( ĊĠĠĠĠĠ Ġpointer Manager . create Smart Psi Element Pointer ( psi Class ), ĊĠĠĠĠĠ Ġtype , ĊĠĠĠĠĠ ĠtableName , ĊĠĠĠĠĠ Ġpointer Manager . create Smart Psi Element Pointer ( tableName Element ), ĊĠĠĠĠĠ Ġcreate Columns ( psi Class , ĠtableName , Ġtype ) ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Columns ( psi Class : ĠPsi Class , ĠtableName : ĠString , Ġtype : ĠRoom Table . Type ): ĠSet < Android Sql Column > Ġ{ ĊĠĠĠ Ġval Ġcolumns Ġ= Ġcreate Columns From Fields ( psi Class ). to HashSet < Android Sql Column >() ĊĠĠĠ Ġval Ġtable Element Ġ= Ġpointer Manager . create Smart Psi Element Pointer ( psi Class ). element !! ĊĠĠĠ Ġval Ġprimary Key Element Ġ= Ġcolumns . find Ġ{ Ġit . is PrimaryKey Ġ} ĊĠĠĠ Ġif Ġ( psi Class . annotations . any (:: is F ts Annotation )) Ġ{ ĊĠĠĠĠĠ Ġ// ĠIn ĠF ts Ġtables Ġwe Ġcan Ġuse Ġtable Ġname Ġas Ġa Ġcolumn Ġin Ġqueries . ĊĠĠĠĠĠ Ġcolumns . add ( Room F ts TableColumn ( table Element , ĠtableName )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( primaryKey Element Ġ== Ġnull Ġ&& Ġtype Ġ!= ĠRoom Table . Type . VIEW ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠRO WID Ġcan Ġbe Ġreferenced Ġin Ġqueries Ġusing Ġmultiple Ġspecial Ġnames Ġ[ alternative Primary Keys Names ], Ġbut Ġdoesn 't Ġneed Ġto Ġbe Ġdeclared . ĊĠĠĠĠĠ Ġ// ĠSee Ġ[ SQLite Ġdocs ]( https :// sqlite . org / lang _ create table . html # row id ). ĊĠĠĠĠĠ Ġcolumns . add ( Room Row id Column ( ĊĠĠĠĠĠĠĠ ĠPsi Element For Fake Column ( table Element ), Ġget PrimaryKey Names ( psi Class ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġcolumns ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis F ts Annotation ( psi Annotation : ĠPsi Annotation ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġq Name Ġ= Ġpsi Annotation . qualified Name ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠ ĠRoom Annotations . FT S 3 . is Equals ( q Name ) Ġ-> Ġtrue ĊĠĠĠĠĠ ĠRoom Annotations . FT S 4 . is Equals ( q Name ) Ġ-> Ġtrue ĊĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget PrimaryKey Names ( psi Class : ĠPsi Class ): ĠSet < String > Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( psi Class . annotations . any (:: is F ts Annotation )) ĠPRIMARY _ KEY _ NAMES _ FOR _ FT S Ġelse ĠPRIMARY _ KEY _ NAMES ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Columns From Fields ( psi Class : ĠPsi Class , Ġname Prefix : ĠString Ġ= Ġ"") : ĠSequence < Room Field Column > Ġ{ ĊĠĠĠ Ġreturn Ġpsi Class . all Fields ĊĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . modifier List ?. has Modifier Property ( Psi Modifier . STATIC ) Ġ== Ġtrue Ġ} ĊĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . modifier List ?. find Annotation ( Room Annotations . IGNORE ) Ġ!= Ġnull Ġ} ĊĠĠĠĠĠ Ġ. flatMap Ġ{ Ġpsi Field Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġembedded Annotation Ġ= Ġpsi Field . modifier List ?. find Annotation ( Room Annotations . EMB ED DED ) ĊĠĠĠĠĠĠĠ Ġif Ġ( embedded Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcreate Columns From Embedded Field ( psi Field , Ġembedded Annotation , Ġname Prefix ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġthis Field Ġ= ĠgetName And Name Element ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpsi Field , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Name Ġ= ĠRoom Annotations . COLUMN _ INFO , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotation AttributeName Ġ= Ġ" name " ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġ( columnName , ĠcolumnName Element ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis PrimaryKey Ġ= Ġpsi Field . modifier List ?. find Annotation ( Room Annotations . PRIMARY _ KEY ) Ġ!= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Field Column ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Manager . create Smart Psi Element Pointer ( psi Field ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Prefix Ġ+ ĠcolumnName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Manager . create Smart Psi Element Pointer ( columnName Element ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis PrimaryKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is PrimaryKey ) Ġget PrimaryKey Names ( psi Class ) Ġelse Ġempty Set () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Field Ġ!= Ġnull ) Ġsequence Of ( this Field ) Ġelse Ġempty Sequence () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Columns From Embedded Field ( ĊĠĠĠ Ġembedded Field : ĠPsi Field , ĊĠĠĠ Ġembedded Annotation : ĠPsi Annotation , ĊĠĠĠ Ġcurrent Prefix : ĠString ĊĠ Ġ): ĠSequence < Room Field Column > Ġ{ ĊĠĠĠ Ġval Ġnew Prefix Ġ= Ġembedded Annotation . find AttributeValue (" prefix ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġconstant Evaluation Helper . compute Constant Expression ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ"" ĊĊĠĠĠ Ġval Ġembedded Class Ġ= ĠPsi Util . resolve Class In ClassType Only ( embedded Field . type ) Ġ?: Ġreturn Ġempty Sequence () ĊĊĠĠĠ Ġreturn Ġcreate Columns From Fields ( embedded Class , Ġcurrent Prefix Ġ+ Ġnew Prefix ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Database ( psi Class : ĠPsi Class , Ġpointer Manager : ĠSmart Pointer Manager ): ĠRoom Database ? Ġ{ ĊĠĠĠ Ġval Ġentities Element Value : ĠHashSet < Psi Class Pointer >? Ġ= ĊĠĠĠĠĠ Ġpsi Class . modifier List ĊĠĠĠĠĠĠĠ Ġ? . find Annotation ( Room Annotations . DATABASE ) ĊĠĠĠĠĠĠĠ Ġ? . find Declared AttributeValue (" tables ") ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġit Ġas ? ĠPsi Array Initializer Member Value Ġ} ĊĠĠĠĠĠĠĠ Ġ? . initial izers ĊĠĠĠĠĠĠĠ Ġ? . map NotNull To ( HashSet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġclass Object Access Expression Ġ= Ġit Ġas ? ĠPsi Class Object Access Expression Ġ?: Ġreturn @ map NotNull To Ġnull ĊĠĠĠĠĠĠĠĠĠ ĠPsi Util . resolve Class In ClassType Only ( class Object Access Expression . operand . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let ( pointer Manager :: create Smart Psi Element Pointer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠRoom Database ( pointer Manager . create Smart Psi Element Pointer ( psi Class ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentities Element Value Ġ?: Ġempty Set ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġ< T > ĠgetName And Name Element ( ĊĠĠĠ Ġelement : ĠT , ĊĠĠĠ Ġannotation Name : ĠAndroid x Name , ĊĠĠĠ Ġannotation AttributeName : ĠString ĊĠ Ġ): ĠPair < String , ĠPsi Element >? ĊĠĠĠ Ġwhere ĠT Ġ: ĠPsi Modifier List Owner , ĊĠĠĠĠĠĠĠĠĠ ĠT Ġ: ĠPsi Named Element Ġ{ ĊĠĠĠ Ġ// ĠFirst Ġlook Ġfor Ġthe Ġannotation Ġthat Ġcan Ġoverride Ġthe Ġname : ĊĠĠĠ Ġreturn Ġget Annotation And Annotation Name ( element , Ġannotation Name , Ġannotation AttributeName ) ĊĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFall Ġback Ġto Ġthe Ġname Ġused Ġin Ġcode : ĊĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġelement . name ?. let Ġ{ Ġit Ġto Ġelement Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠK t Light Field . getProperty Annotation Expression ( ĊĠĠĠ Ġannotation Name : ĠAndroid x Name , ĊĠĠĠ Ġannotation AttributeName : ĠString ĊĠ Ġ): ĠK t Expression ? Ġ{ ĊĠĠĠ Ġval Ġannotation Entry Ġ= ĊĠĠĠĠĠ Ġkotlin Origin ĊĠĠĠĠĠĠĠ Ġ? . annotation Entries ĊĠĠĠĠĠĠĠ Ġ? . first OrNull Ġ{ Ġit . fq Name Matches ( annotation Name . old Name ()) Ġ|| Ġit . fq Name Matches ( annotation Name . new Name ()) Ġ} ĊĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġ// ĠProperty Ġannotation Ġit Ġis Ġannotation Ġwithout Ġtarget ĊĠĠĠ Ġreturn Ġif Ġ( annotation Entry . use Site Target Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġannotation Entry . find Argument Expression ( annotation AttributeName ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġannotation ĠPsi Element Ġand Ġoverride Ġname Ġfrom Ġit ĊĠĠ Ġ* ĊĠĠ Ġ* Ġif Ġthere Ġis Ġno Ġcorrect Ġannotation Ġreturns Ġnull ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġ< T > Ġget Annotation And Annotation Name ( ĊĠĠĠ Ġelement : ĠT , ĊĠĠĠ Ġannotation Name : ĠAndroid x Name , ĊĠĠĠ Ġannotation AttributeName : ĠString ĊĠ Ġ): ĠPair < String , ĠPsi Element >? ĊĠĠĠ Ġwhere ĠT Ġ: ĠPsi Modifier List Owner , ĊĠĠĠĠĠĠĠĠĠ ĠT Ġ: ĠPsi Named Element Ġ{ ĊĠĠĠ Ġvar Ġannotation : ĠPsi Element ? Ġ= Ġelement . modifier List ĊĠĠĠĠĠ Ġ? . find Annotation ( annotation Name ) ĊĠĠĠĠĠ Ġ? . find Declared AttributeValue ( annotation AttributeName ) ĊĠĠĠ Ġvar Ġname : ĠString ? Ġ= Ġannotation ?. let Ġ{ Ġconstant Evaluation Helper . compute Constant Expression ( it )?. toString () Ġ} ĊĊĠĠĠ Ġ// ĠThere Ġis Ġspecial Ġcase Ġfor ĠK t Light Field Ġwhen Ġwe Ġhave Ġannotation Ġwithout Ġtarget Ġ( property Ġannotation ) Ġe . g Ġ@ Column Info ( name Ġ= Ġ' override _ name ') ĊĠĠĠ Ġ// ĠIn Ġthat Ġcase Ġelement . modifier List . find Annotation ( annotation Name ) Ġreturns Ġnull Ġbecause Ġit Ġsearches Ġonly Ġfor Ġannotation Ġwith ĠFIELD Ġtarget ĊĠĠĠ Ġif Ġ( name Ġ== Ġnull Ġ&& Ġelement Ġis ĠK t Light Field ) Ġ{ ĊĠĠĠĠĠ Ġval Ġkt Expression Ġ= Ġelement . getProperty Annotation Expression ( annotation Name , Ġannotation AttributeName ) ĊĠĠĠĠĠ Ġname Ġ= Ġkt Expression ?. try Evaluate Constant () ĊĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull ) Ġannotation Ġ= Ġkt Expression Ġas ĠPsi Element ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġname ?. let Ġ{ Ġit Ġto Ġannotation !! Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġinline Ġfun ĠAndroid x Name . both Names ( f : Ġ( String ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġf ( old Name ()) ĊĠĠĠ Ġf ( new Name ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠPsi Modifier List . find Annotation ( annotation : ĠAndroid x Name ): ĠPsi Annotation ? Ġ{ ĊĠĠĠ Ġreturn Ġfind Annotation ( annotation . old Name ()) Ġ?: Ġfind Annotation ( annotation . new Name ()) ĊĠ Ġ} Ċ } Ċ