/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 Ġ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 . gradle . dsl . parser . kotlin Ċ Ċ import Ġcom . android . tools . idea . gradle . dsl . api . dependencies . Artifact Dependency Spec Ċ import Ġcom . android . tools . idea . gradle . dsl . api . ext . Gradle Property Model . i Str Ċ import Ġcom . android . tools . idea . gradle . dsl . api . ext . PropertyType . DER IVED Ċ import Ġcom . android . tools . idea . gradle . dsl . api . ext . PropertyType . REG ULAR Ċ import Ġcom . android . tools . idea . gradle . dsl . api . ext . PropertyType . VARIABLE Ċ import Ġcom . android . tools . idea . gradle . dsl . model . ext . Property Util . FILE _ CON STRUCTOR _ NAME Ċ import Ġcom . android . tools . idea . gradle . dsl . model . notifications . Notification Type Reference . IN COMPLETE _ PAR SING Ċ import Ġcom . android . tools . idea . gradle . dsl . model . notifications . Notification Type Reference . INVALID _ EXPRESSION Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . External Name Info . External Name Syntax . ASSIGN MENT Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . External Name Info . External Name Syntax . AU G MENT ED _ ASSIGN MENT Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . Gradle Dsl Parser Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . Gradle Reference Injection Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . dependencies . Dependencies Dsl Element Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . dependencies . Fake Artifact Element Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Dsl Block Element Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Dsl Closure Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Dsl Element Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Dsl Expression Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Dsl Expression List Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Dsl Expression Map Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Dsl In fix Expression Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Dsl Literal Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Dsl MethodCall Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Dsl Named Domain Element Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Dsl Set table Expression Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Dsl Simple Expression Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Dsl Unknown Element Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Name Element Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . elements . Gradle Properties Dsl Element Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . files . Gradle Dsl File Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . getProperties Element Ċ import Ġcom . android . tools . idea . gradle . dsl . parser . plugins . Plugins Dsl Element Ċ import Ġcom . google . common . collect . Lists Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . util . text . StringUtil . un quote String Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . util . Incorrect OperationException Ċ import Ġcom . intellij . util . text . Literal Format Util Ċ import Ġorg . jetbrains . kotlin . Kt Node Types Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . parsing . parse Boolean Ċ import Ġorg . jetbrains . kotlin . parsing . parse Numeric Literal Ċ import Ġorg . jetbrains . kotlin . psi . Kt Array Access Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Binary Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Binary Expression WithType RHS Ċ import Ġorg . jetbrains . kotlin . psi . Kt Block Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Call Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Class Literal Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Constant Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Dot Qualified Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Element Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . psi . Kt Name Reference Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Parent hesized Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Post fix Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Property Ċ import Ġorg . jetbrains . kotlin . psi . Kt Psi Factory Ċ import Ġorg . jetbrains . kotlin . psi . Kt Reference Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Script Initializer Ċ import Ġorg . jetbrains . kotlin . psi . Kt String Template Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Tree Visitor Void Ċ import Ġorg . jetbrains . kotlin . psi . Kt Value Argument Ċ import Ġorg . jetbrains . kotlin . psi . Kt Value ArgumentList Ċ import Ġorg . jetbrains . kotlin . psi . Kt Visitor Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . reference Expression Ċ import Ġjava . math . BigDecimal Ċ Ċ /** Ċ Ġ* ĠParser Ġfor Ġ. gradle . kt Ġfiles . ĠThis Ġmethod Ġproduces Ġa Ġ[ Gradle Dsl Element ] Ġtree . Ċ Ġ*/ Ċ class ĠKotlin Dsl Parser ( val Ġpsi File Ġ: ĠK t File , Ġval Ġd sl File Ġ: ĠGradle Dsl File ): ĠK t Visitor < Unit , ĠGradle Properties Dsl Element >(), ĠKotlin Dsl Name Converter , ĠGradle Dsl Parser Ġ{ ĊĠ Ġprivate Ġval Ġextract Value Set : ĠMutable Set < Pair < Gradle Dsl Simple Expression , ĠPsi Element >> Ġ= Ġmutable Set Of () ĊĊĠ Ġ// ĊĠ Ġ// ĠMethods Ġfor ĠGradle Dsl Parser ĊĠ Ġ// ĊĠ Ġoverride Ġfun Ġparse () Ġ{ ĊĠĠĠ ĠApplication Manager . getApplication (). assert Read Access Allowed () ĊĠĠĠ Ġpsi File . script ?. block Expression ?. statements ?. map Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it Ġis ĠK t Script Initializer ) Ġit . body Ġelse Ġit ĊĠĠĠ Ġ} ?. require No Null s ()?. forEach Ġ{ ĊĠĠĠĠĠ Ġit . accept ( this , Ġd sl File ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠconvertTo Psi Element ( context : ĠGradle Dsl Simple Expression , Ġliteral : ĠAny ): ĠPsi Element ? Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠ Ġcreate Literal ( context , Ġd sl File , Ġliteral ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġcatch Ġ( e Ġ: ĠInc orrect OperationException ) Ġ{ ĊĠĠĠĠĠ Ġd sl File . context . get Notification ForType ( dsl File , ĠINVALID _ EXPRESSION ). add Error ( e ) ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠsetUp For NewValue ( context : ĠGradle Dsl Literal , ĠnewValue : ĠPsi Element ?) Ġ{ ĊĠĠĠ Ġval Ġnew Psi Element Ġ= Ġwhen Ġ( newValue ) Ġ{ ĊĠĠĠĠĠ Ġis ĠK t Binary Expression WithType RHS Ġ-> ĠnewValue . left ĊĠĠĠĠĠ Ġelse Ġ-> ĠnewValue ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġis Reference Ġ= Ġnew Psi Element Ġis ĠK t Name Reference Expression Ġ|| Ġnew Psi Element Ġis ĠK t Dot Qualified Expression Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Psi Element Ġis ĠK t Class Literal Expression Ġ|| Ġnew Psi Element Ġis ĠK t Array Access Expression ĊĠĠĠ Ġcontext . is Reference Ġ= Ġis Reference ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġextract Value ( context : ĠGradle Dsl Simple Expression , Ġliteral : ĠPsi Element , Ġresolve : ĠBoolean ): ĠAny ? Ġ{ ĊĠĠĠ Ġwhen Ġ( literal ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠEx : ĠKotlin Compiler Version , Ġandroid . compile Sdk Version Ġ... ĊĠĠĠĠĠ Ġis ĠK t Name Reference Expression , Ġis ĠK t Dot Qualified Expression , ĊĠĠĠĠĠ Ġ// Ġ... Ġprop [ 0 ], Ġroot Project . extra [" kotlin _ version "] ĊĠĠĠĠĠ Ġis ĠK t Array Access Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resolve ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġgradle Dsl Element Ġ= Ġcontext . resolve External Syntax Reference ( literal . text , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġget Ġthe Ġvalue Ġif Ġthe Ġelement Ġis Ġa ĠGradle Dsl Simple Expression . ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( gradle Dsl Element Ġis ĠGradle Dsl Simple Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( extract Value Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġcontext Ġto Ġliteral ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( extract Value Set . contains ( key )) Ġreturn Ġun quote String ( literal . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Value Set . add ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgradle Dsl Element . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Value Set . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġun quote String ( literal . text ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// ĠFor ĠString Ġand Ġconstant Ġliterals . ĠEx Ġ: ĠIn te gers , Ġsingle - quoted ĠStrings . ĊĠĠĠĠĠ Ġis ĠK t String Template Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! resolve Ġ|| Ġcontext . has Cycle ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġun quote String ( literal . text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinjection s Ġ= Ġcontext . resolved Variables ĊĠĠĠĠĠĠĠ Ġreturn ĠGradle Reference Injection . inject All ( literal , Ġinjection s ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠK t Constant Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( literal . node . elementType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠK t Node Types . INTEGER _ CONSTANT -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumerical Value Ġ= Ġparse Numeric Literal ( literal . text , Ġliteral . node . elementType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( num erical Value Ġis ĠLong Ġ&& Ġ( num erical Value Ġ> ĠInteger . MAX _ VALUE Ġ|| Ġnumerical Value Ġ< ĠInteger . MIN _ VALUE )) Ġreturn Ġnumerical Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( num erical Value Ġas ĠNumber ). toInt () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠK t Node Types . FLOAT _ CONSTANT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFLOAT _ CONSTANT Ġapplies Ġfor Ġfloat , Ġdouble , Ġand Ġbig Decimal Ġvalues Ġand Ġwe Ġuse Ġbig Decimal Ġto Ġensure Ġthe Ġbest Ġprecision . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġvalues Ġwith Ġ" f " Ġsuffix , Ġit 's Ġsafe Ġto Ġremove Ġthe Ġsuffix Ġhere Ġas Ġwe Ġcan Ġget Ġit Ġfrom Ġthe Ġpsi Ġelement Ġtext Ġvalue Ġfor Ġthe Ġwriter . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBigDecimal ( Literal Format Util . remove Un ders cores ( literal . text ). trim End (' f ', Ġ' F ')) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . getInstance ( Kotlin Dsl Parser :: class . java ). error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠK t Node Types . BOOLEAN _ CONSTANT Ġ-> Ġparse Boolean ( literal . text ) ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġun quote String ( literal . text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠK t Call Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( literal . name () Ġ== Ġ" kotlin ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġargument List Ġ= Ġliteral . value ArgumentList Ġ?: Ġreturn Ġliteral . text ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġmethod Ġhas Ġtwo Ġarguments Ġthen Ġit Ġshould Ġautomatically Ġresolve Ġto Ġa Ġdependency . ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( argument List . arguments . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmoduleName Ġ= Ġargument List . arguments [ 0 ]?. get Argument Expression () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġargument List . arguments [ 1 ]. get Argument Expression () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ( b / 1 4 2 5 3 0 8 7 9 ): Ġfix Ġversion Ġvalue Ġinjection Ġfrom Ġimport Ġstatements . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" org . jetbrains . kotlin : kotlin -${ un quote String ( moduleName . text )} :${ un quote String ( version . text )}" ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġmethod Ġhas Ġone Ġargument , Ġwe Ġshould Ġcheck Ġif Ġit 's Ġdeclared Ġunder Ġa Ġplugins Ġblock Ġin Ġorder Ġto Ġresolve Ġit Ġto Ġa Ġplugin , ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġa Ġdependency Ġif Ġdeclared Ġunder Ġdependencies Ġblock , Ġor Ġnot Ġresolve Ġit Ġfor Ġother Ġcases . ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( argument List . arguments . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Expression Ġ= Ġargument List . arguments [ 0 ]. get Argument Expression () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( val Ġparent Ġ= Ġcontext . parent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPlugins Dsl Element Ġ-> Ġ" org . jetbrains . kotlin .${ un quote String ( name Expression . text )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDependencies Dsl Element Ġ-> Ġ" org . jetbrains . kotlin : kotlin -${ un quote String ( name Expression . text )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGradle Dsl In fix Expression Ġ-> Ġwhen Ġ( parent . parent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPlugins Dsl Element Ġ-> Ġ" org . jetbrains . kotlin .${ un quote String ( name Expression . text )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠKotlin Dsl Raw Text ( literal . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠKotlin Dsl Raw Text ( literal . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠKotlin Dsl Raw Text ( literal . text ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠK t Binary Expression WithType RHS Ġ-> Ġreturn Ġwhen Ġ( val Ġexpression Info Ġ= Ġliteral . left ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠK t Array Access Expression Ġ-> Ġthis . extract Value ( context , Ġexpression Info , Ġresolve ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġun quote String ( literal . text ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĠKotlin Dsl Raw Text ( literal . text ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠconvertTo Exclude s Block ( exclude s : ĠList < Artifact Dependency Spec >): ĠPsi Element ? Ġ{ ĊĠĠĠ Ġval Ġfactory Ġ= ĠK t Psi Factory ( dsl File . project ) ĊĠĠĠ Ġval Ġblock Ġ= Ġfactory . create Block ("") ĊĠĠĠ Ġ// ĠCurrently , Ġcreate Block Ġreturns Ġa Ġblock Ġwith Ġtwo Ġempty Ġlines , Ġwe Ġshould Ġkeep Ġonly Ġone Ġnew Ġline . ĊĠĠĠ Ġval Ġfirst Statement OrEmpty Ġ= Ġblock . firstChild . next Sibling ĊĠĠĠ Ġif Ġ( first Statement OrEmpty . text Ġ== Ġ"\ n \ n ") Ġ{ ĊĠĠĠĠĠ Ġfirst Statement OrEmpty . delete () ĊĠĠĠĠĠ Ġblock . add After ( factory . create NewLine (), Ġblock . firstChild ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġexclude s . forEach Ġ{ ĊĠĠĠĠĠ Ġval Ġgroup Ġ= Ġif Ġ( Fake Artifact Element . should Interpol ate ( it . group )) Ġi Str ( it . group Ġ?: Ġ"\" \" ") Ġelse Ġ"\" ${ it . group }\ "" ĊĠĠĠĠĠ Ġval Ġname Ġ= Ġif Ġ( Fake Artifact Element . should Interpol ate ( it . name )) Ġi Str ( it . name ) Ġelse Ġ"\" ${ it . name }\ "" ĊĠĠĠĠĠ Ġval Ġtext Ġ= Ġ" exclude ( map Of (\" group \" Ġto Ġ$ group , Ġ\" module \" Ġto Ġ$ name )) " ĊĠĠĠĠĠ Ġval Ġexpression Ġ= Ġfactory . create Expression If Possible ( text ) ĊĠĠĠĠĠ Ġif Ġ( expression Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock . add Before ( expression , Ġblock . last Child ) ĊĠĠĠĠĠĠĠ Ġblock . add Before ( factory . create NewLine (), Ġblock . last Child ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġblock ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġshould Interpol ate ( element ToCheck : ĠGradle Dsl Element ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( element ToCheck ) Ġ{ ĊĠĠĠĠĠ Ġis ĠGradle Dsl Set table Expression Ġ-> Ġelement ToCheck . current Element Ġis ĠK t String Template Expression ĊĠĠĠĠĠ Ġis ĠGradle Dsl Simple Expression Ġ-> Ġelement ToCheck . expression Ġis ĠK t String Template Expression ĊĠĠĠĠĠ Ġelse Ġ-> Ġelement ToCheck . psi Element Ġis ĠK t String Template Expression ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Resolved Injection s ( context : ĠGradle Dsl Simple Expression , Ġpsi Element : ĠPsi Element ): ĠList < Gradle Reference Injection > Ġ{ ĊĠĠĠ Ġreturn Ġfind Injection s ( context , Ġpsi Element , Ġfalse ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Injection s ( context : ĠGradle Dsl Simple Expression , Ġpsi Element : ĠPsi Element ): ĠList < Gradle Reference Injection > Ġ{ ĊĠĠĠ Ġreturn Ġfind Injection s ( context , Ġpsi Element , Ġtrue ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Properties Element ( name Parts : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Element : ĠGradle Properties Dsl Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Element : ĠGradle Name Element ?): ĠGradle Properties Dsl Element ? Ġ{ ĊĠĠĠ Ġreturn Ġd sl File . getProperties Element ( name Parts , Ġthis , Ġparent Element , Ġname Element ) ĊĠ Ġ} ĊĊĠ Ġ// ĠCheck Ġif Ġthis Ġis Ġa Ġblock Ġwith Ġa Ġmethod Call Ġas Ġname , Ġand Ġget Ġthe Ġblock Ġin Ġsuch Ġcase . ĠEx : Ġget ByName (" release ") Ġ-> Ġthe Ġrelease Ġblock . ĊĠ Ġprivate Ġfun Ġmethod Call Block ( ĊĠĠĠ Ġexpression : ĠK t Call Expression , ĊĠĠĠ Ġparent : ĠGradle Properties Dsl Element , ĊĠĠĠ Ġname : ĠGradle Name Element ? Ġ= Ġnull ): ĠGradle Properties Dsl Element ? Ġ{ ĊĠĠĠ Ġval Ġblock Name Ġ= Ġmethod Call Block Name ( expression ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġproperties Element Ġ= Ġget Properties Element ( listOf ( block Name ), Ġparent , Ġname ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġif Ġ( properties Element Ġis ĠGradle Dsl Named Domain Element ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠTODO ( x of ): Ġthis Ġway Ġof Ġkeeping Ġtrack Ġof Ġhow Ġwe Ġgot Ġhold Ġof Ġthe Ġblock Ġ( which Ġmethod Ġname ) Ġonly Ġworks Ġonce ĊĠĠĠĠĠ Ġproperties Element . methodName Ġ= Ġproperties Element . methodName Ġ?: Ġexpression . name () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġproperties Element ĊĠ Ġ} ĊĊĠ Ġ// ĊĠ Ġ// ĠMethods Ġto Ġperform Ġthe Ġparsing Ġon Ġthe ĠK t File ĊĠ Ġ// ĊĠ Ġoverride Ġfun Ġvisit Call Expression ( expression : ĠK t Call Expression , Ġparent : ĠGradle Properties Dsl Element ) Ġ{ ĊĠĠĠ Ġ// ĠIf Ġthe Ġcall Ġexpression Ġhas Ġno Ġname , Ġwe Ġdon 't Ġknow Ġhow Ġto Ġhandle Ġit . ĊĠĠĠ Ġvar Ġreference Name Ġ= Ġexpression . name () Ġ?: Ġreturn ĊĊĠĠĠ Ġval Ġreference Expression Ġ= Ġexpression . callee Expression ĊĠĠĠ Ġvar Ġname Ġ= ĊĠĠĠĠĠ Ġif Ġ( reference Expression Ġ!= Ġnull ) ĠGradle Name Element . from ( reference Expression , Ġthis ) Ġelse ĠGradle Name Element . create ( reference Name ) ĊĊĠĠĠ Ġ// ĠIf Ġexpression Ġis Ġa Ġpure Ġblock Ġelement Ġand Ġnot Ġan Ġexpression . ĊĠĠĠ Ġif Ġ( expression . is Block Element ( parent )) Ġ{ ĊĠĠĠĠĠ Ġ// ĠIf Ġthe Ġblock Ġhas Ġa Ġlocal MethodName , Ġthe Ġname Element Ġshould Ġuse Ġthe Ġargument Ġvalue Expression Ġpsi . Ġ( ex : Ġcreate (" release ") Ġ-> Ġrelease ) ĊĠĠĠĠĠ Ġval Ġargument List Ġ= Ġexpression . value ArgumentList ĊĠĠĠĠĠ Ġif Ġ( argument List Ġ!= Ġnull Ġ&& Ġargument List . arguments . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġargument Expression Val Ġ= Ġargument List . arguments [ 0 ]. get Argument Expression () ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġif Ġ( argument Expression Val Ġ!= Ġnull ) ĠGradle Name Element . from ( argument Expression Val , Ġthis ) Ġelse Ġname ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// ĠWe Ġmight Ġneed Ġto Ġapply Ġthe Ġblock Ġto Ġmultiple ĠD sl Elements . ĊĠĠĠĠĠ Ġval Ġblock Elements Ġ= ĠLists . newArrayList < Gradle Properties Dsl Element >() ĊĠĠĠĠĠ Ġ// ĠIf Ġthe Ġblock Ġis Ġall projects , Ġwe Ġneed Ġto Ġapply Ġthe Ġclosure Ġto Ġthe Ġproject Ġand Ġto Ġall Ġits Ġsub projects . ĊĠĠĠĠĠ Ġif Ġ( parent Ġis ĠGradle Dsl File Ġ&& Ġreference Name Ġ== Ġ" all projects ") Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġblock Ġhas Ġto Ġbe Ġapplied Ġto Ġthe Ġproject . ĊĠĠĠĠĠĠĠ Ġblock Elements . add ( parent ) ĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġblock Ġshould Ġbe Ġapplied Ġto Ġsub projects . ĊĠĠĠĠĠĠĠ Ġreference Name Ġ= Ġ" sub projects " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġproperties Element Ġ= Ġmethod Call Block ( expression , Ġparent , Ġname ) Ġ?: Ġget Properties Element ( listOf ( reference Name ), Ġparent , Ġname ) Ġ?: Ġreturn ĊĠĠĠĠĠ Ġval Ġbody Ġ= Ġexpression . lambda Arguments . get OrNull ( 0 )?. get Lambda Expression ()?. body Expression ĊĊĠĠĠĠĠ Ġproperties Element . set Psi Element ( body Ġ?: Ġexpression ) ĊĠĠĠĠĠ Ġif Ġ( body Ġ== Ġnull Ġ&& Ġproperties Element Ġis ĠGradle Dsl Block Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproperties Element . has Br aces Ġ= Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġblock Elements . add ( properties Element ) ĊĠĠĠĠĠ Ġblock Elements . forEach Ġ{ Ġblock Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠVisit Ġthe Ġchildren Ġof Ġthis Ġelement , Ġwith Ġthe Ġcurrent Ġblock Ġset Ġas Ġparent . ĊĠĠĠĠĠĠĠ Ġexpression . lambda Arguments . get OrNull ( 0 )?. get Lambda Expression ()?. body Expression ?. statements ?. require No Null s ()?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . accept ( this , Ġblock ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġ// ĠGet Ġargs Ġand Ġblock . ĊĠĠĠĠĠ Ġval Ġarguments List Ġ= Ġexpression . value ArgumentList ĊĠĠĠĠĠ Ġval Ġarguments Block Ġ= Ġexpression . lambda Arguments . get OrNull ( 0 )?. get Lambda Expression ()?. body Expression ĊĠĠĠĠĠ Ġif Ġ( arguments List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcall Expression Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġget Call Expression ( parent , Ġexpression , Ġname , Ġarguments List , Ġreference Name , Ġtrue ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( arguments Block Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcall Expression . set Parsed Closure Element ( get Closure Block ( call Expression , Ġarguments Block , Ġname )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcall Expression . elementType Ġ= ĠREG ULAR ĊĠĠĠĠĠĠĠ Ġparent . add Parsed Element ( call Expression ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Dot Qualified Expression ( expression : ĠK t Dot Qualified Expression , Ġparent : ĠGradle Properties Dsl Element ) Ġ{ ĊĊĠĠĠ Ġfun Ġparent Block From Receiver ( receiver : ĠK t Expression ): ĠGradle Properties Dsl Element ? Ġ{ ĊĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġparent ĊĠĠĠĠĠ Ġreceiver . accept ( object Ġ: ĠK t Tree Visitor Void () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Reference Expression ( expression : ĠK t Reference Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Name Reference Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġget Properties Element ( listOf ( expression . text ), Ġcurrent , Ġnull ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call Expression ( expression : ĠK t Call Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġmethod Call Block ( expression , Ġcurrent ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}, Ġnull ) ĊĠĠĠĠĠ Ġreturn Ġcurrent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġandroid . build Types . release Ġ{ Ġmin ify _ enabled Ġtrue Ġ} ĊĠĠĠ Ġval Ġreceiver Ġ= Ġexpression . receiver Expression ĊĠĠĠ Ġwhen Ġ( val Ġselector Ġ= Ġexpression . selector Expression ) Ġ{ ĊĠĠĠĠĠ Ġis ĠK t Call Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Block Ġ= Ġparent Block From Receiver ( receiver ) ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Block Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġsuper . visit Dot Qualified Expression ( expression , Ġparent ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvisit Call Expression ( selector , Ġparent Block ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġsuper . visit Dot Qualified Expression ( expression , Ġparent ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Dot Qualified Expression ( ĊĠĠĠ Ġparent : ĠGradle Dsl Element , ĊĠĠĠ Ġpsi Element : ĠPsi Element , ĊĠĠĠ Ġname : ĠGradle Name Element , ĊĠĠĠ Ġexpression : ĠK t Dot Qualified Expression ĊĠ Ġ) Ġ: ĠGradle Dsl Expression ? Ġ{ ĊĠĠĠ Ġval Ġreceiver Ġ= Ġexpression . receiver Expression ĊĠĠĠ Ġval Ġselector Ġ= Ġexpression . selector Expression ĊĠĠĠ Ġwhen Ġ( selector ) Ġ{ ĊĠĠĠĠĠ Ġis ĠK t Call Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthis Ġis Ġabout Ġa Ġlocal Method Ġused Ġfor Ġblocks Ġreferencing , Ġor Ġnot . ĊĠĠĠĠĠĠĠ Ġval Ġreference Name Ġ= Ġselector . name () ĊĠĠĠĠĠĠĠ Ġif Ġ( isValid Block Name ( reference Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠGradle Dsl Literal ( parent , Ġexpression , Ġname , Ġexpression , ĠGradle Dsl Literal . Literal Type . REFERENCE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġthe Ġcase Ġof Ġmethod Ġcalls Ġfor Ġwhich Ġwe Ġwant Ġto Ġkeep Ġall Ġthe Ġexpression Ġname Ġas Ġreference Ġand Ġresolve Ġthe Ġnested ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġmethod Ġcall . ĠFor Ġexample Ġ: ĠSystem . get Env (" pass ") Ġ-> Ġin Ġsuch Ġcase , Ġwe Ġshouldn 't Ġconsider Ġthe Ġexpression Ġas Ġa Ġliteral Ġbut Ġrather ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġas Ġa Ġmethod Call . ĊĠĠĠĠĠĠĠĠĠ Ġval ĠmethodName Ġ= Ġ"${ receiver . text }.${ reference Name }" ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġget MethodCall ( parent , Ġexpression , Ġname , ĠmethodName , Ġselector . value ArgumentList , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġget Expression Element ( parent , Ġpsi Element , Ġname , Ġexpression ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Binary Expression ( expression : ĠK t Binary Expression , Ġparent : ĠGradle Properties Dsl Element ) Ġ{ ĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠ Ġexpression . operation Token Ġ== ĠK t Tokens . EQ Ġ-> Ġprocess Assignment ( expression , Ġparent ) ĊĠĠĠĠĠ Ġexpression . operation Token Ġ== ĠK t Tokens . PL USE Q Ġ-> Ġprocess Aug ment ed Assignment ( expression , Ġparent ) ĊĠĠĠĠĠ Ġ// ĠTODO ( b / 1 6 5 5 7 6 1 8 7 ): Ġthis Ġallows Ġus Ġto Ġparse Ġplugins Ġwith Ġversions , Ġbut Ġthe Ġassociation Ġbetween Ġthe ĠD sl Ġand ĠPsi Ġis Ġnot Ġideal ĊĠĠĠĠĠ Ġ// Ġ Ġ( de leting Ġthe Ġplugin Ġfrom Ġthe ĠD sl ĠModel Ġwill Ġonly Ġdelete Ġthe Ġleft - hand Ġside Ġof Ġthe Ġversion Ġin fix Ġoperator ). ĊĠĠĠĠĠ ĠlistOf (" version ", Ġ" apply "). contains ( expression . operation Reference . get Referenced Name ()) Ġ-> ĊĠĠĠĠĠĠĠ Ġprocess Plugin Declaration ( expression , Ġparent ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġprocess Plugin Declaration ( expression : ĠK t Binary Expression , Ġparent : ĠGradle Properties Dsl Element ) Ġ{ ĊĠĠĠ Ġ// ĠThis Ġway Ġof Ġtracking Ġwhat 's Ġgoing Ġon Ġ-- Ġare Ġwe Ġacc umul ating Ġor Ġcreating Ġ-- Ġis Ġa Ġbit Ġof Ġa Ġhack . Ġ ĠIt Ġdoes Ġallow Ġus ĊĠĠĠ Ġ// Ġto Ġre - use Ġthe Ġexisting Ġvisitor ; Ġa Ġcleaner Ġsolution Ġmight Ġinvolve Ġa Ġspecialized Ġvisitor Ġpassed Ġto Ġaccept Ġ( r ather Ġthan Ġ` this `) ĊĠĠĠ Ġval Ġplugin Dsl Element Ġ= Ġwhen ( parent ) Ġ{ ĊĠĠĠĠĠ Ġis ĠGradle Dsl In fix Expression Ġ-> Ġparent Ġ// Ġalready Ġprocessing Ġone ĊĠĠĠĠĠ Ġelse Ġ-> ĠGradle Dsl In fix Expression ( parent , Ġexpression ). also Ġ{ Ġparent . add Parsed Element ( it ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġleft Ġ= Ġexpression . left Ġ?: Ġreturn ĊĠĠĠ Ġleft . accept ( this , Ġplugin Dsl Element ) ĊĠĠĠ Ġval Ġright Ġ= Ġexpression . right Ġ?: Ġreturn ĊĠĠĠ Ġ// ĠTODO ( x of ): ĠThe Ġpsi Element Ġargument Ġhere Ġcover ing Ġthe Ġentire Ġexpression Ġis Ġwrong . Ġ ĠThe ĠKotlin ĠPsi Ġdoes Ġnot Ġhave Ġan Ġelement Ġcover ing ĊĠĠĠ Ġ// Ġ Ġboth Ġthe Ġoperation Ġand Ġthe Ġright - hand Ġexpression , Ġwhich Ġis Ġwhat Ġwe Ġwould Ġneed Ġ( e . g . Ġto Ġdelete Ġ` apply Ġfalse ` Ġfrom Ġa Ġplugin ĊĠĠĠ Ġ// Ġ Ġdeclaration ) Ġso Ġwe Ġmight Ġhave Ġto Ġdefine Ġour Ġown Ġcomposite ĠPsi Ġelement Ġsomehow . ĊĠĠĠ Ġval Ġright Expression Ġ= Ġget Expression Element ( plugin Dsl Element , Ġright , ĠGradle Name Element . from ( expression . operation Reference , Ġthis ), Ġright ) ĊĠĠĠ Ġplugin Dsl Element . add Parsed Element ( right Expression ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġprocess Assignment ( expression : ĠK t Binary Expression , Ġparent : ĠGradle Properties Dsl Element ) Ġ{ ĊĠĠĠ Ġval Ġleft Ġ= Ġexpression . left Ġ?: Ġreturn ĊĠĠĠ Ġval Ġright Ġ= Ġexpression . right Ġ?: Ġreturn ĊĠĠĠ Ġvar Ġparent Block Ġ= Ġparent ĊĠĠĠ Ġval Ġname Ġ= ĠGradle Name Element . from ( left , Ġthis ) ĊĠĠĠ Ġif Ġ( name . isEmpty ) Ġreturn ĊĠĠĠ Ġif Ġ( name . is Qualified ) Ġ{ ĊĠĠĠĠĠ Ġval Ġnested Element Ġ= Ġget Properties Element ( name . qual ifying Parts (), Ġparent , Ġnull ) Ġ?: Ġreturn ĊĠĠĠĠĠ Ġparent Block Ġ= Ġnested Element ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmatcher Ġ= ĠGradle Name Element . INDEX _ PATTERN . matcher ( name . name ()) ĊĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠ Ġ// Ġwe Ġhave Ġan Ġindex Ġ/ Ġdere fer encing Ġl value : Ġfind Ġthe Ġactual Ġelement Ġthat Ġwe Ġwill Ġneed Ġto Ġmodify . ĊĠĠĠĠĠ Ġval Ġproperty Ġ= Ġmodel Description For Parent ( matcher . group ( 0 ), Ġparent Block )?. name Ġ?: Ġmatcher . group ( 0 ) ĊĠĠĠĠĠ Ġparent Block Ġ= Ġparent Block . getElement ( property ) Ġas ? ĠGradle Properties Dsl Element Ġ?: Ġreturn ĊĠĠĠĠĠ Ġ// Ġwe Ġdo Ġnot Ġneed Ġto Ġconvert Ġthis Ġto Ġa Ġmodel Ġname Ġbecause Ġit Ġmust Ġbe Ġa Ġuser - supp lied Ġproperty . ĊĠĠĠĠĠ Ġvar Ġindex Ġ= Ġif Ġ( matcher . find ()) Ġmatcher . group ( 1 ) Ġelse Ġreturn ĊĠĠĠĠĠ Ġwhile Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġparent Block Ġ= ĠGradle Dsl Simple Expression . dere ference Properties Element ( parent Block , Ġindex ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġindex Ġ= Ġmatcher . group ( 1 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġwhen Ġ( parent Block ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠGradle Dsl Expression Map Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠGradle Name Element . create ( un quote String ( index )) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Element Ġ= Ġcreate Expression Element ( parent Block , Ġexpression , Ġname , Ġright , Ġtrue ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠ Ġproperty Element . elementType Ġ= ĠD ER IVED ĊĊĠĠĠĠĠĠĠĠĠ Ġparent Block . set Parsed Element ( property Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġproperty Element Ġ= Ġcreate Expression Element ( parent Block , Ġexpression , Ġname , Ġright , Ġtrue ) Ġ?: Ġreturn ĊĠĠĠĠĠ Ġproperty Element . external Syntax Ġ= ĠASS IGN MENT ĊĠĠĠĠĠ Ġproperty Element . elementType Ġ= ĠREG ULAR ĊĊĠĠĠĠĠ Ġparent Block . set Parsed Element ( property Element ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠTODO ( x of ): Ġwhen Ġthe Ġdust Ġset tles , Ġsee Ġif Ġthis Ġis Ġsimilar Ġenough Ġto Ġprocess Assignment () Ġabove . ĊĠ Ġprivate Ġfun Ġprocess Aug ment ed Assignment ( expression : ĠK t Binary Expression , Ġparent : ĠGradle Properties Dsl Element ) Ġ{ ĊĠĠĠ Ġval Ġleft Ġ= Ġexpression . left Ġ?: Ġreturn ĊĠĠĠ Ġval Ġright Ġ= Ġexpression . right Ġ?: Ġreturn ĊĠĠĠ Ġvar Ġparent Block Ġ= Ġparent ĊĠĠĠ Ġval Ġname Ġ= ĠGradle Name Element . from ( left , Ġthis ) ĊĠĠĠ Ġif Ġ( name . isEmpty ) Ġreturn ĊĠĠĠ Ġif Ġ( name . is Qualified ) Ġ{ ĊĠĠĠĠĠ Ġval Ġnested Element Ġ= Ġget Properties Element ( name . qual ifying Parts (), Ġparent , Ġnull ) Ġ?: Ġreturn ĊĠĠĠĠĠ Ġparent Block Ġ= Ġnested Element ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmatcher Ġ= ĠGradle Name Element . INDEX _ PATTERN . matcher ( name . name ()) ĊĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠ Ġ// Ġfoo [" bar "] Ġ+= Ġ" baz " ĊĠĠĠĠĠ Ġ// Ġfoo [" bar "] Ġ+= Ġ 3 ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġ// Ġfoo Ġ+= Ġ" baz " ĊĠĠĠĠĠ Ġ// Ġfoo Ġ+= ĠlistOf (" baz ", Ġ" qu ux ") ĊĠĠĠĠĠ Ġval Ġproperty Element Ġ= Ġcreate Expression Element ( parent Block , Ġexpression , Ġname , Ġright , Ġtrue ) Ġ?: Ġreturn ĊĠĠĠĠĠ Ġproperty Element . external Syntax Ġ= ĠA UG MENT ED _ ASSIGN MENT ĊĠĠĠĠĠ Ġproperty Element . elementType Ġ= ĠREG ULAR ĊĊĠĠĠĠĠ Ġparent Block . augment Parsed Element ( property Element ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Property ( expression : ĠK t Property , Ġparent : ĠGradle Properties Dsl Element ) Ġ{ ĊĠĠĠ Ġval Ġidentifier Ġ= Ġexpression . name Identifier Ġ?: Ġreturn ĊĠĠĠ Ġval Ġdelegate Ġ= Ġexpression . delegate ĊĠĠĠ Ġif Ġ( delegate Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġ// Ġhandling Ġstandard ĠK t Properties Ġ( Ġval Ġfoo Ġ= Ġ...) Ġto Ġsupport Ġvariables ĊĠĠĠĠĠ Ġval Ġinitializer Ġ= Ġexpression . initializer Ġ?: Ġreturn ĊĊĠĠĠĠĠ Ġ// Ġif Ġwe 've Ġgot Ġthis Ġfar , Ġwe Ġhave Ġa Ġvariable Ġdeclaration / initialization Ġof Ġthe Ġform Ġ" val Ġfoo Ġ= Ġbar " ĊĊĠĠĠĠĠ Ġval Ġname Ġ= ĠGradle Name Element . from ( identifier , Ġthis ) ĊĠĠĠĠĠ Ġval Ġproperty Element Ġ= Ġcreate Expression Element ( parent , Ġexpression , Ġname , Ġinitializer , Ġtrue ) Ġ?: Ġreturn ĊĠĠĠĠĠ Ġproperty Element . elementType Ġ= ĠVARIABLE ĊĠĠĠĠĠ Ġparent . set Parsed Element ( property Element ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġ// Ġhandling Ġdeleg ated ĠK t Properties Ġ( Ġval Ġfoo Ġby Ġ... Ġ) Ġto Ġsupport ĠGradle Ġextra Ġproperties . ĊĠĠĠĠĠ Ġval Ġcall Expression Ġ= Ġdelegate . expression Ġas ? ĠK t Call Expression Ġ?: Ġreturn ĊĊĠĠĠĠĠ Ġval Ġreference Expression Ġ= Ġcall Expression . reference Expression () Ġ?: Ġreturn ĊĠĠĠĠĠ Ġ// ĠTODO ( x of ): Ġit 's Ġmore Ġcomplicated Ġthan Ġthis , Ġof Ġcourse ; Ġkotlin script Ġcan Ġexpress Ġgradle Ġproperties Ġon Ġother ĊĠĠĠĠĠ Ġ// Ġ Ġprojects ' Ġextra Ġblocks , Ġusing Ġ" val Ġfoo Ġby Ġroot Project . extra ( 4 2 ) ". Ġ ĠThe ĠKotlin script ĠPsi Ġtree Ġis Ġthe Ġwrong Ġway Ġround ĊĠĠĠĠĠ Ġ// Ġ Ġfor Ġus Ġto Ġdetect Ġit Ġeasily : Ġ( root Project Ġdot Ġ( extra Ġ[ 4 2 ])) Ġrather Ġthan Ġ(( root Project Ġdot Ġextra ) Ġ[ 4 2 ]) Ġso Ġmore Ġwork ĊĠĠĠĠĠ Ġ// Ġ Ġis Ġneeded Ġhere . ĊĠĠĠĠĠ Ġif Ġ( reference Expression . text Ġ!= Ġ" extra ") Ġreturn ĊĠĠĠĠĠ Ġval Ġarguments Ġ= Ġcall Expression . value ArgumentList ?. arguments Ġ?: Ġreturn ĊĠĠĠĠĠ Ġif Ġ( arguments . size Ġ!= Ġ 1 ) Ġreturn ĊĠĠĠĠĠ Ġval Ġinitializer Ġ= Ġarguments [ 0 ]. get Argument Expression () Ġ?: Ġreturn ĊĊĠĠĠĠĠ Ġ// ĠIf Ġwe 've Ġgot Ġthis Ġfar , Ġwe Ġhave Ġan Ġextra Ġproperty Ġdeclaration / initialization Ġof Ġthe Ġform Ġ" val Ġfoo Ġby Ġextra ( bar ) ". ĊĊĠĠĠĠĠ Ġval Ġext Ġ= Ġget Properties Element ( listOf (" ext "), Ġparent , Ġnull ) Ġ?: Ġreturn ĊĠĠĠĠĠ Ġval Ġname Ġ= ĠGradle Name Element . from ( identifier , Ġthis ) Ġ// ĠTODO ( x of ): Ġerror Ġchecking : Ġempty / qualified / etc ĊĠĠĠĠĠ Ġval Ġproperty Element Ġ= Ġcreate Expression Element ( ext , Ġexpression , Ġname , Ġinitializer , Ġtrue ) Ġ?: Ġreturn ĊĠĠĠĠĠ Ġ// ĠThis ĠProperty Ġis Ġassigning Ġa Ġvalue Ġto Ġa Ġproperty , Ġso Ġwe Ġneed Ġto Ġset Ġthe ĠUse Assignment Ġto Ġtrue . ĊĠĠĠĠĠ Ġproperty Element . external Syntax Ġ= ĠASS IGN MENT ĊĠĠĠĠĠ Ġproperty Element . elementType Ġ= ĠREG ULAR ĊĠĠĠĠĠ Ġext . set Parsed Element ( property Element ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Call Expression ( ĊĠĠĠ Ġparent Element Ġ: ĠGradle Dsl Element , ĊĠĠĠ Ġpsi Element Ġ: ĠPsi Element , ĊĠĠĠ Ġname Ġ: ĠGradle Name Element , ĊĠĠĠ Ġarguments List Ġ: ĠK t Value ArgumentList , ĊĠĠĠ ĠmethodName Ġ: ĠString , ĊĠĠĠ Ġis First Call Ġ: ĠBoolean , ĊĠĠĠ Ġis Literal Ġ: ĠBoolean Ġ= Ġfalse ĊĠ Ġ) Ġ: ĠGradle Dsl Expression ? Ġ{ ĊĠĠĠ Ġwhen Ġ( methodName ) Ġ{ ĊĠĠĠĠĠ Ġ" map Of ", Ġ" mutable Map Of " Ġ-> Ġreturn Ġget Expression Map ( parentElement , Ġpsi Element , Ġname , Ġarguments List . arguments , Ġis Literal ) ĊĠĠĠĠĠ Ġ" listOf ", Ġ" mutable ListOf " Ġ-> Ġreturn Ġget Expression List ( parentElement , Ġpsi Element , Ġname , Ġarguments List . arguments , Ġis Literal , Ġfalse ) ĊĠĠĠĠĠ Ġ" set Of ", Ġ" mutable Set Of " Ġ-> Ġreturn Ġget Expression List ( parentElement , Ġpsi Element , Ġname , Ġarguments List . arguments , Ġis Literal , Ġtrue ) ĊĠĠĠĠĠ Ġ" kotlin " Ġ-> Ġreturn ĠGradle Dsl Literal ( parentElement , Ġpsi Element , Ġname , Ġpsi Element , ĠGradle Dsl Literal . Literal Type . LITERAL ) ĊĠĠĠĠĠ ĠFILE _ CON STRUCTOR _ NAME Ġ-> Ġreturn Ġget MethodCall ( parentElement , Ġpsi Element , Ġname , ĠFILE _ CON STRUCTOR _ NAME , Ġarguments List , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġarguments Ġ= Ġarguments List . arguments ĊĠĠĠ Ġ// ĠIf Ġn ont riv ially - all Ġthe Ġarguments Ġare Ġnamed , Ġreturn Ġa ĠGradle Dsl Expression Map ĊĠĠĠ Ġif Ġ( is First Call Ġ&& Ġarguments . size Ġ> Ġ 0 Ġ&& Ġarguments . all Ġ{ Ġit . is Named () Ġ}) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġget Arg list Map ( parentElement , Ġpsi Element , Ġname , Ġarguments List . arguments ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠIf Ġthe ĠCall Expression Ġhas Ġone Ġargument Ġonly Ġthat Ġis Ġa Ġcall Expression , Ġwe Ġskip Ġthe Ġcurrent ĠCall Expression . ĊĠĠĠ Ġif Ġ( arguments . size Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġget MethodCall ( parentElement , Ġpsi Element , Ġname , ĠmethodName , Ġarguments List , Ġfalse ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġargument Expression Ġ= Ġarguments [ 0 ]. get Argument Expression () ĊĠĠĠĠĠ Ġif Ġ( argument Expression Ġis ĠK t Call Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarguments Name Ġ= Ġ( arguments [ 0 ]. get Argument Expression () Ġas ĠK t Call Expression ). name () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( is First Call ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġarguments List Ġ= Ġargument Expression . value ArgumentList ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( arguments List Ġ!= Ġnull ) Ġget Call Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Element , Ġargument Expression , Ġname , Ġarguments List , Ġarguments Name , Ġfalse ) Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġget MethodCall ( ĊĠĠĠĠĠĠĠĠĠ Ġparent Element , ĊĠĠĠĠĠĠĠĠĠ Ġpsi Element , ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġis Named () Ġchecks Ġif Ġget Argument Name () Ġis Ġnot Ġnull , Ġso Ġusing Ġ!! Ġhere Ġis Ġsafe Ġ( unless Ġthe Ġimplementation Ġchanges ). ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( arguments [ 0 ]. is Named ()) ĠGradle Name Element . create ( arguments [ 0 ]. get Argument Name () !!. text ) Ġelse Ġname , ĊĠĠĠĠĠĠĠĠĠ ĠmethodName , ĊĠĠĠĠĠĠĠĠĠ Ġarguments List , ĊĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( is First Call Ġ&& Ġarguments [ 0 ]. get Argument Expression () Ġ!= Ġnull Ġ&& Ġ! arguments [ 0 ]. is Named ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Expression Element ( ĊĠĠĠĠĠĠĠĠĠ Ġparent Element , ĊĠĠĠĠĠĠĠĠĠ Ġarguments [ 0 ], ĊĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠ Ġarguments [ 0 ]. get Argument Expression () Ġas ĠK t Element ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġget MethodCall ( parentElement , Ġpsi Element , Ġname , ĠmethodName , Ġarguments List , Ġfalse ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget MethodCall ( ĊĠĠĠ Ġparent : ĠGradle Dsl Element , ĊĠĠĠ Ġpsi Element : ĠPsi Element , ĊĠĠĠ Ġname : ĠGradle Name Element , ĊĠĠĠ ĠmethodName : ĠString , ĊĠĠĠ Ġarguments : ĠK t Value ArgumentList ?, ĊĠĠĠ Ġis Constructor : ĠBoolean ĊĠ Ġ): ĠGradle Dsl MethodCall Ġ{ ĊĊĠĠĠ Ġval Ġmethod Call Ġ= ĠGradle Dsl MethodCall ( parent , Ġpsi Element , Ġname , ĠmethodName , Ġis Constructor ) ĊĠĠĠ Ġif Ġ( arguments Ġ== Ġnull ) Ġreturn Ġmethod Call ĊĠĠĠ Ġval Ġargument List Ġ= Ġget Expression List ( method Call , Ġarguments , ĠGradle Name Element . empty (), Ġarguments . arguments , Ġfalse ) ĊĠĠĠ Ġmethod Call . set Parsed ArgumentList ( argument List ) ĊĠĠĠ Ġreturn Ġmethod Call ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Expression Map ( parentElement Ġ: ĠGradle Dsl Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Psi Element : ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpropertyName Ġ: ĠGradle Name Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ: ĠList < Kt Element >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Literal Ġ: ĠBoolean ) Ġ: ĠGradle Dsl Expression Map Ġ{ ĊĠĠĠ Ġval Ġexpression Map Ġ= ĠGradle Dsl Expression Map ( parentElement , Ġmap Psi Element , ĠpropertyName , Ġis Literal ) ĊĠĠĠ Ġarguments . map Ġ{ ĊĠĠĠĠĠ Ġarg Ġ-> Ġ( arg Ġas ĠK t Value Argument ). get Argument Expression () ĊĠĠĠ Ġ}. filter Ġ{ ĊĠĠĠĠĠ Ġ// ĠFilter Ġmap Ġelements Ġthat Ġeither Ġhave Ġa Ġleft Ġor Ġright Ġelement Ġnull . ĠThis Ġfilter Ġmakes Ġusing Ġ!! Ġsafe Ġin Ġthe Ġnext Ġmap NotNull Ġfun . ĊĠĠĠĠĠ Ġexpression Ġ-> Ġexpression Ġis ĠK t Binary Expression Ġ&& Ġexpression . operation Reference . get Referenced Name () Ġ== Ġ" to " Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . left Ġ!= Ġnull Ġ&& Ġexpression . right Ġ!= Ġnull ĊĠĠĠ Ġ}. map NotNull Ġ{ ĊĠĠĠĠĠ Ġexpression Ġ-> Ġcreate Expression Element ( ĊĠĠĠĠĠ Ġexpression Map , Ġmap Psi Element , ĠGradle Name Element . from (( expression Ġas ĠK t Binary Expression ). left !! , Ġthis ), Ġexpression . right !! ) ĊĠĠĠ Ġ}. forEach ( expression Map :: add Parsed Element ) ĊĊĠĠĠ Ġreturn Ġexpression Map ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Arg list Map ( ĊĠĠĠ Ġparent Element : ĠGradle Dsl Element , ĊĠĠĠ Ġarglist Psi Element : ĠPsi Element , ĊĠĠĠ ĠpropertyName : ĠGradle Name Element , ĊĠĠĠ Ġarguments : ĠList < Kt Value Argument > ĊĠ Ġ): ĠGradle Dsl Expression Map Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= ĠGradle Dsl Expression Map ( parentElement , Ġarglist Psi Element , ĠpropertyName , Ġfalse ) ĊĠĠĠ Ġmap . as Named Args Ġ= Ġtrue ĊĠĠĠ Ġarguments ĊĠĠĠĠĠ Ġ. map Ġ{ Ġarg Ġ-> Ġarg . get Argument Name () Ġto Ġarg . get Argument Expression () Ġ} ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġe Ġ-> Ġe . first Ġ!= Ġnull Ġ&& Ġe . second Ġ!= Ġnull Ġ} ĊĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġe Ġ-> Ġcreate Expression Element ( map , Ġarglist Psi Element , ĠGradle Name Element . from ( e . first !! , Ġthis ), Ġe . second !! ) Ġ} ĊĠĠĠĠĠ Ġ. forEach ( map :: add Parsed Element ) ĊĠĠĠ Ġreturn Ġmap ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Expression List ( parentElement Ġ: ĠGradle Dsl Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Psi Element Ġ: ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpropertyName Ġ: ĠGradle Name Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Arguments Ġ: ĠList < Kt Element >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Literal Ġ: ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisSet Ġ: ĠBoolean Ġ= Ġfalse ) Ġ: ĠGradle Dsl Expression List Ġ{ ĊĠĠĠ Ġval Ġexpression List Ġ= ĠGradle Dsl Expression List ( parentElement , Ġlist Psi Element , Ġis Literal , ĠpropertyName ) ĊĠĠĠ Ġvalue Arguments . map Ġ{ ĊĠĠĠĠĠ Ġexpression Ġ-> Ġexpression Ġas ĠK t Value Argument ĊĠĠĠ Ġ}. filter Ġ{ ĊĠĠĠĠĠ Ġarg Ġ-> Ġarg . get Argument Expression () Ġ!= Ġnull ĊĠĠĠ Ġ}. map NotNull Ġ{ ĊĠĠĠĠĠ Ġargument Expression Ġ-> Ġcreate Expression Element ( ĊĠĠĠĠĠ Ġexpression List , ĊĠĠĠĠĠ Ġargument Expression , ĊĠĠĠĠĠ Ġ// Ġis Named () Ġchecks Ġif Ġget Argument Name () Ġis Ġnot Ġnull , Ġso Ġusing Ġ!! Ġhere Ġis Ġsafe Ġ( unless Ġthe Ġimplementation Ġchanges ). ĊĠĠĠĠĠ Ġif Ġ( argument Expression . is Named ()) ĊĠĠĠĠĠĠĠ ĠGradle Name Element . create ( argument Expression . get Argument Name () !!. text ) Ġelse ĠGradle Name Element . empty (), ĊĠĠĠĠĠ Ġargument Expression . get Argument Expression () Ġas ĠK t Expression , Ġis Literal ) ĊĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it Ġis ĠGradle Dsl Closure ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparent Element . set Parsed Closure Element ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġexpression List . add Parsed Expression ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġexpression List ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Expression Element ( parent Ġ: ĠGradle Dsl Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpsi Element Ġ: ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠGradle Name Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġ: ĠK t Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Literal Ġ: ĠBoolean Ġ= Ġfalse ) Ġ: ĠGradle Dsl Expression ? Ġ{ ĊĠĠĠ Ġ// ĠParse Ġall Ġthe ĠValue Argument Ġtypes . ĊĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠ Ġis ĠK t Value ArgumentList Ġ-> Ġreturn Ġget Expression List ( parent , Ġexpression , Ġname , Ġexpression . arguments , Ġis Literal ) ĊĠĠĠĠĠ Ġis ĠK t Call Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠEx : Ġimplementation ( kotlin (" stdlib - jdk 7 ")). ĊĠĠĠĠĠĠĠ Ġval Ġexpression Name Ġ= Ġexpression . name () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ// ĠSpecial Ġhandling Ġfor ĠK t Call Expression Ġnamed ĠFile Ġassuming Ġthat Ġit Ġis Ġa Ġconstructor Ġcall Ġas Ġit Ġis Ġonly Ġused Ġfor Ġpath Ġvalues Ġso Ġfar . ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ( kar im ai ): Ġthis Ġis Ġa Ġworkaround Ġto Ġavoid Ġusing Ġpsi Ġresolution Ġfor Ġnow , ĠSee Ġb / 1 4 5 3 9 5 3 9 0 . ĊĠĠĠĠĠĠĠ Ġif Ġ( expression Name Ġ== ĠFILE _ CON STRUCTOR _ NAME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġget MethodCall ( parent , Ġexpression , Ġname , Ġexpression Name , Ġexpression . value ArgumentList , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġexpression . value ArgumentList Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġget Call Expression ( parent , Ġexpression , Ġname , Ġarguments , Ġexpression Name , Ġfalse , Ġis Literal ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠK t Dot Qualified Expression Ġ-> Ġreturn Ġget Dot Qualified Expression ( parent , Ġpsi Element , Ġname , Ġexpression ) ĊĠĠĠĠĠ Ġis ĠK t Parent hesized Expression Ġ-> Ġreturn Ġcreate Expression Element ( parent , Ġpsi Element , Ġname , Ġexpression . expression Ġ?: Ġexpression ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġget Expression Element ( parent , Ġpsi Element , Ġname , Ġexpression ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Expression Element ( parentElement Ġ: ĠGradle Dsl Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpsi Element Ġ: ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpropertyName : ĠGradle Name Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Expression Ġ: ĠK t Element ) Ġ: ĠGradle Dsl Expression Ġ{ ĊĠĠĠ Ġfun Ġunknown Element () Ġ: ĠGradle Dsl Expression Ġ{ ĊĠĠĠĠĠ Ġparent Element . notification ( IN COMPLETE _ PAR SING ). add Unknown Element ( property Expression ) ĊĠĠĠĠĠ Ġreturn ĠGradle Dsl Unknown Element ( parentElement , Ġproperty Expression , ĠpropertyName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġwhen Ġ( property Expression ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠEx : Ġversion Name Ġ= Ġ 1 . 0 . Ġis Qualified Ġ= Ġfalse . ĊĠĠĠĠĠ Ġis ĠK t String Template Expression Ġ-> ĊĠĠĠĠĠĠĠ ĠGradle Dsl Literal ( ĊĠĠĠĠĠĠĠĠĠ Ġparent Element , ĊĠĠĠĠĠĠĠĠĠ Ġpsi Element , ĊĠĠĠĠĠĠĠĠĠ ĠpropertyName , ĊĠĠĠĠĠĠĠĠĠ Ġproperty Expression , ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( property Expression . has Interpolation ()) ĠGradle Dsl Literal . Literal Type . INTER POL ATION Ġelse ĠGradle Dsl Literal . Literal Type . LITERAL ) ĊĠĠĠĠĠ Ġis ĠK t Constant Expression Ġ-> ĠGradle Dsl Literal ( ĊĠĠĠĠĠĠĠ Ġparent Element , Ġpsi Element , ĠpropertyName , Ġproperty Expression , ĠGradle Dsl Literal . Literal Type . LITERAL ) ĊĠĠĠĠĠ Ġ// ĠEx : Ġcompile Sdk Version ( SDK _ VERSION ). ĊĠĠĠĠĠ Ġis ĠK t Name Reference Expression Ġ-> ĠGradle Dsl Literal ( ĊĠĠĠĠĠĠĠ Ġparent Element , Ġpsi Element , ĠpropertyName , Ġproperty Expression , ĠGradle Dsl Literal . Literal Type . REFERENCE ) ĊĠĠĠĠĠ Ġ// ĠEx : ĠKotlin Compiler Version . VERSION . ĊĠĠĠĠĠ Ġis ĠK t Dot Qualified Expression Ġ-> ĠGradle Dsl Literal ( ĊĠĠĠĠĠĠĠ Ġparent Element , Ġpsi Element , ĠpropertyName , Ġproperty Expression , ĠGradle Dsl Literal . Literal Type . REFERENCE ) ĊĠĠĠĠĠ Ġ// ĠEx : ĠDelete :: class . ĊĠĠĠĠĠ Ġis ĠK t Class Literal Expression Ġ-> Ġwhen Ġ( val Ġreceiver Expression Ġ= Ġproperty Expression . receiver Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġunknown Element () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠGradle Dsl Literal ( parentElement , Ġpsi Element , ĠpropertyName , Ġreceiver Expression , ĠGradle Dsl Literal . Literal Type . REFERENCE ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// ĠEx : Ġextra [" COMPILE _ SDK _ VERSION "] ĊĠĠĠĠĠ Ġis ĠK t Array Access Expression Ġ-> ĠGradle Dsl Literal ( ĊĠĠĠĠĠĠĠ Ġparent Element , Ġpsi Element , ĠpropertyName , Ġproperty Expression , ĠGradle Dsl Literal . Literal Type . REFERENCE ) ĊĠĠĠĠĠ Ġ// ĠEx : Ġextra [" COMPILE _ SDK _ VERSION "] !! , Ġfalse !! ĊĠĠĠĠĠ Ġis ĠK t Post fix Expression Ġ-> Ġwhen Ġ( val Ġbase Expression Ġ= Ġproperty Expression . base Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġunknown Element () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġget Expression Element ( parentElement , Ġpsi Element , ĠpropertyName , Ġbase Expression ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// ĠEx : Ġextra [" foo "] Ġas ĠBoolean , Ġfalse Ġas ĠBoolean ĊĠĠĠĠĠ Ġis ĠK t Binary Expression WithType RHS Ġ-> Ġget Expression Element ( parentElement , Ġpsi Element , ĠpropertyName , Ġproperty Expression . left ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġunknown Element () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Closure Block ( ĊĠĠĠ Ġparent Element : ĠGradle Dsl Element , Ġclo s able Block Ġ: ĠK t Block Expression , ĠpropertyName : ĠGradle Name Element ) Ġ: ĠGradle Dsl Closure Ġ{ ĊĠĠĠ Ġval Ġclosure Element Ġ= ĠGradle Dsl Closure ( parentElement , Ġclo s able Block , ĠpropertyName ) ĊĠĠĠ Ġclo s able Block . statements ?. require No Null s ()?. forEach Ġ{ ĊĠĠĠĠĠ Ġit . accept ( this , Ġclosure Element ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġclosure Element ĊĠ Ġ} Ċ Ċ } Ċ