/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 Ġ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 . cache s . track ers Ċ Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Key Ċ import Ġcom . intellij . openapi . util . Modification Tracker Ċ import Ġcom . intellij . openapi . util . Simple Modification Tracker Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . pom . P om Manager Ċ import Ġcom . intellij . pom . P om Model Aspect Ċ import Ġcom . intellij . pom . event . P om Model Event Ċ import Ġcom . intellij . pom . event . P om Model Listener Ċ import Ġcom . intellij . pom . tree . Tree Aspect Ċ import Ġcom . intellij . pom . tree . events . Tree ChangeEvent Ċ import Ġcom . intellij . psi . Psi Directory Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Manager Ċ import Ġcom . intellij . psi . Psi Tree ChangeEvent Ċ import Ġcom . intellij . psi . impl . Psi ManagerImpl Ċ import Ġcom . intellij . psi . impl . Psi Modification Tracker Impl Ċ import Ġcom . intellij . psi . impl . Psi Tree ChangeEvent Impl Ċ import Ġcom . intellij . psi . impl . Psi Tree ChangeEvent Impl . Psi EventType . CHILD _ MOVED Ċ import Ġcom . intellij . psi . impl . Psi Tree ChangeEvent Impl . Psi EventType . PROPERTY _ CHANGED Ċ import Ġcom . intellij . psi . impl . Psi Tree Change Pre processor Ċ import Ġcom . intellij . psi . util . Psi Modification Tracker Ċ import Ġorg . jetbrains . kotlin . idea . Kotlin Language Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . get Top most Parent OfType Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . is Ancestor Ċ Ċ val ĠK OT LIN _ CONSOLE _ KEY Ġ= ĠKey . create < Boolean >(" kotlin . console ") Ċ Ċ /** Ċ Ġ* ĠTested Ġin ĠOut Of Block Modification Test Generated Ċ Ġ*/ Ċ class ĠKotlin Code Block Modification Listener ( ĊĠĠĠ Ġmodification Tracker : ĠPsi Modification Tracker , ĊĠĠĠ Ġproject : ĠProject , ĊĠĠĠ Ġprivate Ġval Ġtree Aspect : ĠTree Aspect Ċ ) Ġ: ĠPsi Tree Change Pre processor Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmodification Tracker Impl Ġ= Ġmodification Tracker Ġas ĠPsi Modification Tracker Impl ĊĊĠĠĠ Ġ@ Suppress (" Un stable Api Usage ") ĊĠĠĠ Ġprivate Ġval Ġis Language Tracker Enabled Ġ= Ġmodification Tracker Impl . is Enable Language Tracker Compat ĊĊĠĠĠ Ġ// ĠB UNCH : Ġ 1 8 3 ĊĠĠĠ Ġ// ĠWhen Ġthere 're Ġwe Ġno Ġper - language Ġtrack ers Ġwe Ġhad Ġto Ġincrement Ġglobal Ġtracker Ġfirst Ġand Ġprocess Ġresult Ġafter ward ĊĠĠĠ Ġprivate Ġval Ġcustom Increment Ġ= Ġif Ġ( is Language Tracker Enabled ) Ġ 0 Ġelse Ġ 1 ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġkotlin Modification Tracker : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġkotlin OutOf Code Block Tracker Impl : ĠSimple Modification Tracker Ġ= Ġif Ġ( is Language Tracker Enabled ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSimple Modification Tracker () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠSimple Modification Tracker () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Modification Count (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmodification Tracker . out Of Code Block Modification Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġkotlin OutOf Code Block Tracker : ĠMod ification Tracker Ġ= Ġkotlin OutOf Code Block Tracker Impl ĊĊĠĠĠ Ġinternal Ġval Ġper Module OutOf Code Block Tracker Updater Ġ= ĠKotlin Module OutOf Code Block Modification Tracker . Updater ( project ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠP om Manager . getModel ( project ) ĊĠĠĠĠĠĠĠ Ġval Ġmessage Bus Connection Ġ= Ġproject . message Bus . connect () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Language Tracker Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Psi Manager . getInstance ( project ) Ġas ĠPsi ManagerImpl ). add Tree Change Pre processor ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmodel . add Model Listener ( object Ġ: ĠP om Model Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Aspect Change Inter esting ( aspect : ĠP om Model Aspect ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaspect Ġ== Ġtree Aspect ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmodel Changed ( event : ĠP om Model Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange Set Ġ= Ġevent . get Change Set ( tree Aspect ) Ġas ĠTree ChangeEvent ? Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkt File Ġ= Ġchange Set . root Element . psi . containing File Ġas ? ĠK t File Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinc File Modification Count ( kt File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanged Elements Ġ= Ġchange Set . changed Elements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġa Ġcode Ġfragment Ġis Ġre parsed , ĠInt ellij Ġdoesn 't Ġdo Ġan ĠAST Ġdiff Ġand Ġcons iders Ġthe Ġentire ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcontents Ġto Ġbe Ġreplaced , Ġwhich Ġis Ġrepresented Ġin Ġa ĠPO M Ġevent Ġas Ġan Ġempty Ġlist Ġof Ġchanged Ġelements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( changed Elements . any Ġ{ Ġget Inside Code Block Modification Scope ( it . psi ) Ġ== Ġnull Ġ} Ġ|| Ġchanged Elements . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Bus Connection . deliver Immediate ly () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( kt File . is Physical Ġ&& Ġ! is Repl Line ( kt File . virtual File )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Language Tracker Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin OutOf Code Block Tracker Impl . inc Modification Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġper Module OutOf Code Block Tracker Updater . on Kotlin Physical File OutOf Block Change ( kt File , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġper Module OutOf Code Block Tracker Updater . on Kotlin Physical File OutOf Block Change ( kt File , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIncrement Ġcounter Ġand Ġprocess Ġchanges Ġin ĠPsi Modification Tracker . Listener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodification Tracker Impl . inc Counter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinc OutOf Block Modification Count ( kt File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Un stable Api Usage ") ĊĠĠĠĠĠĠĠ Ġmessage Bus Connection . subscribe ( Psi Modification Tracker . TOPIC , ĠPsi Modification Tracker . Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Language Tracker Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkotlin Tracker Internal IDE Count Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodification Tracker Impl . for Language ( Kotlin Language . INSTANCE ). modification Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( kotlin Modification Tracker Ġ== Ġkotlin Tracker Internal IDE Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSome Ġupdate Ġthat Ġwe Ġare Ġnot Ġsure Ġis Ġfrom ĠKotlin Ġlanguage , Ġas ĠKotlin Ġlanguage Ġtracker Ġwasn 't Ġchanged ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin OutOf Code Block Tracker Impl . inc Modification Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Modification Tracker Ġ= Ġkotlin Tracker Internal IDE Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġper Module OutOf Code Block Tracker Updater . on Psi Modification Tracker Update ( custom Increment ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtree Changed ( event : ĠPsi Tree ChangeEvent Impl ) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( is Language Tracker Enabled ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! Psi Modification Tracker Impl . can A ffect Psi ( event )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCopy Ġlogic Ġfrom ĠPsi Modification Tracker Impl . tree Changed (). ĠSome Ġout - of - code - block Ġevents Ġare Ġwritten Ġto Ġlanguage Ġmodification ĊĠĠĠĠĠĠĠ Ġ// Ġtracker Ġin ĠPsi Modification Tracker Impl Ġbut Ġdon 't Ġhave Ġcorrespond ent ĠP om Model Event . ĠIncrease Ġkotlin OutOf Code Block Tracker ĊĠĠĠĠĠĠĠ Ġ// Ġmanually Ġif Ġneeded . ĊĠĠĠĠĠĠĠ Ġval Ġout Of Code Block Ġ= Ġwhen Ġ( event . code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPROPERTY _ CHANGED Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . propertyName Ġ=== ĠPsi Tree ChangeEvent . PROP _ UN LOADED _ P SI Ġ|| Ġevent . propertyName Ġ=== ĠPsi Tree ChangeEvent . PROP _ ROOT S ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCH ILD _ MOVED Ġ-> Ġevent . old Parent Ġis ĠPsi Directory Ġ|| Ġevent . new Parent Ġis ĠPsi Directory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġevent . parent Ġis ĠPsi Directory ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( out Of Code Block ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin OutOf Code Block Tracker Impl . inc Modification Count () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Repl Line ( file : ĠVirtual File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile . getUser Data ( K OT LIN _ CONSOLE _ KEY ) Ġ== Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġinc OutOf Block Modification Count ( file : ĠK t File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġfile . getUser Data ( FILE _ OUT _ OF _ BLOCK _ MO DIF ICATION _ COUNT ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . put UserData ( FILE _ OUT _ OF _ BLOCK _ MO DIF ICATION _ COUNT , Ġcount Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġinc File Modification Count ( file : ĠK t File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtracker Ġ= Ġfile . getUser Data ( PER _ FILE _ MO DIF ICATION _ TRACK ER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfile . put UserData If Absent ( PER _ FILE _ MO DIF ICATION _ TRACK ER , ĠSimple Modification Tracker ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . inc Modification Count () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Inside Code Block Modification Scope ( element : ĠPsi Element ): ĠK t Element ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlambda Ġ= Ġelement . get Top most Parent OfType < Kt Lambda Expression >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lambda Ġis ĠK t Lambda Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlambda . get Top most Parent OfType < Kt Super Type Call Entry >() ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Declaration Ġ= ĠK t Psi Util . get Top most Parent Of Types ( element , Ġ* BLOCK _ DECL AR ATION _ TYPES ) Ġas ? ĠK t Declaration Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Kt Psi Util . is Local ( block Declaration )) Ġreturn Ġnull Ġ// Ġshould Ġnot Ġbe Ġlocal Ġdeclaration ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( block Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Named Function Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Declaration . has Block Body ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġblock Declaration . body Expression ?. take If Ġ{ Ġit . is Ancestor ( element ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( block Declaration . has Declared ReturnType ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġblock Declaration . initializer ?. take If Ġ{ Ġit . is Ancestor ( element ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Property Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Declaration . type Reference Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( accessor Ġin Ġblock Declaration . access ors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( accessor . initializer Ġ?: Ġaccessor . body Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġit . is Ancestor ( element ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Script Initializer Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( block Declaration . body Ġas ? ĠK t Call Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . lambda Arguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . last OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get Lambda Expression () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġit . is Ancestor ( element ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Block Declaration ( declaration : ĠK t Declaration ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBLOCK _ DECL AR ATION _ TYPES . any Ġ{ Ġit . is Instance ( declaration ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠBLOCK _ DECL AR ATION _ TYPES Ġ= ĠarrayOf < Class < out ĠK t Declaration >>( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK t Property :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK t Named Function :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK t Script Initializer :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( project : ĠProject ): ĠKotlin Code Block Modification Listener Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . getComponent ( Kotlin Code Block Modification Listener :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠPER _ FILE _ MO DIF ICATION _ TRACK ER Ġ= ĠKey < Simple Modification Tracker >(" FILE _ OUT _ OF _ BLOCK _ MO DIF ICATION _ COUNT ") Ċ Ċ val ĠK t File . per File Modification Tracker : ĠMod ification Tracker ĊĠĠĠ Ġget () Ġ= Ġput UserData If Absent ( PER _ FILE _ MO DIF ICATION _ TRACK ER , ĠSimple Modification Tracker ()) Ċ Ċ private Ġval ĠFILE _ OUT _ OF _ BLOCK _ MO DIF ICATION _ COUNT Ġ= ĠKey < Long >(" FILE _ OUT _ OF _ BLOCK _ MO DIF ICATION _ COUNT ") Ċ Ċ val ĠK t File . out Of Block Modification Count : ĠLong ĊĠĠĠ Ġget () Ġ= Ġget UserData ( FILE _ OUT _ OF _ BLOCK _ MO DIF ICATION _ COUNT ) Ġ?: Ġ 0 ĊĊ