package Ġcom . amazon . ion . plugin . intellij . editor . typed Ċ Ċ import Ġcom . amazon . ion . plugin . intellij . psi . Ion File Ċ import Ġcom . amazon . ion . plugin . intellij . psi . Ion Types . LOB _ END Ċ import Ġcom . amazon . ion . plugin . intellij . psi . Ion Types . R BRACE Ċ import Ġcom . amazon . ion . plugin . intellij . psi . Ion Types . R BRACK ET Ċ import Ġcom . amazon . ion . plugin . intellij . psi . Ion Types . RP AREN Ċ import Ġcom . intellij . code Insight . highlight ing . Brace Matching Util Ċ import Ġcom . intellij . openapi . diagnostic . debug Ċ import Ġcom . intellij . openapi . diagnostic . logger Ċ import Ġcom . intellij . openapi . editor . ex . Editor Ex Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . TokenType . BAD _ CHARACTER Ċ Ċ private Ġval Ġlogger Ġ= Ġlogger < Process Pa ired Br aces Type EventHandler >() Ċ Ċ /** Ċ Ġ* ĠEvent ĠHandler Ġwhich Ġprocesses Ġa Ġmissed Ġuse Ġcase Ġof Ġpaired Ġbr aces . Ċ Ġ* Ċ Ġ* ĠTypically Ġall Ġpaired Ġbr aces Ġare Ġhandled Ġthrough Ġ{@ see ĠIon Code Brace Matcher }, Ġhowever Ċ Ġ* Ġthere Ġis Ġa Ġsituation Ġwhere Ġthe Ġordered Ġof Ġbr ace Ġpairs Ġreturned Ġfrom ĠIon Code Brace Matcher Ġcauses Ċ Ġ* Ġcertain Ġbr ace Ġpairs Ġfrom Ġbeing Ġmissed Ġdue Ġto Ġthe Ġbr ace Ġmatching Ġalgorithm Ġmatching Ġbr aces Ġoutside Ċ Ġ* Ġof Ġthe Ġparent Ġbr aces Ġlike Ġthis : Ċ Ġ* Ċ Ġ* ĠBug : Ċ Ġ* Ġ{ Ċ Ġ* ĠĠĠĠĠ Ġlist : Ġ[ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ{ Ġ<- Ġstart Ġbr ace Ċ Ġ* ĠĠĠĠĠ Ġ] Ċ Ġ* Ġ} Ġ<- Ġend Ġbr ace Ċ Ġ* Ċ Ġ* ĠThis Ġbr ace Ġmatcher Ġwill Ġlook Ġto Ġsee Ġif Ġthe Ġcurrently Ġtyped Ġbr ace Ġhas Ġa Ġmatch Ġwithin Ġany Ġparent Ġbr aces . Ċ Ġ*/ Ċ class ĠProcess Pa ired Br aces Type EventHandler Ġ: ĠIon Type EventHandler Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcharacter Typed ( character : ĠChar , Ġproject : ĠProject , Ġeditor : ĠEditor Ex , Ġfile : ĠIon File ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthe Ġcharacter Ġis Ġan Ġopen Ġbr ace , Ġif Ġnot Ġthen Ġshort Ġcircuit . ĊĠĠĠĠĠĠĠ Ġval Ġbr ace Pair Ġ= ĠBr ace Pairs . first OrNull Ġ{ Ġcharacter . toString () Ġ== Ġit . left Ġ} Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġan Ġiterator Ġat Ġthe Ġoffset Ġand Ġcheck Ġif Ġwe Ġrun Ġinto Ġa Ġclosing Ġbr ace . ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġeditor . create Iterator At Typed () ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġeditor . caret Model . offset ĊĊĠĠĠĠĠĠĠ Ġ// ĠResolve Ġthe Ġbr ace Ġpair Ġmatcher Ġand Ġfind Ġthe Ġopposite Ġbr ace Ġtype . ĊĠĠĠĠĠĠĠ Ġval Ġbr ace Pair Matcher Ġ= ĠBr ace Matching Util . get Brace Matcher ( file . fileType , Ġiterator ) ĊĠĠĠĠĠĠĠ Ġval Ġopposite Brace Type Ġ= Ġbr ace Pair Matcher . get Opp osite Brace TokenType ( iterator . token Type ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Close Bracket Or Bad Character Ġ= Ġiterator . sequence (). first Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClose Brace Elements . contains ( it ) Ġ|| Ġit Ġ== ĠBAD _ CHARACTER ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthere Ġis Ġa Ġbad Ġcharacter Ġbefore Ġwe Ġreach Ġthe Ġcorrect Ġclosing Ġbracket ĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġthe Ġbr ace Ġpair . ĊĠĠĠĠĠĠĠ Ġif Ġ( first Close Bracket Or Bad Character Ġ!= Ġopposite Brace Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Type EventHandler Ġ'$ character ': ĠAdding Ġclosing Ġbracket Ġ'${ brace Pair . right } '" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . document . insert String ( offset , Ġbr ace Pair . right ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠBr ace Pair ( val Ġleft : ĠString , Ġval Ġright : ĠString ) Ċ Ċ private Ġval ĠBr ace Pairs Ġ= ĠlistOf ( ĊĠĠĠ ĠBr ace Pair (" (", Ġ") "), ĊĠĠĠ ĠBr ace Pair ("{ ", Ġ"} "), ĊĠĠĠ ĠBr ace Pair ("[ ", Ġ"] ") Ċ ) Ċ Ċ private Ġval ĠClose Brace Elements Ġ= Ġset Of ( R BRACE , ĠRP AREN , ĠR BRACK ET , ĠLO B _ END ) Ċ