/* Ċ Ġ* Ġ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 . tools . idea . lang . android Sql . Not Ren am ableElement Ċ import Ġcom . android . tools . idea . lang . android Sql . parser . Android Sql Lexer Ċ import Ġcom . android . tools . idea . lang . android Sql . refactor ing . Android Sql Find Usage s Provider Ċ import Ġcom . android . tools . idea . lang . android Sql . resolution . Android Sql Column Ċ import Ġcom . android . tools . idea . lang . android Sql . resolution . Android Sql Definition Ċ import Ġcom . intellij . lang . cache Builder . Word Occurrence Ċ import Ġcom . intellij . openapi . application . Query Executor Base Ċ import Ġcom . intellij . openapi . application . Read Action Ċ import Ġcom . intellij . openapi . application . run Read Action Ċ import Ġcom . intellij . openapi . module . Module Util Ċ import Ġcom . intellij . psi . Psi Class Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Field Ċ import Ġcom . intellij . psi . Psi Manager Ċ import Ġcom . intellij . psi . Psi Named Element Ċ import Ġcom . intellij . psi . Psi Reference Ċ import Ġcom . intellij . psi . search . sear ches . References Search Ċ import Ġcom . intellij . util . Common Processors Ċ import Ġcom . intellij . util . Processor Ċ import Ġorg . jetbrains . kotlin . as Java . to Light Class Ċ import Ġorg . jetbrains . kotlin . as Java . to Light Elements Ċ import Ġorg . jetbrains . kotlin . psi . Kt Property Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . containing Class Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . first Is Instance OrNull Ċ Ċ /** Ċ Ġ* Ġ` references Search ` Ġthat Ġchecks Ġthe Ġword Ġindex Ġfor Ġthe Ġright Ġwords Ġ( in Ġcase Ġa Ġtable / column Ġname Ġis Ġnot Ġthe Ġsame Ġas Ġclass Ġname ). Ċ Ġ* Ċ Ġ* ĠAlso Ġit Ġdoes Ġcase Ġins ensitive Ġsearch . Ċ Ġ*/ Ċ class ĠRoom Reference Search Executor Ġ: ĠQuery Executor Base < Psi Reference , ĠReferences Search . Search Parameters >() Ġ{ ĊĠ Ġprivate Ġfun Ġget Schema ( element : ĠPsi Element ) Ġ= ĠRead Action . compute < Room Schema ?, ĠNothing > Ġ{ ĊĠĠĠ Ġif Ġ( element . containing File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġmodule Ġ= ĠModule Util . find Module For Psi Element ( element ) Ġ?: Ġreturn @ compute Ġnull ĊĠĠĠĠĠ ĠRoom Schema Manager . getInstance ( module ). getSchema ( element . containing File ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġprocess Query ( query Parameters : ĠReferences Search . Search Parameters , Ġconsumer : ĠProcessor < in ĠPsi Reference >) Ġ{ ĊĠĠĠ Ġvar Ġelement Ġ= Ġquery Parameters . element To Search ĊĠĠĠ Ġif Ġ( element Ġis ĠNot Ren am ableElement ) Ġ{ ĊĠĠĠĠĠ Ġelement Ġ= Ġelement . delegate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġ( words , Ġreference Target ) Ġ= Ġrun Read Action Ġ{ ĊĊĠĠĠĠĠ Ġif Ġ(! Room Dependency Checker . getInstance ( ĊĠĠĠĠĠĠĠĠĠ Ġelement . project ). is Room Present ()) Ġreturn @ run Read Action Ġnull ĊĊĠĠĠĠĠ Ġ// ĠReturn Ġearly Ġif Ġpossible : Ġthis Ġmethod Ġis Ġcalled Ġby Ġvarious Ġins pe ctions Ġon Ġall Ġkinds Ġof ĠP SI Ġelements , Ġin Ġmost Ġcases Ġwe Ġdon 't Ġhave Ġto ĊĠĠĠĠĠ Ġ// Ġdo Ġanything Ġwhich Ġmeans Ġwe Ġdon 't Ġblock Ġa ĠF J Ġthread Ġby Ġbuilding Ġa ĠRoom Ġschema . ĊĠĠĠĠĠ Ġif Ġ(! element . defines Room Schema ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ run Read Action Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġschema Ġ= Ġget Schema ( element ) ĊĠĠĠĠĠ Ġif Ġ( schema Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Case : Ġmodule Ġthat Ġelement Ġbelongs Ġto Ġdoesn 't Ġhave Ġschema , Ġbut Ġsubclass Ġin Ġanother Ġmodule Ġcan Ġbe Ġannotated Ġwith Ġ`@ Entity `. ĊĠĠĠĠĠĠĠ Ġ// There fore Ġwe Ġwant Ġto Ġmake Ġcase Ġins ensitive Ġsearch Ġfor Ġthat Ġelement ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠPsi Named Element Ġ&& Ġelement . name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠPair ( set Of ( element . name !! ), Ġelement ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠgetName Definition ( schema , Ġelement )?. let ( this :: choose Words And Element ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġ?: Ġreturn ĊĊĠĠĠ Ġ// ĠNote : ĠQuery Executor Base Ġis Ġa Ġstrange ĠAPI : Ġthe Ġna ive Ġway Ġto Ġimplement Ġit Ġis Ġto Ġsomehow Ġfind Ġthe Ġreferences Ġand Ġfeed Ġthem Ġto Ġthe ĊĠĠĠ Ġ// Ġconsumer . ĠThe Ġ" proper " Ġway Ġis Ġto Ġget Ġthe Ġoptimizer Ġand Ġschedule Ġan Ġindex Ġsearch Ġfor Ġreferences Ġto Ġa Ġgiven Ġelement Ġthat Ġinclude Ġa ĊĠĠĠ Ġ// Ġgiven Ġtext . ĠScheduled Ġsearches Ġget Ġmerged Ġand Ġrun Ġlater . ĠWe Ġuse Ġthe Ġlatter ĠAPI , Ġbut : ĊĠĠĠ Ġ// ĠĠ Ġ- ĠWe Ġsearch Ġfor Ġthe Ġright Ġword Ġ( as Ġcalculate Ġabove ). ĊĠĠĠ Ġ// ĠĠ Ġ- ĠWe Ġlook Ġfor Ġreferences Ġto Ġthe Ġright Ġelement : Ġif Ġa Ġtable / column Ġname Ġis Ġoverridden Ġusing Ġannotations , Ġthe ĠP SI Ġreferences Ġmay Ġnot ĊĠĠĠ Ġ// ĠĠĠĠ Ġpoint Ġto Ġthe Ġclass / field Ġitself , Ġbut Ġwe Ġstill Ġwant Ġto Ġshow Ġthese Ġreferences Ġin Ġ" find Ġusage s ". ĊĠĠĠ Ġfor Ġ( word Ġin Ġwords ) Ġ{ ĊĠĠĠĠĠ Ġquery Parameters . optimizer . search Word ( word , Ġquery Parameters . effective Search Scope , Ġfalse , Ġreference Target ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠPsi Class . defines Sql Table (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġhas Annotation ( Room Annotations . ENTITY . old Name ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠ Ġhas Annotation ( Room Annotations . ENTITY . new Name ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠ Ġhas Annotation ( Room Annotations . DATABASE _ VIEW . old Name ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠ Ġhas Annotation ( Room Annotations . DATABASE _ VIEW . new Name ()) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġset Ġof Ġwords Ġand Ġelement Ġfor Ġgiven Ġ[ Android Sql Definition ] Ġto Ġcheck Ġduring Ġsearch Ġusage Ġprocess ĊĠĠ Ġ* ĊĠĠ Ġ* ĠSome Ġcolumns Ġcan Ġbe Ġused Ġby Ġ[ Android Sql Column . alternative Names ] Ġand Ġin Ġsearch Ġwe Ġneed Ġto Ġfind Ġusage s Ġof Ġall Ġof Ġthem ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġchoose Words And Element ( definition : ĠAndroid Sql Definition ): ĠPair < List < String >, ĠPsi Element >? Ġ{ ĊĠĠĠ Ġval Ġnames Ġ= ĠArrayList < String >() ĊĠĠĠ Ġif Ġ( definition . name Ġ!= Ġnull ) Ġnames . add ( definition . name !! ) ĊĠĠĠ Ġif Ġ( definition Ġis ĠAndroid Sql Column ) Ġnames . addAll ( definition . alternative Names ) ĊĊĠĠĠ Ġif Ġ( names . isEmpty ()) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġwords Ġ= Ġnames . map Ġ{ Ġname Ġ-> ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ ĠAndroid Sql Lexer . needs Qu oting ( name ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġfigure Ġout Ġhow Ġa Ġreference Ġto Ġthis Ġelement Ġlooks Ġlike Ġin Ġthe ĠId Index . ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġfind Ġthe Ġfirst Ġ" word " Ġin Ġthe Ġquoted Ġname Ġand Ġlook Ġfor Ġit Ġin Ġthe Ġindex , ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġas Ġany Ġreference Ġfor Ġthis Ġtable Ġwill Ġinclude Ġthis Ġword Ġin Ġits Ġtext . ĊĠĠĠĠĠĠĠĠĠ Ġval Ġprocessor Ġ= ĠCommon Processors . FindFirst Processor < Word Occurrence >() ĊĠĠĠĠĠĠĠĠĠ ĠAndroid Sql Find Usage s Provider (). words Scanner . process Words ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid Sql Lexer . get Valid Name ( name ), Ġprocessor ) ĊĠĠĠĠĠĠĠĠĠ Ġprocessor . found Value ?. let Ġ{ Ġit . base Text . substring ( it . start , Ġit . end ) Ġ} Ġ?: Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġname ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠPair ( words , Ġdefinition . resolve To ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠgetName Definition ( schema : ĠRoom Schema , Ġelement : ĠPsi Element ): ĠAndroid Sql Definition ? Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠ Ġis ĠPsi Class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġschema . find Table ( element ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠPsi Field Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġschema ĊĠĠĠĠĠĠĠĠĠ Ġ. find Table ( element . containing Class Ġ?: Ġreturn Ġnull ) ĊĠĠĠĠĠĠĠĠĠ Ġ? . columns ĊĠĠĠĠĠĠĠĠĠ Ġ? . find Ġ{ Ġit . def ining Element Ġ== Ġelement Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠPsi Element For Fake Column Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġschema ĊĠĠĠĠĠĠĠĠĠ Ġ. find Table ( element . table Psi Element ) ĊĠĠĠĠĠĠĠĠĠ Ġ? . columns ĊĠĠĠĠĠĠĠĠĠ Ġ? . find Ġ{ ĠPsi Manager . getInstance ( element . project ). are Elements Equivalent ( it . def ining Element , Ġelement ) Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠK t Property Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlight Field Ġ= Ġelement . to Light Elements (). first Is Instance OrNull < Psi Field >() ĊĠĠĠĠĠĠĠ Ġschema ĊĠĠĠĠĠĠĠĠĠ Ġ. find Table ( element . containing Class ()?. to Light Class () Ġ?: Ġreturn Ġnull ) ĊĠĠĠĠĠĠĠĠĠ Ġ? . columns ĊĠĠĠĠĠĠĠĠĠ Ġ? . find Ġ{ Ġit . def ining Element Ġ== Ġlight Field Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }