/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 7 Ġ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 Ġcom . intellij . stats . validation Ċ Ċ import Ġcom . intellij . stats . completion . Log Event Visitor Ċ import Ġcom . intellij . stats . completion . events .* Ċ import Ġorg . jetbrains . annotations . Test Only Ċ Ċ class ĠCompletion Validation State ( event : ĠCompletion Started Event ) Ġ: ĠLog Event Visitor () Ġ{ ĊĠĠĠ Ġval Ġall Completion Item Ids : ĠMutable List < Int > Ġ= Ġevent . new Completion List Items . map Ġ{ Ġit . id Ġ}. to Mutable List () ĊĊĠĠĠ Ġvar Ġcurrent Position : ĠInt Ġ= Ġevent . current Position ĊĠĠĠ Ġvar Ġcompletion List : ĠList < Int > Ġ= Ġevent . completion List Ids ĊĠĠĠ Ġvar Ġcurrent Id : ĠInt Ġ= Ġget Safe Current Id ( completion List , Ġcurrent Position ) ĊĊĠĠĠ Ġprivate Ġvar ĠisValid Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġis Finished Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar ĠerrorMessage Ġ= Ġ"" ĊĊĠĠĠ Ġprivate Ġvar Ġevents Ġ= Ġmutable ListOf < Log Event >( event ) ĊĊĠĠĠ Ġprivate Ġfun Ġupdate State ( next Event : ĠLookup State Log Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Position Ġ= Ġnext Event . current Position ĊĠĠĠĠĠĠĠ Ġall Completion Item Ids . addAll ( next Event . new Completion List Items . map Ġ{ Ġit . id Ġ}) ĊĠĠĠĠĠĠĠ Ġif Ġ( next Event . completion List Ids . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompletion List Ġ= Ġnext Event . completion List Ids ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Id Ġ= Ġget Safe Current Id ( completion List , Ġcurrent Position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Safe Current Id ( completion List : ĠList < Int >, Ġposition : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( completion List . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( position Ġ< Ġcompletion List . size Ġ&& Ġposition Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompletion List [ position ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( errorMessage . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġ" completion Ġlist Ġsize : Ġ${ completion List . size }, Ġrequested Ġposition : Ġ$ position " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisValid Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġaccept ( next Event : ĠLog Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevents . add ( next Event ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġ" activity Ġafter Ġcompletion Ġfinish Ġsession " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisValid Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Event . accept ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( event : ĠDown Pressed Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbefore Down Pressed Position Ġ= Ġcurrent Position ĊĠĠĠĠĠĠĠ Ġupdate State ( event ) ĊĠĠĠĠĠĠĠ Ġif Ġ( completion List . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġis Correct Position Ġ= Ġ( before Down Pressed Position Ġ+ Ġ 1 ) Ġ% Ġcompletion List . size Ġ== Ġcurrent Position ĊĠĠĠĠĠĠĠ Ġupdate Valid ( is Correct Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" position Ġafter Ġup Ġpressed Ġevent Ġincorrect , Ġbefore Ġevent Ġ$ before Down Pressed Position , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" now Ġ$ current Position , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" elements Ġin Ġlist Ġ${ completion List . size }" ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Valid ( value : ĠBoolean , Ġerror : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwas Valid Before Ġ= ĠisValid ĊĠĠĠĠĠĠĠ ĠisValid Ġ= ĠisValid Ġ&& Ġvalue ĊĠĠĠĠĠĠĠ Ġif Ġ( was Valid Before Ġ&& Ġ! isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġerror ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( event : ĠUp Pressed Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbefore Up Pressed Position Ġ= Ġcurrent Position ĊĠĠĠĠĠĠĠ Ġupdate State ( event ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( completion List . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġis Correct Position Ġ= Ġ( completion List . size Ġ+ Ġbefore Up Pressed Position Ġ- Ġ 1 ) Ġ% Ġcompletion List . size Ġ== Ġcurrent Position ĊĠĠĠĠĠĠĠ Ġupdate Valid ( is Correct Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" position Ġafter Ġup Ġpressed Ġevent Ġincorrect , Ġbefore Ġevent Ġ$ before Up Pressed Position , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" now Ġ$ current Position , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" elements Ġin Ġlist Ġ${ completion List . size }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( event : ĠType Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate State ( event ) ĊĠĠĠĠĠĠĠ Ġupdate Valid ( all Completion Item Ids . contains All ( completion List ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Type Event : Ġall Ġelements Ġin Ġcompletion Ġare Ġregistered ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( event : ĠBack space Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate State ( event ) ĊĠĠĠĠĠĠĠ Ġupdate Valid ( all Completion Item Ids . contains All ( completion List ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Back space : Ġsome Ġelements Ġin Ġcompletion Ġlist Ġare Ġnot Ġregistered ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( event : ĠExplicit Select Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselected Id Before Ġ= Ġcurrent Id ĊĠĠĠĠĠĠĠ Ġupdate State ( event ) ĊĊĠĠĠĠĠĠĠ Ġupdate Valid ( selected Id Before Ġ== Ġcurrent Id Ġ&& Ġall Completion Item Ids . find Ġ{ Ġit Ġ== Ġcurrent Id Ġ} Ġ!= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Selected Ġelement Ġwas Ġnot Ġregistered ") ĊĊĠĠĠĠĠĠĠ Ġis Finished Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( event : ĠCompletion Cancelled Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Finished Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( event : ĠTyped Select Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġevent . selected Id ĊĠĠĠĠĠĠĠ Ġupdate Valid ( completion List [ current Position ] Ġ== Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Element Ġselected Ġby Ġtyping Ġis Ġnot Ġthe Ġsame Ġid ") ĊĊĠĠĠĠĠĠĠ Ġis Finished Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġis Session Valid (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠisValid Ġ&& Ġis Finished ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Only ĊĠĠĠ Ġfun Ġis Currently Valid (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠisValid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠerrorMessage (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( isValid Ġ&& Ġ! is Finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Session Ġwas Ġnot Ġfinished " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }