package Ġorg . move . ide . typing Ċ Ċ import Ġcom . intellij . code Insight . highlight ing . Pa ired Brace Matcher Adapter Ċ import Ġcom . intellij . lang . Brace Pair Ċ import Ġcom . intellij . lang . Pa ired Brace Matcher Ċ import Ġcom . intellij . openapi . editor . highlighter . Highlight er Iterator Ċ import Ġcom . intellij . openapi . file Types . FileType Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . TokenType Ċ import Ġcom . intellij . psi . tree . I ElementType Ċ import Ġcom . intellij . psi . tree . Token Set Ċ import Ġorg . move . lang . Move Element Types .* Ċ import Ġorg . move . lang . Move FileType Ċ import Ġorg . move . lang . Move Language Ċ import Ġorg . move . lang . core . MOVE _ COMMENTS Ċ import Ġjava . util .* Ċ Ċ private Ġclass ĠMove Pa ired Brace Matcher Ġ: ĠPa ired Brace Matcher Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Pairs () Ġ= ĠPA IR S ĊĊĠĠĠ Ġoverride Ġfun Ġis Pa ired Br aces Allowed Before Type ( l brace Type : ĠI ElementType , Ġnext : ĠI ElementType ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġnext Ġin ĠInsert Pair Brace Before ĊĊĠĠĠ Ġoverride Ġfun Ġget Code Construct Start ( file : ĠPsi File ?, Ġopening Brace Offset : ĠInt ): ĠInt Ġ= Ġopening Brace Offset ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPA IR S : ĠArray < Brace Pair > Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBr ace Pair ( L _ BRACE , ĠR _ BRACE , Ġtrue Ġ/* Ġstructural Ġ*/ ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBr ace Pair ( L _ PAREN , ĠR _ PAREN , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBr ace Pair ( L _ BRACK , ĠR _ BRACK , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBr ace Pair ( LT , ĠGT , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠInsert Pair Brace Before Ġ= ĠToken Set . or Set ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMOVE _ COMMENTS , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToken Set . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTokenType . WHITE _ SPACE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS EM IC OL ON , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOM MA , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR _ PAREN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR _ BRACK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR _ BRACE , ĠL _ BRACE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ class ĠMove Brace Matcher Ġ: ĠPa ired Brace Matcher Adapter ( Move Pa ired Brace Matcher (), ĠMove Language ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġis L Brace Token ( ĊĠĠĠĠĠĠĠ Ġiterator : ĠHighlight er Iterator , ĊĠĠĠĠĠĠĠ Ġfile Text : ĠCharSequence , ĊĠĠĠĠĠĠĠ ĠfileType : ĠFile Type , ĊĠĠĠ Ġ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġis Brace ( iterator , Ġfile Text , ĠfileType , Ġtrue ) ĊĊĠĠĠ Ġoverride Ġfun Ġis R Brace Token ( ĊĠĠĠĠĠĠĠ Ġiterator : ĠHighlight er Iterator , ĊĠĠĠĠĠĠĠ Ġfile Text : ĠCharSequence , ĊĠĠĠĠĠĠĠ ĠfileType : ĠFile Type , ĊĠĠĠ Ġ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġis Brace ( iterator , Ġfile Text , ĠfileType , Ġfalse ) ĊĊĠĠĠ Ġprivate Ġfun Ġis Brace ( ĊĠĠĠĠĠĠĠ Ġiterator : ĠHighlight er Iterator , ĊĠĠĠĠĠĠĠ Ġfile Text : ĠCharSequence , ĊĠĠĠĠĠĠĠ ĠfileType : ĠFile Type , ĊĠĠĠĠĠĠĠ Ġleft : ĠBoolean , ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( fileType Ġ!= ĠMove FileType ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġfind Pair ( left , Ġiterator , Ġfile Text , ĠfileType ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġbr ace Ġ= Ġpair . left Brace Type ĊĊĠĠĠĠĠĠĠ Ġ// ĠNon Ġangle Ġbracket Ġhandled Ġby Ġ` Rs Base Brace Matcher ` ĊĠĠĠĠĠĠĠ Ġif Ġ(!( brace Ġ== ĠLT Ġ|| Ġbr ace Ġ== ĠGT )) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠHere Ġis Ġthe Ġtricky Ġpart . ĠUn like Ġ` {} `, Ġ` ()` Ġand Ġ` [] `, ĊĠĠĠĠĠĠĠ Ġ// Ġ`< >` Ġdoes Ġnot Ġalways Ġform Ġa Ġbr ace Ġpair Ġbecause Ġof ĊĠĠĠĠĠĠĠ Ġ// Ġcomparison Ġoperators . ĠAnother Ġcomp lication Ġis Ġthat ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġdon 't Ġhave Ġaccess Ġto Ġtree Ġhere , Ġand Ġcan Ġuse Ġonly ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġlex ical Ġstructure . ĠL uck ily , Ġchained Ġcomparisons ĊĠĠĠĠĠĠĠ Ġ// Ġare Ġforbidden Ġin ĠRust . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠSo Ġlet 's Ġrun Ġa Ġstandard Ġstack - based Ġbr ace Ġmatching ĊĠĠĠĠĠĠĠ Ġ// Ġalgorithm Ġwith Ġa Ġtw ist Ġthat Ġwe Ġtry Ġto Ġbail Ġout Ġearly ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġsee Ġsome Ġtoken Ġwhich Ġis Ġunlikely Ġto Ġbe Ġseen ĊĠĠĠĠĠĠĠ Ġ// Ġbetween Ġa Ġpair Ġof Ġ`< >`. ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbr ace Stack Ġ= ĠArray Deque < I ElementType >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbr ace Stack . add Last ( brace ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprev Is And Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left ) Ġiterator . advance () Ġelse Ġiterator . ret reat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iterator . at End ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġmirror If Reverse ( iterator . token Type , Ġ! left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġin ĠTYPE _ PARAMETER _ TOKEN S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ`& ` Ġ`& ` Ġis Ġgl ued Ġto Ġ` && ` Ġonly Ġin Ġthe Ġparser , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġneed Ġto Ġhandle Ġthem Ġspec ially Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Is And Ġ&& Ġcurrent Ġ== ĠAND ) Ġreturn Ġfalse Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Is And Ġ= Ġcurrent Ġ== ĠAND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġco Ġ= Ġco Brace ( current ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġin ĠOPEN _ BR ACES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbr ace Stack . add Last ( current ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( brace Stack . poll Last () Ġ!= Ġco ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( brace Stack . isEmpty ()) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( count -- Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left ) Ġiterator . ret reat () Ġelse Ġiterator . advance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmirror If Reverse ( b : ĠI ElementType , Ġreverse : ĠBoolean ): ĠI ElementType Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! reverse ) Ġreturn Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġco Brace ( b ) Ġ?: Ġb ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġco Brace ( b : ĠI ElementType ): ĠI ElementType ? Ġ= Ġwhen Ġ( b ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLT Ġ-> ĠGT ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGT Ġ-> ĠLT ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠL _ PAREN Ġ-> ĠR _ PAREN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR _ PAREN Ġ-> ĠL _ PAREN ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠL _ BRACE Ġ-> ĠR _ BRACE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR _ BRACE Ġ-> ĠL _ BRACE ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠL _ BRACK Ġ-> ĠR _ BRACK ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR _ BRACK Ġ-> ĠL _ BRACK ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠOPEN _ BR ACES Ġ= ĠToken Set . create ( LT , ĠL _ PAREN , ĠL _ BRACE , ĠL _ BRACK ) ĊĊĠĠĠĠĠĠĠ Ġval ĠTYPE _ PARAMETER _ TOKEN S Ġ= ĠToken Set . or Set ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMOVE _ COMMENTS , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToken Set . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTokenType . WHITE _ SPACE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIDENT IFIER , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DER SCORE , ĠS ELF , ĠSUP ER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOM MA , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS EM IC OL ON , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQU OTE _ IDENTIFIER , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPL US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOL ON , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE Q , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOL ON _ COL ON , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINTEGER _ LITERAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOPY ABLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRESOURCE , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAND , ĠMUT , ĠCONST , ĠMUL , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEX CL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ