package Ġorg . p ants build . backend . kotlin . dependency _ inference Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . intellij . openapi . util . Dis poser Ċ import Ġcom . intellij . psi . Psi Manager Ċ import Ġcom . intellij . test Framework . Light Virtual File Ċ import Ġorg . jetbrains . kotlin . cli . jvm . compiler . Environment Config Files Ċ import Ġorg . jetbrains . kotlin . cli . jvm . compiler . Kotlin Core Environment Ċ import Ġorg . jetbrains . kotlin . config . Compiler Configuration Ċ import Ġorg . jetbrains . kotlin . idea . Kotlin FileType Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . psi . Kt Class Or Object Ċ import Ġorg . jetbrains . kotlin . psi . Kt Dot Qualified Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . psi . Kt Import List Ċ import Ġorg . jetbrains . kotlin . psi . Kt Named Declaration Ċ import Ġorg . jetbrains . kotlin . psi . Kt Package Directive Ċ import Ġorg . jetbrains . kotlin . psi . Kt Simple Name Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Tree Visitor Void Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Paths Ċ Ċ // ĠK t File : Ġhttps :// github . com / Jet Brains / kotlin / blob / 8 bc 2 9 a 3 0 1 1 1 0 8 1 ee 0 b 0 dbe 0 6 d 1 f 6 4 8 a 7 8 9 9 0 9 a 2 7 / compiler / psi / src / org / jetbrains / kotlin / psi / Kt File . kt Ċ Ċ data Ġclass ĠKotlin Import ( ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġalias : ĠString ?, ĊĠĠĠ Ġval Ġis Wildcard : ĠBoolean , Ċ ) Ċ Ċ data Ġclass ĠKotlin Analysis ( ĊĠĠĠ Ġval Ġ` package `: ĠString , ĊĠĠĠ Ġval Ġimports : ĠList < Kotlin Import >, ĊĠĠĠ Ġval Ġnamed Declarations : ĠList < String >, ĊĠĠĠ Ġval Ġscopes : ĠList < String >, ĊĠĠĠ Ġval Ġconsumed Symbols By Scope : ĠMap < String , ĠList < String >> Ċ ) Ċ Ċ fun Ġparse ( code : ĠString ): ĠK t File Ġ{ ĊĠĠĠ Ġval Ġdis posable Ġ= ĠDis poser . new Disposable () ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġenv Ġ= ĠKotlin Core Environment . create For Production ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdis posable , ĠCompiler Configuration (), ĠEnvironment Config Files . JVM _ CONFIG _ FILES ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠLight Virtual File (" temp . kt ", ĠKotlin FileType . INSTANCE , Ġcode ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPsi Manager . getInstance ( env . project ). find File ( file ) Ġas ĠK t File ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġdis posable . dispose () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġname From Expression ( expression : ĠK t Expression ?): ĠName ? Ġ{ ĊĠĠĠ Ġif Ġ( expression Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠK t Simple Name Expression Ġ-> Ġexpression . get Referenced Name As Name () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġfq Name From Expression ( expression : ĠK t Expression ?): ĠF q Name ? Ġ{ ĊĠĠĠ Ġif Ġ( expression Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠK t Dot Qualified Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdot Qualified Expression Ġ= Ġexpression Ġas ĠK t Dot Qualified Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent F qn : ĠF q Name ? Ġ= Ġfq Name From Expression ( dot Qualified Expression . receiver Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild : ĠName Ġ= Ġname From Expression ( dot Qualified Expression . selector Expression ) Ġ?: Ġreturn Ġparent F qn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent F qn Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent F qn . child ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠK t Simple Name Expression Ġ-> ĠF q Name . top Level ( expression . get Referenced Name As Name ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} Ċ } Ċ fun Ġanalyze ( file : ĠK t File ): ĠKotlin Analysis Ġ{ ĊĠĠĠ Ġval Ġpkg Ġ= Ġfile . package Fq Name . asString () ĊĊĠĠĠ Ġval Ġimports Ġ= Ġfile . import Directives . map Ġ{ Ġimport Directive Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġimport Directive . imported Fq Name ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Import ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname = name . asString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias = import Directive . alias Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Wildcard = import Directive . is All Under , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġvisitor Ġ= Ġobject Ġ: ĠK t Tree Visitor Void () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsymbols Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Named Declaration ( decl : ĠK t Named Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfq Name Ġ= Ġdecl . getF q Name () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fq Name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . add ( fq Name . asString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġvisitor . visit Kt File ( file , Ġnull ) ĊĊĠĠĠ Ġval Ġconsumed Symbols Visitor Ġ= Ġobject Ġ: ĠK t Tree Visitor Void () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsymbols By Scope Ġ= Ġmutable Map Of < String , ĠMutable Set < String >>() ĊĠĠĠĠĠĠĠ Ġval Ġscopes Ġ= Ġmutable Set Of < String >( pkg ) ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Scope Ġ= Ġpkg ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Class Or Object ( class Or Object : ĠK t Class Or Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Scope Ġ= Ġcurrent Scope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Id Ġ= Ġclass Or Object . getClass Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( class Id Ġ!= Ġnull Ġ&& Ġ! class Id . is Local ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Scope Ġ= Ġclass Id . as Fq Name String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscopes . add ( current Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Class Or Object ( class Or Object ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Scope Ġ= Ġold Scope ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSkip Ġrecur sing Ġfor Ġimports Ġdirectives Ġand Ġthe Ġpackage Ġdirective Ġso Ġthey Ġdo Ġnot Ġshow Ġup ĊĠĠĠĠĠĠĠ Ġ// Ġin Ġthe Ġconsumed Ġsymbols Ġanalysis . ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Import List ( import List : ĠK t Import List ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Package Directive ( directive : ĠK t Package Directive ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Dot Qualified Expression ( expr : ĠK t Dot Qualified Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfq Name Ġ= Ġfq Name From Expression ( expr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fq Name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! symbols By Scope . contains ( current Scope )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols By Scope . put ( current Scope , Ġmutable Set Of < String >()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbols For Scope Ġ= Ġsymbols By Scope . get ( current Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols For Scope ?. add ( fq Name . asString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Simple Name Expression ( expr : ĠK t Simple Name Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfq Name Ġ= Ġfq Name From Expression ( expr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fq Name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! symbols By Scope . contains ( current Scope )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols By Scope . put ( current Scope , Ġmutable Set Of < String >()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbols For Scope Ġ= Ġsymbols By Scope . get ( current Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols For Scope ?. add ( fq Name . asString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġconsumed Symbols Visitor . visit Kt File ( file ) ĊĊĠĠĠ Ġreturn ĠKotlin Analysis ( ĊĠĠĠĠĠĠĠ Ġpkg , ĊĠĠĠĠĠĠĠ Ġimports . filter NotNull (), ĊĠĠĠĠĠĠĠ Ġvisitor . symbols , ĊĠĠĠĠĠĠĠ Ġconsumed Symbols Visitor . scopes . toList (), ĊĠĠĠĠĠĠĠ Ġconsumed Symbols Visitor . symbols By Scope . map Values Ġ{ Ġit . value . toList () Ġ}, ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġanalysis Output Path Ġ= Ġargs [ 0 ] ĊĠĠĠ Ġval Ġsource Path Ġ= Ġargs [ 1 ] ĊĊĠĠĠ Ġval Ġsource Content Bytes Ġ= ĠFiles . read All Bytes ( Paths . get ( source Path )) ĊĠĠĠ Ġval Ġsource Content Ġ= ĠString ( source Content Bytes , ĠStandard Charsets . UTF _ 8 ) ĊĠĠĠ Ġval Ġparsed Ġ= Ġparse ( source Content ) ĊĠĠĠ Ġval Ġanalysis Ġ= Ġanalyze ( parsed ) ĊĊĠĠĠ Ġval Ġgson Ġ= ĠGson () ĊĠĠĠ Ġval Ġanalysis Output Ġ= Ġgson . toJson ( analysis ) ĊĠĠĠ ĠFiles . write ( Paths . get ( analysis Output Path ), Ġanalysis Output . toByteArray ( StandardCharsets . UTF _ 8 )) Ċ } Ċ