/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* Ġ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 . idea . as Java Ċ Ċ import Ġcom . intellij . openapi . util . Comp aring Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . psi .* Ċ import Ġcom . intellij . psi . impl . Psi Super MethodImpl Util Ċ import Ġcom . intellij . psi . impl . light . Light Empty Implements List Ċ import Ġcom . intellij . psi . impl . light . Light Modifier List Ċ import Ġorg . jetbrains . annotations . Non N ls Ċ import Ġorg . jetbrains . kotlin . as Java . classes .* Ċ import Ġorg . jetbrains . kotlin . as Java . elements .* Ċ import Ġorg . jetbrains . kotlin . descriptors . annotations . Annotation Use Site Target Ċ import Ġorg . jetbrains . kotlin . file Classes . Jvm File Class Util Ċ import Ġorg . jetbrains . kotlin . file Classes . java File Facade Fq Name Ċ import Ġorg . jetbrains . kotlin . fir . declarations .* Ċ import Ġorg . jetbrains . kotlin . fir . types . Con e Null ability Ċ import Ġorg . jetbrains . kotlin . idea . Kotlin Language Ċ import Ġorg . jetbrains . kotlin . idea . frontend . api . analyze Ċ import Ġorg . jetbrains . kotlin . idea . frontend . api . symbols . Kt Callable Symbol Ċ import Ġorg . jetbrains . kotlin . load . java . structure . Light Class Origin Kind Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . is Private Ċ import Ġorg . jetbrains . kotlin . util . collection Utils . filter Is Instance And Ċ import Ġjavax . swing . Icon Ċ Ċ class ĠF ir Light Class For Facade ( ĊĠĠĠ Ġmanager : ĠPsi Manager , ĊĠĠĠ Ġprivate Ġval Ġfac ade Class Fq Name : ĠF q Name , ĊĠĠĠ Ġprivate Ġval Ġfiles : ĠCollection < Kt File > Ċ ) Ġ: ĠF ir Light Class Base ( manager ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġcls Delegate : ĠPsi Class Ġget () Ġ= Ġinvalid Access () ĊĊĠĠĠ Ġprivate Ġval Ġis Multi File Class : ĠBoolean Ġby Ġlazy Pub Ġ{ ĊĠĠĠĠĠĠĠ Ġfiles . size Ġ> Ġ 1 Ġ|| Ġfiles . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ vm File Class Util . find Annotation Entry On File No Resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshort Name Ġ= ĠJ vm File Class Util . JVM _ MULTI FILE _ CLASS _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ modifier List : ĠPsi Modifier List Ġby Ġlazy Pub Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Multi File Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ lazy Pub ĠLight Modifier List ( manager , ĠKotlin Language . INSTANCE , ĠPsi Modifier . PUBLIC , ĠPsi Modifier . FINAL ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmodifiers Ġ= Ġset Of ( Psi Modifier . PUBLIC , ĠPsi Modifier . FINAL ) Ċ Ċ // ĠĠĠĠĠĠĠ Ġval Ġannotations Ġ= Ġfiles . flatMap Ġ{ Ġfile Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġfile . with F ir < F ir File , ĠList < Psi Annotation >> Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompute Annotations ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġthis @ F ir Light Class For Facade , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ability Ġ= ĠC one Null ability . UNKNOWN , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Use Site Target Ġ= ĠAnnotation Use Site Target . FILE Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġannotations Ġ= Ġempty List < Psi Annotation >() Ġ// TODO ĊĊĠĠĠĠĠĠĠ ĠF ir Light Class Modifier List ( this @ F ir Light Class For Facade , Ġmodifiers , Ġannotations ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Modifier List (): ĠPsi Modifier List Ġ= Ġ_ modifier List ĊĊĠĠĠ Ġoverride Ġfun Ġget Scope (): ĠPsi Element ? Ġ= Ġparent ĊĊĠĠĠ Ġprivate Ġfun Ġload Methods FromFile ( ĊĠĠĠĠĠĠĠ Ġfile : ĠK t File , ĊĠĠĠĠĠĠĠ Ġresult : ĠMutable List < Kt Light Method > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// it . is Hidden By De precation ( support ) ĊĠĠĠĠĠĠĠ Ġval Ġdeclarations Ġ= Ġfile . declarations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Kt Named Declaration >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġmulti File Class Ġ&& Ġit . is Private () Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( declarations . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġsymbols Ġ= Ġanalyze ( file ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclarations . map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Symbol () Ġas ? ĠK t Callable Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcreate Methods ( symbols . as Sequence (), Ġis TopLevel Ġ= Ġtrue , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ own Methods : ĠList < Kt Light Method > Ġby Ġlazy Pub Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Kt Light Method >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġfiles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Methods FromFile ( file , Ġresult ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmulti File Class : ĠBoolean Ġby Ġlazy Pub Ġ{ ĊĠĠĠĠĠĠĠ Ġfalse Ġ// TODO Ċ // ĠĠĠĠĠĠĠ Ġfiles . any Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġit . with F ir < F ir File , ĠBoolean > Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . has Annotation ( Jvm File Class Util . JVM _ MULTI FILE _ CLASS . asString ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Fields FromFile ( ĊĠĠĠĠĠĠĠ Ġfile : ĠK t File , ĊĠĠĠĠĠĠĠ Ġresult : ĠMutable List < Kt Light Field > ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// it . is Hidden By De precation ( support ) ĊĠĠĠĠĠĠĠ Ġval Ġdeclarations Ġ= Ġfile . declarations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Kt Named Declaration >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġmulti File Class Ġ&& Ġit Ġis ĠF ir Property Ġ&& Ġit . is Const Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( declarations . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġsymbols Ġ= Ġanalyze ( file ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclarations . map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Symbol () Ġas ? ĠK t Callable Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcreate Fields ( symbols . as Sequence (), Ġis TopLevel Ġ= Ġtrue , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ own Fields : ĠList < Kt Light Field > Ġby Ġlazy Pub Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Kt Light Field >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġfiles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Fields FromFile ( file , Ġresult ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Own Fields () Ġ= Ġ_ own Fields ĊĊĠĠĠ Ġoverride Ġfun Ġget Own Methods () Ġ= Ġ_ own Methods ĊĊĠĠĠ Ġoverride Ġfun Ġcopy (): ĠF ir Light Class For Facade Ġ= ĊĠĠĠĠĠĠĠ ĠF ir Light Class For Facade ( manager , Ġfac ade Class Fq Name , Ġfiles ) ĊĊĠĠĠ Ġprivate Ġval Ġfirst File In Facade Ġby Ġlazy Pub Ġ{ Ġfiles . iterator (). next () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpackage Fq Name : ĠF q Name Ġ= ĊĠĠĠĠĠĠĠ Ġfac ade Class Fq Name . parent () ĊĊĠĠĠ Ġprivate Ġval Ġmodifier List : ĠPsi Modifier List Ġ= ĊĠĠĠĠĠĠĠ ĠLight Modifier List ( manager , ĠKotlin Language . INSTANCE , ĠPsi Modifier . PUBLIC , ĠPsi Modifier . FINAL ) ĊĊĠĠĠ Ġprivate Ġval Ġimplements List : ĠLight Empty Implements List Ġ= ĊĠĠĠĠĠĠĠ ĠLight Empty Implements List ( manager ) ĊĊĠĠĠ Ġprivate Ġval Ġpackage Cls File Ġ= ĠFake File For Light Class ( ĊĠĠĠĠĠĠĠ Ġfirst File In Facade , ĊĠĠĠĠĠĠĠ Ġlight Class Ġ= Ġ{ Ġthis Ġ}, ĊĠĠĠĠĠĠĠ Ġstub Ġ= Ġ{ Ġnull Ġ}, ĊĠĠĠĠĠĠĠ Ġpackage Fq Name Ġ= Ġpackage Fq Name ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun ĠgetParent (): ĠPsi Element Ġ= Ġcontaining File ĊĊĠĠĠ Ġoverride Ġval Ġkotlin Origin : ĠK t Class Or Object ? Ġget () Ġ= Ġnull ĊĊĠĠĠ Ġval Ġfq Name : ĠF q Name ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfac ade Class Fq Name ĊĊĠĠĠ Ġoverride Ġfun Ġhas Modifier Property (@ Non N ls Ġname : ĠString ) Ġ= Ġmodifier List . has Modifier Property ( name ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Ext ends List (): ĠPsi Reference List ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġis Deprecated () Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġis Interface () Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġis Annotation Type () Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġis Enum () Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġget Containing Class (): ĠPsi Class ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġget Containing File () Ġ= Ġpackage Cls File ĊĊĠĠĠ Ġoverride Ġfun Ġhas Type Parameters () Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠgetType Parameters (): ĠArray < out ĠPsi Type Parameter > Ġ= ĠPsi Type Parameter . EMPTY _ ARRAY ĊĊĠĠĠ Ġoverride Ġfun ĠgetType Parameter List (): ĠPsi Type Parameter List ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġget Implements List () Ġ= Ġimplements List ĊĊĠĠĠ Ġoverride Ġfun Ġget Interfaces (): ĠArray < out ĠPsi Class > Ġ= ĠPsi Class . EMPTY _ ARRAY ĊĊĠĠĠ Ġoverride Ġfun Ġget Inner Classes (): ĠArray < out ĠPsi Class > Ġ= ĠPsi Class . EMPTY _ ARRAY ĊĊĠĠĠ Ġoverride Ġfun Ġget Own Inner Classes (): ĠList < Psi Class > Ġ= ĠlistOf () ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Inner Classes (): ĠArray < Psi Class > Ġ= ĠPsi Class . EMPTY _ ARRAY ĊĊĠĠĠ Ġoverride Ġfun Ġget Initial izers (): ĠArray < out ĠPsi Class Initializer > Ġ= ĠPsi Class Initializer . EMPTY _ ARRAY ĊĊĠĠĠ Ġoverride Ġfun Ġfind Inner Class ByName (@ Non N ls Ġname : ĠString , Ġcheck Bases : ĠBoolean ): ĠPsi Class ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠisIn her itor Deep ( base Class : ĠPsi Class ?, Ġclass To By Pass : ĠPsi Class ?): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġget L Brace (): ĠPsi Element ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġget R Brace (): ĠPsi Element ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠgetName (): ĠString Ġ= Ġfac ade Class Fq Name . short Name (). asString () ĊĊĠĠĠ Ġoverride Ġfun ĠsetName ( name : ĠString ): ĠPsi Element ? Ġ= Ġcannot Modify () ĊĊĠĠĠ Ġoverride Ġfun Ġget QualifiedName () Ġ= Ġfac ade Class Fq Name . asString () ĊĊĠĠĠ Ġoverride Ġfun ĠgetName Identifier (): ĠPsi Identifier ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠisValid () Ġ= Ġfiles . all Ġ{ Ġit . isValid Ġ&& Ġit . has TopLevel Call ables () Ġ&& Ġfac ade Class Fq Name Ġ== Ġit . java File Facade Fq Name Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Navigation Element () Ġ= Ġfirst File In Facade ĊĊĠĠĠ Ġoverride Ġfun Ġis Equivalent To ( another : ĠPsi Element ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġequals ( another ) Ġ|| Ġanother Ġis ĠF ir Light Class For Facade Ġ&& ĠComp aring . equal ( another . qualified Name , Ġqualified Name ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Element Icon ( flags : ĠInt ): ĠIcon ? Ġ= Ġthrow ĠUnsupportedOperationException (" This Ġshould Ġbe Ġdone Ġby ĠJet Icon Provider ") ĊĊĠĠĠ Ġoverride Ġfun ĠisIn her itor ( base Class : ĠPsi Class , Ġcheck Deep : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbase Class . qualified Name Ġ== ĠCommon ClassNames . JAVA _ LANG _ OBJECT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Super Class (): ĠPsi Class ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJava Psi Facade . getInstance ( project ). find Class ( Common ClassNames . JAVA _ LANG _ OBJECT , Ġresolve Scope ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Sup ers (): ĠArray < Psi Class > Ġ= ĊĠĠĠĠĠĠĠ ĠsuperClass ?. let Ġ{ ĠarrayOf ( it ) Ġ} Ġ?: ĠarrayOf () ĊĊĠĠĠ Ġoverride Ġfun Ġget Super Types (): ĠArray < Psi ClassType > Ġ= ĊĠĠĠĠĠĠĠ ĠarrayOf ( Psi Type . get Java Lang Object ( manager , Ġresolve Scope )) ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠF ir Light Class For Facade ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this . hashCode () Ġ!= Ġother . hashCode ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( manager Ġ!= Ġother . manager ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( facade Class Fq Name Ġ!= Ġother . facade Class Fq Name ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġfac ade Class Fq Name . hashCode () ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"${ Kt Light Class For Facade :: class . java . simple Name }: $ facade Class Fq Name " ĊĊĠĠĠ Ġoverride Ġval Ġorigin Kind : ĠLight Class Origin Kind ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠLight Class Origin Kind . SOURCE ĊĊĠĠĠ Ġoverride Ġfun ĠgetText () Ġ= Ġfirst File In Facade . text Ġ?: Ġ"" ĊĊĠĠĠ Ġoverride Ġfun ĠgetText Range (): ĠText Range Ġ= Ġfirst File In Facade . text Range Ġ?: ĠText Range . EMPTY _ RANGE ĊĊĠĠĠ Ġoverride Ġfun ĠgetText Offset () Ġ= Ġfirst File In Facade . text Offset ĊĊĠĠĠ Ġoverride Ġfun Ġget Start Offset In Parent () Ġ= Ġfirst File In Facade . start Offset In Parent ĊĊĠĠĠ Ġoverride Ġfun Ġis Writable () Ġ= Ġfiles . all Ġ{ Ġit . is Writable Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Visible Signatures (): ĠMutable Collection < Hierarchical Method Signature > Ġ= ĠPsi Super MethodImpl Util . get Visible Signatures ( this ) Ċ }