/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . jetbrains . kotlin . resolve Ċ Ċ import Ġorg . jetbrains . kotlin . builtins . Kotlin Built Ins Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Declaration Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Property Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . annotations . Annotation Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . annotations . Annotation Use Site Target Ċ import Ġorg . jetbrains . kotlin . descriptors . annotations . Kotlin Retention Ċ import Ġorg . jetbrains . kotlin . descriptors . annotations . Kotlin Target Ċ import Ġorg . jetbrains . kotlin . descriptors . annotations . Kotlin Target .* Ċ import Ġorg . jetbrains . kotlin . diagnostics . Errors Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . getAnnotation Entries Ċ import Ġorg . jetbrains . kotlin . resolve . constants . Array Value Ċ import Ġorg . jetbrains . kotlin . resolve . constants . EnumValue Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . getAnnotation Retention Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . is Repeat able Annotation Ċ import Ġorg . jetbrains . kotlin . resolve . inline . Inline Util Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . types . Type Utils Ċ import Ġorg . jetbrains . kotlin . types . expressions . Expression Typing Utils Ċ Ċ class ĠAnnotation Checker ( private Ġval Ġadditional Check ers : ĠIterable < Additional Annotation Checker >) Ġ{ ĊĊĠĠĠ Ġfun Ġcheck ( annotated : ĠK t Annotated , Ġtrace : ĠBinding Trace , Ġdescriptor : ĠDeclaration Descriptor ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Targets Ġ= Ġget Actual Target List ( annotated , Ġdescriptor , Ġtrace ) ĊĠĠĠĠĠĠĠ Ġcheck Entries ( annotated . annotation Entries , Ġactual Targets , Ġtrace ) ĊĠĠĠĠĠĠĠ Ġif Ġ( annotated Ġis ĠK t Callable Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotated . type Reference ?. let Ġ{ Ġcheck ( it , Ġtrace ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotated . receiver Type Reference ?. let Ġ{ Ġcheck ( it , Ġtrace ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( annotated Ġis ĠK t Type Parameter List Owner Ġ&& Ġannotated Ġis ĠK t Callable Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġsupport Ġtype Ġparameter Ġannotations Ġfor Ġtype Ġparameters Ġon Ġclasses Ġand Ġproperties ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotated . type Parameters . forEach Ġ{ Ġcheck ( it , Ġtrace ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( annotated Ġis ĠK t Type Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotated . type Element ?. type Arguments As Types ?. filter NotNull ()?. forEach Ġ{ Ġcheck ( it , Ġtrace ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( annotated Ġis ĠK t Declaration With Body ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJet Function Ġor ĠJet Property Accessor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( parameter Ġin Ġannotated . value Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! parameter . has Val Or Var ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( parameter , Ġtrace ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( annotated Ġis ĠK t Function Literal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . type Reference ?. let Ġ{ Ġcheck ( it , Ġtrace ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Expression ( expression : ĠK t Expression , Ġtrace : ĠBinding Trace ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Entries ( expression . getAnnotation Entries (), Ġget Actual Target List ( expression , Ġnull , Ġtrace ), Ġtrace ) ĊĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠK t Lambda Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( parameter Ġin Ġexpression . value Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . type Reference ?. let Ġ{ Ġcheck ( it , Ġtrace ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Entries ( entries : ĠList < Kt Annotation Entry >, Ġactual Targets : ĠTarget List , Ġtrace : ĠBinding Trace ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentry Types With Annotations Ġ= Ġhash Map Of < Kotlin Type , ĠMutable List < Annotation Use Site Target ? >>() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġentries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Annotation Entry ( entry , Ġactual Targets , Ġtrace ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġtrace . get ( Binding Context . AN NOT ATION , Ġentry ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Descriptor Ġ= ĠType Utils . getClass Descriptor ( descriptor . type ) Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Site Target Ġ= Ġentry . use Site Target ?. getAnnotation Use Site Target () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Targets For Annotation Ġ= Ġentry Types With Annotations . get Or Put ( descriptor . type ) Ġ{ Ġarray ListOf () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduplicate Annotation Ġ= Ġuse Site Target Ġin Ġexisting Targets For Annotation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( existing Targets For Annotation . any Ġ{ Ġ( it Ġ== Ġnull ) Ġ!= Ġ( use Site Target Ġ== Ġnull ) Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( duplicate Annotation Ġ&& Ġ! class Descriptor . is Repeat able Annotation ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace . report ( Errors . RE PE ATED _ AN NOT ATION . on ( entry )); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Targets For Annotation . add ( use Site Target ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadditional Check ers . forEach Ġ{ Ġit . check Entries ( entries , Ġactual Targets . default Targets , Ġtrace ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Annotation Entry ( entry : ĠK t Annotation Entry , Ġactual Targets : ĠTarget List , Ġtrace : ĠBinding Trace ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapplicable Targets Ġ= Ġapplicable Target Set ( entry , Ġtrace ) ĊĠĠĠĠĠĠĠ Ġval Ġuse Site Target Ġ= Ġentry . use Site Target ?. getAnnotation Use Site Target () ĊĊĠĠĠĠĠĠĠ Ġfun Ġcheck ( targets : ĠList < Kotlin Target >) Ġ= Ġtargets . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġin Ġapplicable Targets Ġ&& Ġ( use Site Target Ġ== Ġnull Ġ|| ĠKotlin Target . USE _ SITE _ MAPPING [ use Site Target ] Ġ== Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcheck Use less Function Literal Annotation () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġtests Ġon Ġdifferent ĠJet Annotated Expression Ġ(? !) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Kotlin Target . FUNCTION Ġ! in Ġapplicable Targets ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotated Expression Ġ= Ġentry . parent Ġas ? ĠK t Annotated Expression Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġtrace . get ( Binding Context . AN NOT ATION , Ġentry ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġretention Ġ= Ġdescriptor . type . constructor . declaration Descriptor ?. getAnnotation Retention () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( retention Ġ== ĠKotlin Retention . SOURCE ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Literal Expression Ġ= Ġannotated Expression . base Expression Ġas ? ĠK t Lambda Expression Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Inline Util . isIn lined Argument ( function Literal Expression . function Literal , Ġtrace . binding Context , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace . report ( Errors . NON _ SOURCE _ AN NOT ATION _ ON _ IN LIN ED _ L AMBDA _ EXPRESSION . on ( entry )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġapplicable With Use Site Target () Ġ= Ġuse Site Target Ġ!= Ġnull Ġ&& Ġactual Targets . only With Use Site Target . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġin Ġapplicable Targets Ġ&& ĠKotlin Target . USE _ SITE _ MAPPING [ use Site Target ] Ġ== Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( check ( actual Targets . default Targets ) Ġ|| Ġcheck ( actual Targets . can Be Subst it uted ) Ġ|| Ġapplicable With Use Site Target ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Use less Function Literal Annotation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( use Site Target Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrace . report ( Errors . WRONG _ AN NOT ATION _ TARGET _ WITH _ USE _ SITE _ TARGET . on ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry , Ġactual Targets . default Targets . first OrNull ()?. description Ġ?: Ġ" un ident ified Ġtarget ", Ġuse Site Target . render Name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrace . report ( Errors . WRONG _ AN NOT ATION _ TARGET . on ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry , Ġactual Targets . default Targets . first OrNull ()?. description Ġ?: Ġ" un ident ified Ġtarget ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġapplicable Target Set ( entry : ĠK t Annotation Entry , Ġtrace : ĠBinding Trace ): ĠSet < Kotlin Target > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġtrace . get ( Binding Context . AN NOT ATION , Ġentry ) Ġ?: Ġreturn ĠKotlin Target . DEFAULT _ TARGET _ SET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġdescriptor Ġwith Ġerror Ġtype , Ġall Ġtargets Ġare Ġconsidered Ġas Ġpossible ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor . type . isError ) Ġreturn ĠKotlin Target . ALL _ TARGET _ SET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Descriptor Ġ= ĠType Utils . getClass Descriptor ( descriptor . type ) Ġ?: Ġreturn ĠKotlin Target . DEFAULT _ TARGET _ SET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapplicable Target Set ( class Descriptor ) Ġ?: ĠKotlin Target . DEFAULT _ TARGET _ SET ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġfun Ġapplicable Target Set ( descriptor : ĠAnnotation Descriptor ): ĠSet < Kotlin Target > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Descriptor Ġ= Ġdescriptor . type . constructor . declaration Descriptor Ġas ? ĠClass Descriptor Ġ?: Ġreturn Ġempty Set () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapplicable Target Set ( class Descriptor ) Ġ?: ĠKotlin Target . DEFAULT _ TARGET _ SET ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġapplicable Target Set ( class Descriptor : ĠClass Descriptor ): ĠSet < Kotlin Target >? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Entry Descriptor Ġ= Ġclass Descriptor . annotations . find Annotation ( Kotlin Built Ins . FQ _ NAMES . target ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Arguments Ġ= Ġtarget Entry Descriptor . all Value Arguments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Argument Ġ= Ġvalue Arguments . entries . first OrNull ()?. value Ġas ? ĠArray Value Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue Argument . value . filter Is Instance < EnumValue >(). map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Target . value OrNull ( it . value . name . asString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Declaration Site Actual Target List ( annotated : ĠK t Element , Ġdescriptor : ĠClass Descriptor ?, Ġtrace : ĠBinding Trace ): ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList < Kotlin Target > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Actual Target List ( annotated , Ġdescriptor , Ġtrace ). default Targets ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠDeclaration Descriptor ?. has Backing Field ( binding Trace : ĠBinding Trace ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ( this Ġas ? ĠProperty Descriptor )?. let Ġ{ Ġbinding Trace . get ( Binding Context . BACK ING _ FIELD _ REQUIRED , Ġit ) Ġ} Ġ?: Ġfalse ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Actual Target List ( annotated : ĠK t Element , Ġdescriptor : ĠDeclaration Descriptor ?, Ġtrace : ĠBinding Trace ): ĠTarget List Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( annotated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Or Object Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( descriptor Ġas ? ĠClass Descriptor )?. let Ġ{ ĠTarget List ( Kotlin Target . class Actual Targets ( it )) Ġ} Ġ?: ĠTarget Lists . T _ CLAS SI FIER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Dest ruct uring Declaration Entry Ġ-> ĠTarget Lists . T _ LOCAL _ VARIABLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Property Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( annotated . is Local ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTarget Lists . T _ LOCAL _ VARIABLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( annotated . parent Ġis ĠK t Class Or Object Ġ|| Ġannotated . parent Ġis ĠK t Class Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTarget Lists . T _ MEMBER _ PROPERTY ( descriptor . has Backing Field ( trace ), Ġannotated . has Delegate ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTarget Lists . T _ TOP _ LEVEL _ PROPERTY ( descriptor . has Backing Field ( trace ), Ġannotated . has Delegate ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Parameter Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( annotated . has Val Or Var ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTarget Lists . T _ VALUE _ PARAMETER _ WITH _ VAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTarget Lists . T _ VALUE _ PARAMETER _ WITHOUT _ VAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Constructor < *> Ġ-> ĠTarget Lists . T _ CON STRUCTOR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Function Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Expression Typing Utils . isFunction Expression ( descriptor )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTarget Lists . T _ FUNCTION _ EXPRESSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( annotated . is Local ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTarget Lists . T _ LOCAL _ FUNCTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( annotated . parent Ġis ĠK t Class Or Object Ġ|| Ġannotated . parent Ġis ĠK t Class Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTarget Lists . T _ MEMBER _ FUNCTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTarget Lists . T _ TOP _ LEVEL _ FUNCTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Property Accessor Ġ-> Ġif Ġ( annotated . is Getter ) ĠTarget Lists . T _ PROPERTY _ GET TER Ġelse ĠTarget Lists . T _ PROPERTY _ SET TER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Type Reference Ġ-> ĠTarget Lists . T _ TYPE _ REFERENCE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t File Ġ-> ĠTarget Lists . T _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Type Parameter Ġ-> ĠTarget Lists . T _ TYPE _ PARAMETER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Type Projection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( annotated . projection Kind Ġ== ĠK t Projection Kind . STAR ) ĠTarget Lists . T _ STAR _ PRO JECTION Ġelse ĠTarget Lists . T _ TYPE _ PRO JECTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Anonymous Initializer Ġ-> ĠTarget Lists . T _ INITIAL IZER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Dest ruct uring Declaration Ġ-> ĠTarget Lists . T _ DE STRUCT UR ING _ DECL AR ATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Lambda Expression Ġ-> ĠTarget Lists . T _ FUNCTION _ LITERAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Object Literal Expression Ġ-> ĠTarget Lists . T _ OBJECT _ LITERAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Expression Ġ-> ĠTarget Lists . T _ EXPRESSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTarget Lists . EMPTY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġobject ĠTarget Lists Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ CLAS SI FIER Ġ= Ġtarget List ( CLASS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ LOCAL _ VARIABLE Ġ= Ġtarget List ( LOCAL _ VARIABLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġonly With Use Site Target ( PROPERTY _ SET TER , ĠVALUE _ PARAMETER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ DE STRUCT UR ING _ DECL AR ATION Ġ= Ġtarget List ( DE STRUCT UR ING _ DECL AR ATION ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠTarget List Builder . property Targets ( back ing Field : ĠBoolean , Ġdelegate : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( back ing Field ) Ġextra Targets ( FIELD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delegate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġonly With Use Site Target ( VALUE _ PARAMETER , ĠPROPERTY _ GET TER , ĠPROPERTY _ SET TER , ĠFIELD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġonly With Use Site Target ( VALUE _ PARAMETER , ĠPROPERTY _ GET TER , ĠPROPERTY _ SET TER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠT _ MEMBER _ PROPERTY ( back ing Field : ĠBoolean , Ġdelegate : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget List ( if Ġ( back ing Field ) ĠMEMBER _ PROPERTY _ WITH _ BACK ING _ FIELD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( delegate ) ĠMEMBER _ PROPERTY _ WITH _ DE LEG ATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠMEMBER _ PROPERTY _ WITHOUT _ FIELD _ OR _ DE LEG ATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMEMBER _ PROPERTY , ĠPROPERTY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Targets ( back ing Field , Ġdelegate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠT _ TOP _ LEVEL _ PROPERTY ( back ing Field : ĠBoolean , Ġdelegate : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget List ( if Ġ( back ing Field ) ĠTOP _ LEVEL _ PROPERTY _ WITH _ BACK ING _ FIELD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( delegate ) ĠTOP _ LEVEL _ PROPERTY _ WITH _ DE LEG ATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠTOP _ LEVEL _ PROPERTY _ WITHOUT _ FIELD _ OR _ DE LEG ATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTOP _ LEVEL _ PROPERTY , ĠPROPERTY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Targets ( back ing Field , Ġdelegate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ PROPERTY _ GET TER Ġ= Ġtarget List ( PROPERTY _ GET TER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ PROPERTY _ SET TER Ġ= Ġtarget List ( PROPERTY _ SET TER ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ VALUE _ PARAMETER _ WITHOUT _ VAL Ġ= Ġtarget List ( VALUE _ PARAMETER ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ VALUE _ PARAMETER _ WITH _ VAL Ġ= Ġtarget List ( VALUE _ PARAMETER , ĠPROPERTY , ĠMEMBER _ PROPERTY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextra Targets ( FIELD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġonly With Use Site Target ( PROPERTY _ GET TER , ĠPROPERTY _ SET TER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ FILE Ġ= Ġtarget List ( FILE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ CON STRUCTOR Ġ= Ġtarget List ( CON STRUCTOR ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ LOCAL _ FUNCTION Ġ= Ġtarget List ( LOCAL _ FUNCTION , ĠFUNCTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġonly With Use Site Target ( VALUE _ PARAMETER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ MEMBER _ FUNCTION Ġ= Ġtarget List ( MEMBER _ FUNCTION , ĠFUNCTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġonly With Use Site Target ( VALUE _ PARAMETER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ TOP _ LEVEL _ FUNCTION Ġ= Ġtarget List ( TOP _ LEVEL _ FUNCTION , ĠFUNCTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġonly With Use Site Target ( VALUE _ PARAMETER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ EXPRESSION Ġ= Ġtarget List ( EXPRESSION ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ FUNCTION _ LITERAL Ġ= Ġtarget List ( L AMBDA _ EXPRESSION , ĠFUNCTION , ĠEXPRESS ION ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ FUNCTION _ EXPRESSION Ġ= Ġtarget List ( AN ONY MO US _ FUNCTION , ĠFUNCTION , ĠEXPRESS ION ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ OBJECT _ LITERAL Ġ= Ġtarget List ( OBJECT _ LITERAL , ĠCLASS , ĠEXPRESS ION ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ TYPE _ REFERENCE Ġ= Ġtarget List ( TYPE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġonly With Use Site Target ( VALUE _ PARAMETER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ TYPE _ PARAMETER Ġ= Ġtarget List ( TYPE _ PARAMETER ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ STAR _ PRO JECTION Ġ= Ġtarget List ( STAR _ PRO JECTION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ TYPE _ PRO JECTION Ġ= Ġtarget List ( TYPE _ PRO JECTION ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT _ INITIAL IZER Ġ= Ġtarget List ( INITIAL IZER ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtarget List ( var arg Ġtarget : ĠKotlin Target , Ġother Targets : ĠTarget List Builder . () Ġ-> ĠUnit Ġ= Ġ{} ): ĠTarget List Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠTarget List Builder (* target ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . other Targets () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠEMPTY Ġ= Ġtarget List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġclass ĠTarget List Builder ( var arg Ġval Ġdefault Targets : ĠKotlin Target ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcan Be Subst it uted : ĠList < Kotlin Target > Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġonly With Use Site Target : ĠList < Kotlin Target > Ġ= ĠlistOf () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġextra Targets ( var arg Ġtargets : ĠKotlin Target ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Be Subst it uted Ġ= Ġtargets . toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġonly With Use Site Target ( var arg Ġtargets : ĠKotlin Target ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġonly With Use Site Target Ġ= Ġtargets . toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbuild () Ġ= ĠTarget List ( default Targets . toList (), Ġcan Be Subst it uted , Ġonly With Use Site Target ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġclass ĠTarget List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Targets : ĠList < Kotlin Target >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcan Be Subst it uted : ĠList < Kotlin Target > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġonly With Use Site Target : ĠList < Kotlin Target > Ġ= Ġempty List ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠAdditional Annotation Checker Ġ{ ĊĠĠĠ Ġfun Ġcheck Entries ( entries : ĠList < Kt Annotation Entry >, Ġactual Targets : ĠList < Kotlin Target >, Ġtrace : ĠBinding Trace ) Ċ }