/* Ċ Ġ* Ġ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 . completion . handlers Ċ Ċ import Ġcom . intellij . code Insight . Auto Popup Controller Ċ import Ġcom . intellij . code Insight . completion . Insert Handler Ċ import Ġcom . intellij . code Insight . completion . Insertion Context Ċ import Ġcom . intellij . code Insight . lookup . Lookup Ċ import Ġcom . intellij . code Insight . lookup . Lookup Element Ċ import Ġcom . intellij . openapi . editor . Document Ċ import Ġcom . intellij . psi . Psi Document Manager Ċ import Ġorg . jetbrains . kotlin . idea . completion . KEEP _ OLD _ ARGUMENT _ LIST _ ON _ TAB _ KEY Ċ import Ġorg . jetbrains . kotlin . idea . completion . smart . Smart Completion Ċ import Ġorg . jetbrains . kotlin . idea . completion . try Get Offset Ċ Ċ class ĠWith Tail Insert Handler ( val Ġtail Text : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspace Before : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspace After : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoverwrite Text : ĠBoolean Ġ= Ġtrue ) Ġ: ĠInsert Handler < Lookup Element > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġhandle Insert ( context : ĠInsert ion Context , Ġitem : ĠLookup Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitem . handle Insert ( context ) ĊĠĠĠĠĠĠĠ Ġpost Handle Insert ( context , Ġitem ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpost Handle Insert ( context : ĠInsert ion Context , Ġitem : ĠLookup Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcompletion Char Ġ= Ġcontext . completion Char ĊĠĠĠĠĠĠĠ Ġif Ġ( completion Char Ġ== Ġtail Text . single OrNull () Ġ|| Ġ( space After Ġ&& Ġcompletion Char Ġ== Ġ' Ġ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . set Add Completion Char ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// TODO : Ġwhat Ġif Ġcompletion Ġchar Ġis Ġdifferent ? ĊĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġcontext . document ĊĠĠĠĠĠĠĠ ĠPsi Document Manager . getInstance ( context . project ). do Post p oned Operations And Un block Document ( document ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġtail Offset Ġ= Ġcontext . tail Offset ĊĠĠĠĠĠĠĠ Ġif Ġ( completion Char Ġ== ĠLookup . REPLACE _ SELECT _ CHAR Ġ&& Ġitem . getUser Data ( KEEP _ OLD _ ARGUMENT _ LIST _ ON _ TAB _ KEY ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . offset Map . try Get Offset ( Smart Completion . OLD _ ARGUMENT S _ REPLACE MENT _ OFFSET ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġtail Offset Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmove Caret Ġ= Ġcontext . editor . caret Model . offset Ġ== Ġtail Offset ĊĊĠĠĠĠĠĠĠ Ġ// TODO : Ġanalyze Ġparent hesis Ġbalance Ġto Ġdecide Ġwhether Ġto Ġreplace Ġor Ġnot ĊĠĠĠĠĠĠĠ Ġvar Ġinsert Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( overwrite Text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġtail Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tail Text Ġ!= Ġ" Ġ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġdocument . chars Sequence . skip Spaces And Line Break s ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Overwrite Char ( document , Ġoffset )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ+= Ġtail Text . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtail Offset Ġ= Ġoffset ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( space After Ġ&& Ġdocument . chars Sequence . is Char At ( offset , Ġ' Ġ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . delete String ( offset , Ġoffset Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġtext To Insert Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( insert ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext To Insert Ġ= Ġtail Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( space Before ) Ġtext To Insert Ġ= Ġ" Ġ" Ġ+ Ġtext To Insert ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( space After ) Ġtext To Insert Ġ+= Ġ" Ġ" ĊĊĠĠĠĠĠĠĠ Ġdocument . insert String ( tail Offset , Ġtext To Insert ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( move Caret ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . editor . caret Model . moveTo Offset ( tail Offset Ġ+ Ġtext To Insert . length ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tail Text Ġ== Ġ", ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Popup Controller . getInstance ( context . project )?. auto Popup Parameter Info ( context . editor , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshould Overwrite Char ( document : ĠDocument , Ġoffset : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! document . is Text At ( offset , Ġtail Text )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( tail Text Ġ== Ġ" Ġ" Ġ&& Ġdocument . chars Sequence . is Char At ( offset Ġ+ Ġ 1 , Ġ'} ')) Ġreturn Ġfalse Ġ// Ġdo Ġnot Ġoverwrite Ġlast Ġspace Ġbefore Ġ' }' ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠCOM MA Ġ= ĠWith Tail Insert Handler (",", Ġspace Before Ġ= Ġfalse , Ġspace After Ġ= Ġtrue Ġ/* TODO : Ġuse Ġcode Ġstyle Ġoption */) ĊĠĠĠĠĠĠĠ Ġval ĠRP AREN TH Ġ= ĠWith Tail Insert Handler (" )", Ġspace Before Ġ= Ġfalse , Ġspace After Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval ĠR BRACK ET Ġ= ĠWith Tail Insert Handler (" ]", Ġspace Before Ġ= Ġfalse , Ġspace After Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval ĠR BRACE Ġ= ĠWith Tail Insert Handler (" }", Ġspace Before Ġ= Ġtrue , Ġspace After Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval ĠELSE Ġ= ĠWith Tail Insert Handler (" else ", Ġspace Before Ġ= Ġtrue , Ġspace After Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval ĠE Q Ġ= ĠWith Tail Insert Handler (" =", Ġspace Before Ġ= Ġtrue , Ġspace After Ġ= Ġtrue ) Ġ/* TODO : Ġuse Ġcode Ġstyle Ġoptions */ ĊĠĠĠĠĠĠĠ Ġval ĠSPACE Ġ= ĠWith Tail Insert Handler (" Ġ", Ġspace Before Ġ= Ġfalse , Ġspace After Ġ= Ġfalse , Ġoverwrite Text Ġ= Ġtrue ) ĊĠĠĠ Ġ} Ċ } Ċ