/* Ċ Ġ* Ġ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 . parameter Info . custom Ċ Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . editor . Document Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . editor . Editor Factory Ċ import Ġcom . intellij . openapi . editor . Range Marker Ċ import Ġcom . intellij . openapi . editor . event . Editor Factory Event Ċ import Ġcom . intellij . openapi . editor . event . Editor Factory Listener Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . util . containers . Container Util Ċ import Ġorg . jetbrains . kotlin . idea . core . util . range Ċ import Ġorg . jetbrains . kotlin . idea . util . application . run Read Action Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . end Offset Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ class ĠKotlin Code Hints Model ( val Ġproject : ĠProject ) Ġ: ĠEditor Factory Listener Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( project : ĠProject ): ĠKotlin Code Hints Model Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . getComponent ( Kotlin Code Hints Model :: class . java ) Ġ?: Ġerror (" Component Ġ` Kotlin Code Hints Model ` Ġis Ġexpected Ġto Ġbe Ġregistered ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠDocument Extension Info Model ( val Ġdocument : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġline End Markers Ġ= ĠConcurrent HashMap < Range Marker , ĠString >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġmark EndOf Line ( line End Offset : ĠInt , Ġhint : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Line Marker Ġ= Ġdocument . create Range Marker ( line End Offset , Ġline End Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Line Marker . is G reedy To Right Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġline End Markers [ end Line Marker ] Ġ= Ġhint ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Extension At Offset ( offset : ĠInt ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrun Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProt ect Ġoperations Ġworking Ġwith Ġthe Ġdocument Ġoffsets ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline End Markers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. entries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġ( marker , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Range Ġ= Ġmarker . range ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text Range Ġ== Ġnull Ġ|| Ġ!( text Range . start Offset Ġ<= Ġoffset Ġ&& Ġoffset Ġ<= Ġtext Range . end Offset )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ first OrNull Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġmarker . document ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas NewLine Ġ= Ġdocument . getText ( text Range ). contains ('\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has NewLine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Range . end Offset Ġ== Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNew Ġline Ġmay Ġappear Ġafter Ġsession Ġof Ġfast Ġtyping Ġwith Ġone Ġor Ġseveral Ġenter Ġhitting . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan 't Ġbelieve Ġstart Offset Ġtoo Ġbecause Ġtyping Ġsession Ġmay Ġhad Ġstarted Ġwith ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtyping Ġadding Ġseveral Ġchars Ġat Ġthe Ġoriginal Ġline . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal LineNumber Ġ= Ġdocument . get LineNumber ( text Range . start Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Original Line End Ġ= Ġdocument . getLine End Offset ( original LineNumber ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Original Line End Ġ== Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġline End Markers . keys () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( marker Ġin Ġkeys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarker . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdocument Models Ġ= ĊĠĠĠĠĠĠĠ ĠContainer Util . create Concurrent Soft Map < Document , ĠDocument Extension Info Model >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġeditor Factory Ġ= ĠEditor Factory . getInstance () ĊĠĠĠĠĠĠĠ Ġeditor Factory . add Editor Factory Listener ( this , Ġproject ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġeditor Released ( event : ĠEditor Factory Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠPass Ġfor Ġother Ġeditor Ġwith Ġthe Ġsame Ġdocument Ġif Ġpresent Ġshould Ġre - add Ġneeded Ġhints ĊĠĠĠĠĠĠĠ Ġremove All ( event . editor . document ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Extension Info At Offset ( editor : ĠEditor ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Extension Info ( editor . document , Ġeditor . caret Model . offset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Extension Info ( document : ĠDocument , Ġoffset : ĠInt ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdocument Models [ document ]?. getExtension At Offset ( offset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove All ( document : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdocument Models . remove ( document )?. dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( document : ĠDocument , Ġactual Hints : ĠMap < Psi Element , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( actual Hints . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove All ( document ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġupdated Model Ġ= Ġrun Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠDocument Extension Info Model ( document ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( element , Ġhint ) Ġin Ġactual Hints ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlineNumber Ġ= Ġdocument . get LineNumber ( element . end Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline End Offset Ġ= Ġdocument . getLine End Offset ( line Number ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . mark EndOf Line ( line End Offset , Ġhint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdocument Models . put ( document , Ġupdated Model )?. dispose () ĊĠĠĠ Ġ} Ċ }