/* Ċ Ġ* Ġ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 . contracts . context ual . parsing Ċ Ċ import Ġorg . jetbrains . kotlin . contracts . context ual . Context ual Effect System Ċ import Ġorg . jetbrains . kotlin . contracts . context ual . resolution .* Ċ import Ġorg . jetbrains . kotlin . contracts . description . Effect Declaration Ċ import Ġorg . jetbrains . kotlin . contracts . description . expressions . Function Reference Ċ import Ġorg . jetbrains . kotlin . contracts . parsing .* Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . psi . Kt Call Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Named Function Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . parents Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . get Resolved Call Ċ Ċ // Ġrequires Ġ/ Ġprovides Ġwithout Ġblock : ĠK Function < *> Ġparsing Ċ internal Ġclass ĠPsi Fact Parser ( ĊĠĠĠ Ġcollector : ĠContract Parsing Diagnostics Collector , ĊĠĠĠ Ġcall Context : ĠContract Call Context , ĊĠĠĠ Ġdispatcher : ĠPsi Contract Parser Dispatcher Ċ ) Ġ: ĠAbstract Psi Effect Parser ( collector , Ġcall Context , Ġdispatcher ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġtry Parse Effect ( expression : ĠK t Expression ): ĠCollection < Effect Declaration > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expression Ġ! is ĠK t Call Expression ) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġbinding Context Ġ= Ġcall Context . binding Context ĊĊĠĠĠĠĠĠĠ Ġval Ġresolved Call Ġ= Ġexpression . get Resolved Call ( binding Context ) Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġresolved Call . result ing Descriptor ĊĊĠĠĠĠĠĠĠ Ġval Ġargument Expression Ġ= Ġresolved Call . first Argument As Expression OrNull () Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġowner Function Ġ= Ġexpression . parents . first OrNull Ġ{ Ġit Ġis ĠK t Named Function Ġ} Ġas ? ĠK t Named Function Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġowner Descriptor Ġ= Ġbinding Context [ Binding Context . FUNCTION , Ġowner Function ] Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= ĠFunction Reference ( owner Descriptor ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Name Ġ= Ġdescriptor . name ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! descriptor . is Provider Or Verifier Or Clean er Descriptor ()) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġ( provider , Ġverifier , Ġcleaner ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Declarations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontract Parser Dispatcher ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġdeclarations Ġ= Ġmutable ListOf < Effect Declaration ?> () ĊĠĠĠĠĠĠĠ Ġdeclarations Ġ+= Ġprovider ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Provider Effect Declaration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . references , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdeclarations Ġ+= Ġverifier ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Verifier Effect Declaration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . references , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdeclarations Ġ+= Ġcleaner ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Clean er Effect Declaration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . references , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdeclarations . filter NotNull () ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġrequires Ġ/ Ġprovides Ġwith Ġblock : ĠK Function < *> Ġparsing Ċ internal Ġclass ĠPsi Lambda Fact Parser ( ĊĠĠĠ Ġcollector : ĠContract Parsing Diagnostics Collector , ĊĠĠĠ Ġcall Context : ĠContract Call Context , ĊĠĠĠ Ġdispatcher : ĠPsi Contract Parser Dispatcher Ċ ) Ġ: ĠAbstract Psi Effect Parser ( collector , Ġcall Context , Ġdispatcher ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġtry Parse Effect ( expression : ĠK t Expression ): ĠCollection < Effect Declaration > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expression Ġ! is ĠK t Call Expression ) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġbinding Context Ġ= Ġcall Context . binding Context ĊĊĠĠĠĠĠĠĠ Ġval Ġresolved Call Ġ= Ġexpression . get Resolved Call ( binding Context ) Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġresolved Call . result ing Descriptor ĊĊĠĠĠĠĠĠĠ Ġval Ġowner Expression Ġ= Ġresolved Call . argument As Expression OrNull ( 0 ) Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġcontract Parser Dispatcher . parse Variable ( owner Expression ) Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġargument Expression Ġ= Ġresolved Call . argument As Expression OrNull ( 1 ) Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Name Ġ= Ġdescriptor . name ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! descriptor . is Provider Or Verifier Or Clean er Descriptor ()) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġ( provider , Ġverifier , Ġcleaner ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Declarations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontract Parser Dispatcher ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġdeclarations Ġ= Ġmutable ListOf < Effect Declaration ?> () ĊĠĠĠĠĠĠĠ Ġdeclarations Ġ+= Ġprovider ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLambda Context Provider Effect Declaration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . references , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdeclarations Ġ+= Ġverifier ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLambda Context Verifier Effect Declaration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . references , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdeclarations Ġ+= Ġcleaner ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLambda Context Clean er Effect Declaration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . references , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdeclarations . filter NotNull () ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġfun Ġextract Declarations ( ĊĠĠĠ Ġexpression : ĠK t Expression , ĊĠĠĠ Ġname : ĠName , ĊĠĠĠ Ġbinding Context : ĠBinding Context , ĊĠĠĠ Ġdispatcher : ĠPsi Contract Parser Dispatcher Ċ ): ĠContext Declarations ? Ġ= ĊĠĠĠ ĠContext ual Effect System . get Parsers ( expression . project , Ġbinding Context , Ġdispatcher ) ĊĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . extract Declarations OrNull ( expression , Ġname ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠ Ġ. first OrNull ()