/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . k apt 3 . base . stubs Ċ Ċ import Ġcom . sun . tools . javac . tree . J CT ree Ċ import Ġcom . sun . tools . javac . tree . Tree Scanner Ċ import Ġorg . jetbrains . kotlin . k apt 3 . base . util . get PackageName Java 9 Aware Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . Object InputStream Ċ Ċ class ĠK apt Stub Line Information Ġ{ ĊĠĠĠ Ġprivate Ġval Ġoffsets Ġ= Ġmutable Map Of < J CT ree . JC Compilation Unit , ĠFileInfo >() ĊĠĠĠ Ġprivate Ġval Ġdeclarations Ġ= Ġmutable Map Of < J CT ree . JC Compilation Unit , ĠList < J CT ree >>() ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠK AP T _ METADATA _ EXTENSION Ġ= Ġ". k apt _ metadata " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMET ADATA _ VERSION Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse FileInfo ( file : ĠJ CT ree . JC Compilation Unit ): ĠFileInfo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Uri Ġ= Ġfile . source file ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . to Uri () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġit . is Absolute Ġ&& Ġ! it . is Opaque Ġ&& Ġit . path Ġ!= Ġnull Ġ&& Ġit . scheme ?. toLowerCase () Ġ== Ġ" file " Ġ} Ġ?: Ġreturn ĠFileInfo . EMPTY ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource File Ġ= ĠFile ( source Uri ). take If Ġ{ Ġit . exists () Ġ} Ġ?: Ġreturn ĠFileInfo . EMPTY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk apt Metadata File Ġ= ĠFile ( source File . parent File , Ġsource File . name Without Extension Ġ+ ĠK AP T _ METADATA _ EXTENSION ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! k apt Metadata File . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFileInfo . EMPTY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdeserialize ( k apt Metadata File . read Bytes ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdeserialize ( data : ĠByteArray ): ĠFileInfo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Info : ĠLine Info Map Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Info Ġ= Ġmutable Map Of < String , ĠString >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo is Ġ= ĠObject InputStream ( ByteArray InputStream ( data )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġo is . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( version Ġ!= ĠMET ADATA _ VERSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFileInfo . EMPTY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Info Count Ġ= Ġo is . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( line Info Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfq Name Ġ= Ġo is . read UTF () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġo is . read UTF () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Relative Ġ= Ġo is . read Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġo is . readInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Info [ fq Name ] Ġ= ĠKotlin Position ( path , Ġis Relative , Ġpos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Count Ġ= Ġo is . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( signature Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjav ac Signature Ġ= Ġo is . read UTF () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Desc Ġ= Ġo is . read UTF () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature Info [ javac Signature ] Ġ= Ġmethod Desc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFileInfo ( line Info , Ġsignature Info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Position In Kotlin File ( file : ĠJ CT ree . JC Compilation Unit , Ġelement : ĠJ CT ree ): ĠKotlin Position ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Ġ= Ġfind Declaration For ( element , Ġfile ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Info Ġ= Ġoffsets . get Or Put ( file ) Ġ{ Ġparse FileInfo ( file ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġelement Descriptor Ġ= Ġget K apt Descriptor ( declaration , Ġfile , Ġfile Info ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfile Info . getPosition For ( element Descriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Declaration For ( element : ĠJ CT ree , Ġfile : ĠJ CT ree . JC Compilation Unit ): ĠJ CT ree ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Declarations Ġ= Ġdeclarations . get Or Put ( file ) Ġ{ Ġcollect Declarations ( file ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile Declarations . first OrNull Ġ{ Ġelement . is Loc ated Inside ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget K apt Descriptor ( declaration : ĠJ CT ree , Ġfile : ĠJ CT ree . JC Compilation Unit , Ġfile Info : ĠFileInfo ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġget Fq Name ( declaration : ĠJ CT ree , Ġparent : ĠJ CT ree , Ġcurrent Name : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( parent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJ CT ree . JC Compilation Unit Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( definition Ġin Ġparent . defs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġcould Ġbe Ġonly Ġclass Ġdefinitions Ġon Ġthe Ġtop Ġlevel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefinition Ġas ? ĠJ CT ree . JC Class Decl Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Fq Name ( declaration , Ġdefinition , Ġ"") ?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJ CT ree . JC Class Decl Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġparent . simple Name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewName Ġ= Ġif Ġ( current Name . isEmpty ()) ĠclassName Ġelse Ġcurrent Name Ġ+ Ġ"$ " Ġ+ ĠclassName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġ=== Ġparent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠnewName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( definition Ġin Ġparent . defs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Fq Name ( declaration , Ġdefinition , ĠnewName )?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJ CT ree . JC Variable Decl Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġ=== Ġparent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Name Ġ+ Ġ"#" Ġ+ Ġparent . name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJ CT ree . JC Method Decl Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġdon 't Ġneed Ġto Ġprocess Ġlocal Ġdeclarations Ġhere Ġas Ġk apt Ġdoes Ġnot Ġsupport Ġlocals Ġentirely . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġ=== Ġparent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname And Signature Ġ= Ġfile Info . getMethod Descriptor ( parent ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Name Ġ+ Ġ"#" Ġ+ Ġname And Signature ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠUnfortunately , Ġwe Ġhave Ġto Ġdo Ġthis Ġthe Ġhard Ġway , Ġas Ġsymbols Ġmay Ġbe Ġnot Ġavailable Ġyet ĊĠĠĠĠĠĠĠ Ġ// Ġ( for Ġinstance , Ġif Ġthis Ġcode Ġis Ġcalled Ġinside Ġthe Ġ" enter Trees () ") ĊĠĠĠĠĠĠĠ Ġval Ġsimple Descriptor Ġ= Ġget Fq Name ( declaration , Ġfile , Ġ"") ĊĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġfile . get PackageName Java 9 Aware ()?. toString ()?. replace ('.', Ġ'/') ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( packageName Ġ== Ġnull ) Ġsimple Descriptor Ġelse Ġ"$ packageName /$ simple Descriptor " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Declarations ( file : ĠJ CT ree . JC Compilation Unit ): ĠList < J CT ree > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclarations Ġ= Ġmutable ListOf < J CT ree >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠNote Ġthat Ġsuper . visit ... () Ġis Ġabove Ġthe Ġdeclarations Ġsaving . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġallows Ġus Ġto Ġget Ġthe Ġdee pe st Ġdeclarations Ġin Ġthe Ġbeginning Ġof Ġthe Ġlist . ĊĠĠĠĠĠĠĠ Ġfile . accept ( object Ġ: ĠTree Scanner () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Class Def ( tree : ĠJ CT ree . JC Class Decl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Class Def ( tree ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclarations Ġ+= Ġtree ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Var Def ( tree : ĠJ CT ree . JC Variable Decl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġvisit Ġvariable Ġcontents , Ġthere Ġcan Ġbe Ġnothing Ġbut Ġlocal Ġdeclarations Ġwhich Ġwe Ġdon 't Ġsupport ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclarations Ġ+= Ġtree ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Method Def ( tree : ĠJ CT ree . JC Method Decl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġvisit Ġmethods Ġcontents , Ġthere Ġcan Ġbe Ġnothing Ġbut Ġlocal Ġdeclarations Ġwhich Ġwe Ġdon 't Ġsupport ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclarations Ġ+= Ġtree ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Tree ( tree : ĠJ CT ree ?) Ġ{} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdeclarations ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJ CT ree . is Loc ated Inside ( declaration : ĠJ CT ree ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfound Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġdeclaration . accept ( object Ġ: ĠTree Scanner () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġscan ( tree : ĠJ CT ree ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! found Ġ&& Ġtree Ġ=== Ġthis @ is Loc ated Inside ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( found ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . scan ( tree ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġscan ( trees : Ġcom . sun . tools . javac . util . List < out ĠJ CT ree > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġdon 't Ġneed Ġto Ġrepeat Ġthe Ġlogic Ġabove Ġhere Ġas Ġscan ( List ) Ġcalls Ġscan ( J CT ree ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( found ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . scan ( trees ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfound ĊĠĠĠ Ġ} Ċ }