package Ġcom . wu yr . google _ library _ query Ċ Ċ import Ġcom . intellij . code Insight . Auto Popup Controller Ċ import Ġcom . intellij . code Insight . completion . Completion Contributor Ċ import Ġcom . intellij . code Insight . completion . Completion Initialization Context Ċ import Ġcom . intellij . code Insight . completion . Completion Parameters Ċ import Ġcom . intellij . code Insight . completion . Completion ResultSet Ċ import Ġcom . intellij . code Insight . lookup . Lookup Element Builder Ċ import Ġcom . intellij . openapi . command . Write Command Action Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . util . Platform Icons Ċ import Ġjava . awt . EventQueue Ċ import Ġjava . io . String Reader Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Future Ċ Ċ /** Ċ Ġ* Ġ@ author Ġw u yr Ċ Ġ* Ġ@ github Ġhttps :// github . com / wu yr / Google Library Version Qu er ier Ċ Ġ* Ġ@ since Ġ 2 0 2 0 - 0 5 - 0 5 Ġ 0 2 : 5 8 Ċ Ġ*/ Ċ class ĠGradle Contributor Ġ: ĠCompletion Contributor () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġneed Show Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġelement List Ġ= ĠArrayList < Pair < String , ĠString >>() ĊĠĠĠ Ġprivate Ġval Ġaccept Files Type Ġ= ĠarrayOf (". gradle ") ĊĠĠĠ Ġprivate Ġval Ġthread Pool Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠ Ġprivate Ġvar Ġrunning Query Thread : ĠFuture < *> ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlast Current Line Content Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun Ġbefore Completion ( context : ĠCompletion Initialization Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġneed Show Ġ= Ġaccept Files Type . any Ġ{ Ġcontext . file . name . endsWith ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( need Show ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġneed Show Ġ= ĠisIn Dependencies Block ( context ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Query () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠisIn Dependencies Block ( context : ĠCompletion Initialization Context ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= ĠString Reader ( context . editor . document . text ). read Lines () ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent LineNumber Ġ= Ġcontext . editor . run Ġ{ Ġdocument . get LineNumber ( caret Model . offset ) Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġbr ace Start Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġbr ace End Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current LineNumber Ġ>= Ġ 0 Ġ&& Ġcurrent LineNumber Ġ< Ġlines . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Line Ġ= Ġlines [ current LineNumber ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbr ace Start Count Ġ+= Ġcurrent Line . count Ġ{ Ġit Ġ== Ġ'{ ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbr ace End Count Ġ+= Ġcurrent Line . count Ġ{ Ġit Ġ== Ġ' }' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Line . let Ġ{ Ġit . contains (" dependencies ") Ġ&& Ġit . contains ('{ ') Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbr ace Start Count Ġ- Ġbr ace End Count Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent LineNumber -- ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfill Completion Variants ( parameters : ĠCompletion Parameters , Ġresult : ĠCompletion ResultSet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( need Show ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Start Position Ġ= Ġparameters . editor . caret Model . visual Line Start ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline End Position Ġ= Ġparameters . editor . caret Model . visual Line End ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Line Content Ġ= Ġparameters . editor . document . getText ( Text Range ( line Start Position , Ġline End Position )). replace ("\ n ". to Regex (), Ġ""). trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Line Content . contains ( last Current Line Content )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement List . forEach Ġ{ Ġe Ġ-> Ġresult . addElement ( e . to Lookup Element ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Query () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . stop Here () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneed Show Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Line Content . length Ġ< Ġ 4 Ġ|| Ġcurrent Line Content Ġ== Ġlast Current Line Content ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Current Line Content Ġ= Ġcurrent Line Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Query ( parameters . editor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element List . isNotEmpty ()) Ġelement List . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . fill Completion Variants ( parameters , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Query ( editor : ĠEditor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Current Line Content . split ("\\ s +". to Regex ()). let Ġ{ Ġline Content Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line Content . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeyword Ġ= Ġline Content . run Ġ{ Ġif Ġ( size Ġ== Ġ 1 ) Ġfirst () Ġelse Ġlast () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Query Thread ?. cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtask : ĠFuture < *> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Ġ= Ġthread Pool . submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask ?. let Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmatching Libraries ( keyword ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Libraries 2 ( if Ġ( keyword . contains (" :" )) Ġkeyword Ġelse Ġ": $ keyword ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! task . is Cancelled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement List . addAll ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Queue . invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . project ?. let Ġ{ Ġproject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Popup Controller . getInstance ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. auto Popup Member Lookup ( editor , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Query Thread Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġrunning Query Thread Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcancel Query () Ġ{ ĊĠĠĠĠĠĠĠ Ġrunning Query Thread ?. let Ġ{ Ġif Ġ(! it . is Cancelled Ġ&& Ġ! it . is Done ) Ġit . cancel ( true ) Ġ} ĊĠĠĠĠĠĠĠ Ġelement List . clear () ĊĠĠĠĠĠĠĠ Ġneed Show Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠPair < String , ĠString >. to Lookup Element () Ġ= ĠLookup Element Builder . create ( first ). bold () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Icon ( Platform Icons . LIBRARY _ ICON ). with Type Text ( second , Ġtrue ). with Insert Handler Ġ{ Ġcontext , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Start Position Ġ= Ġcontext . editor . caret Model . visual Line Start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline End Position Ġ= Ġcontext . editor . caret Model . visual Line End ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Line Content Ġ= Ġcontext . editor . document . getText ( Text Range ( line Start Position , Ġline End Position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġadditional Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Line Content . forEach Indexed Ġ{ Ġindex , Ġchar Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! char . is Whitespace ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Index Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWrite Command Action . run Write Command Action ( context . project ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . document . replace String ( line Start Position Ġ+ Ġadditional Index , Ġline End Position Ġ- Ġ 1 , Ġitem . lookup String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ }