/* Ċ Ġ* Ġ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 . idea . util Ċ Ċ import Ġorg . jetbrains . kotlin . descriptors .*; Ċ import Ġorg . jetbrains . kotlin . psi .*; Ċ import Ġorg . jetbrains . kotlin . renderer . Descriptor Renderer ; Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . get Resolution Facade Ċ import Ġorg . jetbrains . kotlin . analyzer . analyze In Context Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . get Cal lee Expression If Any Ċ import Ġjava . util . Linked HashSet Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . get Import able Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . Resolution Facade Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . get Strict Parent OfType Ċ import Ġjava . util . ArrayList Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . parents Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . get Resolved Call Ċ import Ġorg . jetbrains . kotlin . resolve . calls . model . Resolved Call Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . re ceiv ers . Receiver Value Ċ import Ġorg . jetbrains . kotlin . resolve . calls . tasks . Explicit Receiver Kind Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . re ceiv ers . Expression Receiver Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . re ceiv ers . This Receiver Ċ import Ġorg . jetbrains . kotlin . idea . util . Short en References . Options Ċ import Ġorg . jetbrains . kotlin . idea . imports .* Ċ import Ġorg . jetbrains . kotlin . resolve .* Ċ import Ġcom . intellij . psi .* Ċ Ċ public Ġclass ĠShort en References ( val Ġoptions : Ġ( Jet Element ) Ġ-> ĠOptions Ġ= Ġ{ ĠOptions . DEFAULT Ġ}) Ġ{ ĊĠĠĠ Ġpublic Ġdata Ġclass ĠOptions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremove This Labels : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremove This : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclass Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠDEFAULT Ġ= ĠOptions () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT Ġ= ĠShort en References () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠDeclaration Descriptor . asString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠDescriptor Renderer . FQ _ NAMES _ IN _ TYPES . render ( this ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠJet Reference Expression . targets ( context : ĠBinding Context ) Ġ= Ġget Import able Targets ( context ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmay Import ( descriptor : ĠDeclaration Descriptor , Ġfile : ĠJet File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdescriptor . can Be Referenced Via Import () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& ĠImport Insert Helper . getInstance ( file . getProject ()). may Import By Code Style ( descriptor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġprocess ( element : ĠJet Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocess ( listOf ( element )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġprocess ( elements : ĠIterable < Jet Element >) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocess ( elements , Ġ{ ĠFilter Result . PROCESS Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġprocess ( file : ĠJet File , Ġstart Offset : ĠInt , Ġend Offset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdocument Manager Ġ= ĠPsi Document Manager . getInstance ( file . getProject ()) ĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġdocument Manager . getDocument ( file ) !! ĊĠĠĠĠĠĠĠ Ġif Ġ(! document Manager . is Commit ted ( document )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Document Ġshould Ġbe Ġcommitted Ġto Ġshort en Ġreferences Ġin Ġrange ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrange Marker Ġ= Ġdocument . create Range Marker ( start Offset , Ġend Offset ) ĊĠĠĠĠĠĠĠ Ġrange Marker . set G reedy To Left ( true ) ĊĠĠĠĠĠĠĠ Ġrange Marker . set G reedy To Right ( true ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess ( listOf ( file ), Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range Marker . isValid ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĠText Range ( range Marker . getStart Offset (), Ġrange Marker . getEnd Offset ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Range Ġ= Ġelement . getText Range () !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . contains ( element Range ) Ġ-> ĠFilter Result . PROCESS ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . intersect s ( element Range ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġqualified Ġcall Ġexpression Ġallow Ġto Ġshort en Ġonly Ġthe Ġpart Ġwithout Ġparent hesis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal lee Expression Ġ= Ġ(( element Ġas ? ĠJet Dot Qualified Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get Selector Expression () Ġas ? ĠJet Call Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get Cal lee Expression () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callee Expression Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Without Parent hesis Ġ= ĠText Range ( element Range . getStart Offset (), Ġcal lee Expression . getText Range () !!. getEnd Offset ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range . contains ( range Without Parent hesis )) ĠFilter Result . PROCESS Ġelse ĠFilter Result . GO _ INS IDE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFilter Result . GO _ INS IDE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠFilter Result . SKIP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFilter Result . SKIP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrange Marker . dispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠFilter Result Ġ{ ĊĠĠĠĠĠĠĠ ĠSKIP ĊĠĠĠĠĠĠĠ ĠGO _ INS IDE ĊĠĠĠĠĠĠĠ ĠPROCESS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess ( elements : ĠIterable < Jet Element >, Ġelement Filter : Ġ( Psi Element ) Ġ-> ĠFilter Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( file , Ġfile Elements ) Ġin Ġelements . groupBy Ġ{ Ġelement Ġ-> Ġelement . get Containing Jet File () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshort en References In File ( file , Ġfile Elements , Ġelement Filter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshort en References In File ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠJet File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelements : ĠList < Jet Element >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Filter : Ġ( Psi Element ) Ġ-> ĠFilter Result ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// TODO : Ġthat 's Ġnot Ġcorrect Ġsince Ġwe Ġhave Ġoptions ! ĊĠĠĠĠĠĠĠ Ġval Ġelements ToUse Ġ= Ġdrop Nested Elements ( elements ) ĊĊĠĠĠĠĠĠĠ Ġval Ġimport Inser ter Ġ= ĠImport Inser ter ( file ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfailed To Import Descriptors Ġ= ĠLinked HashSet < Declaration Descriptor >() ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVisitor Ġorder Ġis Ġimportant Ġhere Ġso Ġthat Ġen closing Ġelements Ġare Ġnot Ġshort ened Ġbefore Ġtheir Ġchildren Ġare , Ġe . g . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtest . foo ( this @ A ) Ġ-> Ġfoo ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisitor s : ĠList < Short ening Visitor <* >> Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShort en Types Visitor ( file , Ġelement Filter , Ġfailed To Import Descriptors ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShort en This Expressions Visitor ( file , Ġelement Filter , Ġfailed To Import Descriptors ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShort en Qualified Expressions Visitor ( file , Ġelement Filter , Ġfailed To Import Descriptors ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemove Explicit Companion Object Reference Visitor ( file , Ġelement Filter , Ġfailed To Import Descriptors ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptors To Import Ġ= Ġvisitor s . flatMap Ġ{ Ġanalyze References ( elements ToUse , Ġit ) Ġ}. toSet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor s . forEach Ġ{ Ġit . short en Elements ( elements ToUse ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġany Change Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( descriptor Ġin Ġdescriptors To Import ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( descriptor Ġ! in Ġfailed To Import Descriptors ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( import Inser ter . optimize Imports ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany Change Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġimport Inser ter . add Import ( descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= ĠImport Insert Helper . Import Descriptor Result . AL READY _ IMPORTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany Change Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== ĠImport Insert Helper . Import Descriptor Result . FAIL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailed To Import Descriptors . add ( descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! any Change ) Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdrop Nested Elements ( elements : ĠList < Jet Element >): ĠLinked HashSet < Jet Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelement Set Ġ= Ġelements . toSet () ĊĠĠĠĠĠĠĠ Ġval Ġnew Elements Ġ= ĠLinked HashSet < Jet Element >( element Set . size ()) ĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelement Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! element . parents ( with It self Ġ= Ġfalse ). any Ġ{ Ġit Ġin Ġelement Set Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Elements . add ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Elements ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanalyze References ( elements : ĠIterable < Jet Element >, Ġvisitor : ĠShort ening Visitor < *> ): ĠSet < Declaration Descriptor > Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . options Ġ= Ġoptions ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept ( visitor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvisitor . get Descriptors To Import () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġabstract Ġclass ĠShort ening Visitor < T Ġ: ĠJet Element >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprotected Ġval Ġfile : ĠJet File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprotected Ġval Ġelement Filter : Ġ( Psi Element ) Ġ-> ĠFilter Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprotected Ġval Ġfailed To Import Descriptors : ĠSet < Declaration Descriptor > ĊĠĠĠ Ġ) Ġ: ĠJet Visitor Void () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġoptions : ĠOptions Ġ= ĠOptions . DEFAULT ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġelements To Short en Ġ= ĠArrayList < T >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdescriptors To Import Ġ= ĠLinked HashSet < Declaration Descriptor >() ĊĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġresolution Facade : ĠResolution Facade Ġ= Ġfile . get Resolution Facade () ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġprocess Qualified Element ( element : ĠT , Ġtarget : ĠDeclaration Descriptor , Ġcan Short en Now : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( can Short en Now ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Element To Short en ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( target Ġ! in Ġfailed To Import Descriptors Ġ&& Ġmay Import ( target , Ġfile )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptors To Import . add ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqualifier ( element ). accept ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġadd Element To Short en ( element : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelements To Short en . add ( element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġabstract Ġfun Ġqualifier ( element : ĠT ): ĠJet Element ĊĊĠĠĠĠĠĠĠ Ġprotected Ġabstract Ġfun Ġshort en Element ( element : ĠT ): ĠJet Element ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠPsi Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Filter ( element ) Ġ!= ĠFilter Result . SKIP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġshort en Elements ( element Set ToUpdate : ĠMutable Set < Jet Element >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements To Short en ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! element . isValid ()) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Element Ġ= Ġshort en Element ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġin Ġelement Set ToUpdate Ġ&& Ġnew Element Ġ!= Ġelement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Set ToUpdate . remove ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Set ToUpdate . add ( new Element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġget Descriptors To Import (): ĠSet < Declaration Descriptor > Ġ= Ġdescriptors To Import ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠShort en Types Visitor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠJet File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Filter : Ġ( Psi Element ) Ġ-> ĠFilter Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfailed To Import Descriptors : ĠSet < Declaration Descriptor > ĊĠĠĠ Ġ) Ġ: ĠShort ening Visitor < Jet User Type >( file , Ġelement Filter , Ġfailed To Import Descriptors ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit User Type ( user Type : ĠJet User Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter Result Ġ= Ġelement Filter ( user Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter Result Ġ== ĠFilter Result . SKIP ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Type . getType ArgumentList ()?. accept ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter Result Ġ== ĠFilter Result . PROCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Type ( user Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Type . get Qualifier ()?. accept ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprocess Type ( type : ĠJet User Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . get Qualifier () Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference Expression Ġ= Ġtype . getReference Expression () Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Context Ġ= Ġresolution Facade . analyze ( reference Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġreference Expression . targets ( binding Context ). single OrNull () Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Reference Ġ= Ġtype . get Strict Parent OfType < Jet Type Reference >() !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġbinding Context [ Binding Context . TYPE _ RESOL UTION _ SCOPE , Ġtype Reference ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġtarget . getName () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget ByName Ġ= Ġif Ġ( target Ġis ĠClass ifier Descriptor ) Ġscope . getClass ifier ( name ) Ġelse Ġscope . get Package ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcan Short en Now Ġ= Ġtarget ByName ?. asString () Ġ== Ġtarget . asString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Qualified Element ( type , Ġtarget , Ġcan Short en Now ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġqualifier ( element : ĠJet User Type ) Ġ= Ġelement . get Qualifier () !! ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshort en Element ( element : ĠJet User Type ): ĠJet Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . delete Qualifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġabstract Ġclass ĠQual ified Expression Short ening Visitor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠJet File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Filter : Ġ( Psi Element ) Ġ-> ĠFilter Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfailed To Import Descriptors : ĠSet < Declaration Descriptor > ĊĠĠĠ Ġ) Ġ: ĠShort ening Visitor < Jet Dot Qualified Expression >( file , Ġelement Filter , Ġfailed To Import Descriptors ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Dot Qualified Expression ( expression : ĠJet Dot Qualified Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter Result Ġ= Ġelement Filter ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter Result Ġ== ĠFilter Result . SKIP ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . get Selector Expression ()?. accept Children ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter Result Ġ== ĠFilter Result . PROCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( process ( expression )) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . get Receiver Expression (). accept ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġprocess ( qualified Expression : ĠJet Dot Qualified Expression ): ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġqualifier ( element : ĠJet Dot Qualified Expression ) Ġ= Ġelement . get Receiver Expression () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠShort en Qualified Expressions Visitor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠJet File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Filter : Ġ( Psi Element ) Ġ-> ĠFilter Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfailed To Import Descriptors : ĠSet < Declaration Descriptor > ĊĠĠĠ Ġ) Ġ: ĠQual ified Expression Short ening Visitor ( file , Ġelement Filter , Ġfailed To Import Descriptors ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprocess ( qualified Expression : ĠJet Dot Qualified Expression ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Context Ġ= Ġresolution Facade . analyze ( qualified Expression ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Ġ= Ġqualified Expression . get Receiver Expression () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Ġis ĠJet This Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! options . remove This ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( binding Context [ Binding Context . QUAL IFIER , Ġreceiver ] Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Psi Tree Util . getParent OfType ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqualified Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class < Jet Import Directive >(), Ġjava Class < Jet Package Directive >()) Ġ!= Ġnull ) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselector Ġ= Ġqualified Expression . get Selector Expression () Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal lee Ġ= Ġselector . get Cal lee Expression If Any () Ġas ? ĠJet Reference Expression Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġcal lee . targets ( binding Context ). single OrNull () Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġbinding Context [ Binding Context . RESOL UTION _ SCOPE , Ġqualified Expression ] Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselector Copy Ġ= Ġselector . copy () Ġas ĠJet Reference Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Context Ġ= Ġselector Copy . analyze In Context ( scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtargets When Short Ġ= Ġ( selector Copy . get Cal lee Expression If Any () Ġas ĠJet Reference Expression ). targets ( new Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtargets Match Ġ= Ġtargets When Short . single OrNull ()?. asString () Ġ== Ġtarget . asString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( receiver Ġis ĠJet This Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! targets Match ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Call Ġ= Ġselector . get Resolved Call ( binding Context ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Call Ġ= Ġselector Copy . get Resolved Call ( new Context ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Kind Ġ= Ġoriginal Call . get Explicit Receiver Kind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Receiver Ġ= Ġwhen Ġ( receiver Kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExplicit Receiver Kind . BOTH _ RECE IVER S , ĠExplicit Receiver Kind . EXTENSION _ RECE IVER Ġ-> Ġnew Call . getExtension Receiver () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExplicit Receiver Kind . DISPATCH _ RECE IVER Ġ-> Ġnew Call . get Dispatch Receiver () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġas ? ĠThis Receiver Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Target Ġ= Ġreceiver . getInstance Reference (). targets ( binding Context ). single OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Receiver . get Declaration Descriptor (). asString () Ġ!= Ġthis Target ?. asString ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! targets Match Ġ&& Ġtargets When Short . any Ġ{ Ġit Ġ! is ĠClass Descriptor Ġ&& Ġit Ġ! is ĠPackage View Descriptor Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit Ġmakes Ġno Ġsense Ġto Ġinsert Ġimport Ġwhen Ġthere Ġis Ġa Ġconflict Ġwith Ġfunction , Ġproperty Ġetc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Qualified Element ( qualified Expression , Ġtarget , Ġtargets Match ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshort en Element ( element : ĠJet Dot Qualified Expression ): ĠJet Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement . replace ( element . get Selector Expression () !! ) Ġas ĠJet Element ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠShort en This Expressions Visitor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠJet File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Filter : Ġ( Psi Element ) Ġ-> ĠFilter Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfailed To Import Descriptors : ĠSet < Declaration Descriptor > ĊĠĠĠ Ġ) Ġ: ĠShort ening Visitor < Jet This Expression >( file , Ġelement Filter , Ġfailed To Import Descriptors ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsimple This Ġ= ĠJet Psi Factory ( file ). create Expression (" this ") Ġas ĠJet This Expression ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprocess ( this Expression : ĠJet This Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! options . remove This Labels Ġ|| Ġthis Expression . getTarget Label () Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Context Ġ= Ġresolution Facade . analyze ( this Expression ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Before Ġ= Ġthis Expression . getInstance Reference (). targets ( binding Context ). single OrNull () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġbinding Context [ Binding Context . RESOL UTION _ SCOPE , Ġthis Expression ] Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Context Ġ= Ġsimple This . analyze In Context ( scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget After Ġ= Ġsimple This . getInstance Reference (). targets ( new Context ). single OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Before Ġ== Ġtarget After ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Element To Short en ( this Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit This Expression ( expression : ĠJet This Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Filter ( expression ) Ġ== ĠFilter Result . PROCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġqualifier ( element : ĠJet This Expression ): ĠJet Element Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" Qualifier Ġrequested : Ġ${ Jet Psi Util . getElement Text WithContext ( element )} ") ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshort en Element ( element : ĠJet This Expression ): ĠJet Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement . replace ( simple This ) Ġas ĠJet Element ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠRemove Explicit Companion Object Reference Visitor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠJet File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Filter : Ġ( Psi Element ) Ġ-> ĠFilter Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfailed To Import Descriptors : ĠSet < Declaration Descriptor > ĊĠĠĠ Ġ) Ġ: ĠQual ified Expression Short ening Visitor ( file , Ġelement Filter , Ġfailed To Import Descriptors ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠJet Expression . single Target ( context : ĠBinding Context ): ĠDeclaration Descriptor ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( get Cal lee Expression If Any () Ġas ? ĠJet Reference Expression )?. targets ( context )?. single OrNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprocess ( qualified Expression : ĠJet Dot Qualified Expression ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Context Ġ= Ġresolution Facade . analyze ( qualified Expression ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Ġ= Ġqualified Expression . get Receiver Expression () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Psi Tree Util . getParent OfType ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqualified Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class < Jet Import Directive >(), Ġjava Class < Jet Package Directive >()) Ġ!= Ġnull ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Target Ġ= Ġreceiver . single Target ( binding Context ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( receiver Target Ġ! is ĠClass Descriptor ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselector Expression Ġ= Ġqualified Expression . get Selector Expression () Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselector Target Ġ= Ġselector Expression . single Target ( binding Context ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( receiver Target . get Companion Object Descriptor () Ġ!= Ġselector Target ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselectors Selector Ġ= Ġ( qualified Expression . getParent () Ġas ? ĠJet Dot Qualified Expression )?. get Selector Expression () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selectors Selector Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Element To Short en ( qualified Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselectors Selector Target Ġ= Ġselectors Selector . single Target ( binding Context ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selectors Selector Target Ġis ĠClass Descriptor ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Element To Short en ( qualified Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshort en Element ( element : ĠJet Dot Qualified Expression ): ĠJet Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement . replace ( element . get Receiver Expression ()) Ġas ĠJet Element ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġthis Ġclass Ġis Ġneeded Ġto Ġoptimize Ġimports Ġonly Ġwhen Ġwe Ġactually Ġinsert Ġany Ġimport Ġ( optimization ) ĊĠĠĠ Ġprivate Ġclass ĠImport Inser ter ( val Ġfile : ĠJet File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġoptimize Imports Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhelper Ġ= ĠImport Insert Helper . getInstance ( file . getProject ()) ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Import ( target : ĠDeclaration Descriptor ): ĠImport Insert Helper . Import Descriptor Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhelper . import Descriptor ( file , Ġtarget ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġoptimize Imports (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! optimize Imports ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptimize Imports Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhelper . optimize Imports On The Fly ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ