/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠU ber ĠTechnologies , ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 Ġmot if . intellij . validation . ui Ċ Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Dis poser Ċ import Ġcom . intellij . psi . Psi Class Ċ import Ġcom . intellij . psi . Psi ClassType Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Element Factory Ċ import Ġmot if . intellij . validation . index . Scope Index Ċ import Ġmot if . intellij . validation . ir . Int elli J Type Ċ import Ġmot if . intellij . validation . ui . error . ErrorHandler Ċ import Ġmot if . intellij . validation . ui . error . Invalid Scope Method Handler Ċ import Ġmot if . intellij . validation . ui . error . No Op ErrorHandler Ċ import Ġmot if . models . errors .* Ċ import Ġmot if . models . graph . Graph Ċ import Ġmot if . models . graph . Graph Factory Ċ import Ġmot if . models . java . Ir Type Ċ Ċ object ĠGraph StateManager Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlisteners : ĠMutable List <( Graph State ) Ġ-> ĠUnit > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġvar Ġstate : ĠGraph State Ġ= ĠGraph State ( Graph ( map Of (), ĠlistOf (), Ġnull ), ĠlistOf ()) ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġrefresh ( project : ĠProject ): ĠGraph State Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscope Classes : ĠList < Psi Class > Ġ= ĠScope Index . getInstance (). get Scope Classes ( project ) ĊĠĠĠĠĠĠĠ Ġval Ġscope Annotated Types : ĠSet < Ir Type > Ġ= Ġscope Classes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġpsi Class Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi ClassType : ĠPsi ClassType Ġ= ĠPsi Element Factory . SERVICE . getInstance ( project ). create Type ( psi Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntelliJ Type ( project , Ġpsi ClassType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠGraph Factory . create ( scope Annotated Types ) ĊĠĠĠĠĠĠĠ Ġval Ġerrors : ĠList < Graph Error > Ġ= Ġgraph . errors . flatMap Ġ{ Ġget Handler ( it ). handle ( graph , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠGraph State ( graph , Ġerrors ) ĊĠĠĠĠĠĠĠ ĠsetState ( state ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġadd Listener ( dis posable : ĠDis posable , Ġlistener : Ġ( Graph State ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDis poser . register ( dis posable , ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . remove ( listener ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ( state ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetState ( state : ĠGraph State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . state Ġ= Ġstate ĊĊĠĠĠĠĠĠĠ Ġval Ġlisteners Copy Ġ= Ġlisteners . toList () ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners Copy . forEach Ġ{ Ġlistener Ġ-> Ġlistener ( state ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠMot if Error > Ġget Handler ( error : ĠT ) Ġ: ĠError Handler < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNe cessary Ġto Ġfix Ġex haustive Ġwhen Ġcheck . Ġhttps :// yout rack . jetbrains . net / issue / KT - 2 8 3 9 1 ĊĠĠĠĠĠĠĠ Ġval Ġmot if Error : ĠMot if Error Ġ= Ġerror ĊĠĠĠĠĠĠĠ Ġval Ġhandler : ĠError Handler < *> Ġ= Ġwhen Ġ( mot if Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMissing Dependencies Error Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠScope Cycle Error Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDependency Cycle Error Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDuplicate Factory Methods Error Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNot Ex posed Error Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNot Ex posed Dynamic Error Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠScope Must Be An Interface Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInvalid Scope Method Ġ-> ĠInvalid Scope Method Handler () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠObjects Field Found Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠObjects Constructor Found Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVoid Objects Method Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNullable Factory Method Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNullable Dependency Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInvalid Objects Method Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Not Sp readable Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNo Suit able Constructor Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNot Assignable Bind s Method Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVoid Dependencies Method Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDependency Method With Parameters Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMissing Inject Annotation Ġ-> ĠNo Op ErrorHandler . create () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhandler Ġas ĠError Handler < T > ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠGraph State ( val Ġgraph : ĠGraph , Ġval Ġerrors : ĠList < Graph Error >) Ċ Ċ class ĠGraph Error ( val Ġpsi Element : ĠPsi Element ?, Ġval Ġmessage : ĠString )