/* Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ċ Ġ* Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . rust . cargo . util Ċ Ċ import Ġcom . intellij . code Insight . completion . Code Completion Handler Base Ċ import Ġcom . intellij . code Insight . completion . Completion ResultSet Ċ import Ġcom . intellij . code Insight . completion . Completion Type Ċ import Ġcom . intellij . code Insight . lookup . Char Filter Ċ import Ġcom . intellij . code Insight . lookup . Lookup Element Ċ import Ġcom . intellij . code Insight . lookup . Lookup Element Builder Ċ import Ġcom . intellij . util . TextField Completion Provider Ċ import Ġcom . intellij . util . execution . Parameters List Util Ċ import Ġorg . rust . cargo . icons . Cargo Icons Ċ import Ġorg . rust . cargo . project . model . Cargo Project Ċ import Ġorg . rust . cargo . project . model . Cargo Projects Service Ċ import Ġorg . rust . cargo . project . workspace . Cargo Workspace Ċ import Ġorg . rust . cargo . project . workspace . Package Origin Ċ import Ġorg . rust . lang . core . completion . add Suffix Ċ import Ġorg . rust . lang . core . completion . with Priority Ċ Ċ class ĠC argo Command Completion Provider ( ĊĠĠĠ Ġprivate Ġval Ġprojects : ĠC argo Projects Service , ĊĠĠĠ Ġprivate Ġval Ġworkspace Getter : Ġ() Ġ-> ĠC argo Workspace ? Ċ ) Ġ: ĠTextField Completion Provider () Ġ{ ĊĊĠĠĠ Ġconstructor ( projects : ĠC argo Projects Service , Ġworkspace : ĠC argo Workspace ?) Ġ: Ġthis ( projects , Ġ{ Ġworkspace Ġ}) ĊĊĠĠĠ Ġoverride Ġfun Ġget Prefix ( current Text Prefix : ĠString ): ĠString Ġ= Ġsplit Context Prefix ( current Text Prefix ). second ĊĊĠĠĠ Ġoverride Ġfun Ġaccept Char ( c : ĠChar ): ĠChar Filter . Result ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'-') ĠChar Filter . Result . ADD _ TO _ PREFIX Ġelse Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġadd Completion Variants ( text : ĠString , Ġoffset : ĠInt , Ġprefix : ĠString , Ġresult : ĠCompletion ResultSet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( ctx , Ġ_) Ġ= Ġsplit Context Prefix ( text ) ĊĠĠĠĠĠĠĠ Ġresult . addAll Elements ( complete ( ctx )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġpublic Ġfor Ġtesting ĊĠĠĠ Ġfun Ġsplit Context Prefix ( text : ĠString ): ĠPair < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlexer Ġ= ĠParameters List Lexer ( text ) ĊĠĠĠĠĠĠĠ Ġvar Ġcontext End Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( lexer . nextToken ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lexer . token End Ġ== Ġtext . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtext . substring ( 0 , Ġcontext End ) Ġto Ġlexer . current Token ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext End Ġ= Ġlexer . token End ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtext . substring ( 0 , Ġcontext End ) Ġto Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġpublic Ġfor Ġtesting ĊĠĠĠ Ġfun Ġcomplete ( context : ĠString ): ĠList < Lookup Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= ĠParameters List Util . parse ( context ) ĊĠĠĠĠĠĠĠ Ġif Ġ(" -- " Ġin Ġargs ) Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġif Ġ( args . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCOMMON _ COMMAND S . map Ġ{ Ġit . lookup Element Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= ĠCOMMON _ COMMAND S . find Ġ{ Ġit . name Ġ== Ġargs . first OrNull () Ġ} Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġarg Comp leter Ġ= Ġcmd . options . find Ġ{ Ġit . long Ġ== Ġargs . last OrNull () Ġ} ?. arg Comp leter ĊĠĠĠĠĠĠĠ Ġif Ġ( arg Comp leter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġarg Comp leter ( Context ( projects . all Projects , Ġworkspace Getter (), Ġargs )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcmd . options ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . long Ġ! in Ġargs Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . lookup Element Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠCmd ( ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġinit Options : ĠOpt Builder . () Ġ-> ĠUnit Ġ= Ġ{} Ċ ) Ġ{ ĊĠĠĠ Ġval Ġoptions Ġ= ĠOpt Builder (). apply ( init Options ). result ĊĠĠĠ Ġval Ġlookup Element : ĠLookup Element Ġ= ĊĠĠĠĠĠĠĠ ĠLookup Element Builder . create ( name ). with Insert Handler Ġ{ Ġctx , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . add Suffix (" Ġ") ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠContext ( ĊĠĠĠ Ġval Ġprojects : ĠCollection < Cargo Project >, ĊĠĠĠ Ġval Ġcurrent Workspace : ĠC argo Workspace ?, ĊĠĠĠ Ġval Ġcommand Line Prefix : ĠList < String > Ċ ) Ċ Ċ private Ġtype alias ĠArg Comp leter Ġ= Ġ( Context ) Ġ-> ĠList < Lookup Element > Ċ Ċ private Ġclass ĠOpt ( ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġarg Comp leter : ĠArg Comp leter ? Ġ= Ġnull Ċ Ċ ) Ġ{ ĊĠĠĠ Ġval Ġlong Ġget () Ġ= Ġ"-- $ name " ĊĊĠĠĠ Ġval Ġlookup Element : ĠLookup Element Ġ= ĊĠĠĠĠĠĠĠ ĠLookup Element Builder . create ( long ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Insert Handler Ġ{ Ġctx , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg Comp leter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . add Suffix (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . set Later Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCode Completion Handler Base ( Completion Type . BASIC ). invoke Completion ( ctx . project , Ġctx . editor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠC argo Project . lookup Element : ĠLookup Element ĊĠĠĠ Ġget () Ġ= ĊĠĠĠĠĠĠĠ ĠLookup Element Builder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create ( manifest . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Icon ( Cargo Icons . ICON ) Ċ Ċ private Ġval ĠC argo Workspace . Target . lookup Element : ĠLookup Element Ġget () Ġ= ĠLookup Element Builder . create ( name ) Ċ private Ġval ĠC argo Workspace . Package . lookup Element : ĠLookup Element ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpriority Ġ= Ġif Ġ( origin Ġ== ĠPackage Origin . WORK SPACE ) Ġ 1 . 0 Ġelse Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġreturn ĠLookup Element Builder . create ( name ). with Priority ( priority ) ĊĠĠĠ Ġ} Ċ Ċ private Ġclass ĠOpt Builder ( ĊĠĠĠ Ġval Ġresult : ĠMutable List < Opt > Ġ= Ġmutable ListOf () Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġcompile Options () Ġ{ ĊĠĠĠĠĠĠĠ Ġrelease () ĊĠĠĠĠĠĠĠ Ġjobs () ĊĠĠĠĠĠĠĠ Ġfeatures () ĊĠĠĠĠĠĠĠ Ġverbose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrelease () Ġ= Ġflag (" release ") ĊĠĠĠ Ġfun Ġjobs () Ġ= Ġflag (" jobs ") ĊĠĠĠ Ġfun Ġfeatures () Ġ{ ĊĠĠĠĠĠĠĠ Ġflag (" features ") ĊĠĠĠĠĠĠĠ Ġflag (" all - features ") ĊĠĠĠĠĠĠĠ Ġflag (" no - default - features ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtarget Comp leter ( kind : ĠC argo Workspace . Target Kind ): ĠArg Comp leter Ġ= Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠ Ġctx . current Workspace ?. packages . or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . origin Ġ== ĠPackage Origin . WORK SPACE Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . targets . filter Ġ{ Ġit . kind Ġ== Ġkind Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . lookup Element Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtarget Bin () Ġ= Ġopt (" bin ", Ġtarget Comp leter ( Cargo Workspace . Target Kind . BIN )) ĊĊĠĠĠ Ġfun Ġtarget Example () Ġ= Ġopt (" example ", Ġtarget Comp leter ( Cargo Workspace . Target Kind . EXAMPLE )) ĊĠĠĠ Ġfun Ġtarget Test () Ġ= Ġopt (" test ", Ġtarget Comp leter ( Cargo Workspace . Target Kind . TEST )) ĊĠĠĠ Ġfun Ġtarget Bench () Ġ= Ġopt (" bench ", Ġtarget Comp leter ( Cargo Workspace . Target Kind . BENCH )) ĊĊĠĠĠ Ġfun Ġtarget All () Ġ{ ĊĠĠĠĠĠĠĠ Ġflag (" lib ") ĊĊĠĠĠĠĠĠĠ Ġtarget Bin () ĊĠĠĠĠĠĠĠ Ġflag (" bins ") ĊĊĠĠĠĠĠĠĠ Ġtarget Example () ĊĠĠĠĠĠĠĠ Ġflag (" examples ") ĊĊĠĠĠĠĠĠĠ Ġtarget Test () ĊĠĠĠĠĠĠĠ Ġflag (" tests ") ĊĊĠĠĠĠĠĠĠ Ġtarget Bench () ĊĠĠĠĠĠĠĠ Ġflag (" bench ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpkg () Ġ= Ġopt (" package ") Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠ Ġctx . current Workspace ?. packages . or Empty (). map Ġ{ Ġit . lookup Element Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpkg All () Ġ{ ĊĠĠĠĠĠĠĠ Ġpkg () ĊĠĠĠĠĠĠĠ Ġflag (" all ") ĊĠĠĠĠĠĠĠ Ġflag (" exclude ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmanifest Path () Ġ{ ĊĠĠĠĠĠĠĠ Ġopt (" manifest - path ") Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . projects . map Ġ{ Ġit . lookup Element Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġverbose () Ġ{ ĊĠĠĠĠĠĠĠ Ġflag (" verbose ") ĊĠĠĠĠĠĠĠ Ġflag (" quiet ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġflag ( long : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Ġ+= ĠOpt ( long ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopt ( long : ĠString , Ġarg Comp leter : ĠArg Comp leter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Ġ+= ĠOpt ( long , Ġarg Comp leter ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġoptions ( f : ĠOpt Builder . () Ġ-> ĠUnit ): ĠList < Opt > Ġ= ĠOpt Builder (). apply ( f ). result Ċ Ċ private Ġval ĠCOMMON _ COMMAND S Ġ= ĠlistOf ( ĊĠĠĠ ĠCmd (" run ") Ġ{ ĊĠĠĠĠĠĠĠ Ġcompile Options () ĊĠĠĠĠĠĠĠ Ġtarget Bin () ĊĠĠĠĠĠĠĠ Ġtarget Example () ĊĠĠĠĠĠĠĠ Ġpkg () ĊĠĠĠĠĠĠĠ Ġmanifest Path () ĊĠĠĠ Ġ}, ĊĊĠĠĠ ĠCmd (" test ") Ġ{ ĊĠĠĠĠĠĠĠ Ġcompile Options () ĊĠĠĠĠĠĠĠ Ġtarget All () ĊĠĠĠĠĠĠĠ Ġflag (" doc ") ĊĠĠĠĠĠĠĠ Ġpkg All () ĊĠĠĠĠĠĠĠ Ġmanifest Path () ĊĠĠĠĠĠĠĠ Ġflag (" no - run ") ĊĠĠĠĠĠĠĠ Ġflag (" no - fail - fast ") ĊĠĠĠ Ġ}, ĊĊĠĠĠ ĠCmd (" check ") Ġ{ ĊĠĠĠĠĠĠĠ Ġcompile Options () Ġ// Ġyeah , Ġyou Ġcan Ġcheck Ġwith Ġ`-- release ` ĊĠĠĠĠĠĠĠ Ġtarget All () ĊĠĠĠĠĠĠĠ Ġpkg All () ĊĠĠĠĠĠĠĠ Ġmanifest Path () ĊĠĠĠ Ġ}, ĊĊĠĠĠ ĠCmd (" build ") Ġ{ ĊĠĠĠĠĠĠĠ Ġcompile Options () ĊĠĠĠĠĠĠĠ Ġtarget All () ĊĠĠĠĠĠĠĠ Ġpkg All () ĊĠĠĠĠĠĠĠ Ġmanifest Path () ĊĠĠĠ Ġ}, ĊĊĠĠĠ ĠCmd (" update ") Ġ{ ĊĠĠĠĠĠĠĠ Ġpkg () ĊĠĠĠĠĠĠĠ Ġmanifest Path () ĊĠĠĠĠĠĠĠ Ġflag (" ag gressive ") ĊĠĠĠĠĠĠĠ Ġflag (" prec ise ") ĊĠĠĠ Ġ}, ĊĊĠĠĠ ĠCmd (" bench ") Ġ{ ĊĠĠĠĠĠĠĠ Ġcompile Options () ĊĠĠĠĠĠĠĠ Ġtarget All () ĊĠĠĠĠĠĠĠ Ġpkg All () ĊĠĠĠĠĠĠĠ Ġmanifest Path () ĊĠĠĠ Ġ}, ĊĊĠĠĠ ĠCmd (" doc ") Ġ{ ĊĠĠĠĠĠĠĠ Ġcompile Options () ĊĠĠĠĠĠĠĠ Ġpkg All () ĊĠĠĠĠĠĠĠ Ġmanifest Path () ĊĠĠĠĠĠĠĠ Ġtarget All () ĊĠĠĠ Ġ}, ĊĊĠĠĠ ĠCmd (" publish ") Ġ{ ĊĠĠĠĠĠĠĠ Ġflag (" index ") ĊĠĠĠĠĠĠĠ Ġflag (" token ") ĊĠĠĠĠĠĠĠ Ġflag (" no - verify ") ĊĠĠĠĠĠĠĠ Ġflag (" allow - dirty ") ĊĠĠĠĠĠĠĠ Ġflag (" jobs ") ĊĠĠĠĠĠĠĠ Ġflag (" dry - run ") ĊĠĠĠĠĠĠĠ Ġmanifest Path () ĊĠĠĠ Ġ}, ĊĊĠĠĠ ĠCmd (" clean ") Ġ{ ĊĠĠĠĠĠĠĠ Ġcompile Options () ĊĠĠĠĠĠĠĠ Ġpkg () ĊĠĠĠĠĠĠĠ Ġmanifest Path () ĊĠĠĠ Ġ}, ĊĊĠĠĠ ĠCmd (" search ") Ġ{ ĊĠĠĠĠĠĠĠ Ġflag (" index ") ĊĠĠĠĠĠĠĠ Ġflag (" limit ") ĊĠĠĠ Ġ}, ĊĊĠĠĠ ĠCmd (" install ") Ġ{ ĊĠĠĠĠĠĠĠ Ġcompile Options () ĊĠĠĠĠĠĠĠ Ġtarget All () ĊĠĠĠĠĠĠĠ Ġflag (" root ") ĊĠĠĠĠĠĠĠ Ġflag (" force ") ĊĠĠĠ Ġ} Ċ ) Ċ Ċ // ĠCopy Ġof Ġcom . intellij . openapi . external System . service . execution . cmd . Parameters List Lexer , Ċ // Ġwhich Ġis Ġnot Ġpresent Ġin Ġall ĠIDE s . Ċ class ĠParameters List Lexer ( private Ġval Ġmy Text : ĠString ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġmy Token Start Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġindex Ġ= Ġ 0 ĊĊĠĠĠ Ġval Ġtoken End : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( my Token Start Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġindex ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcurrent Token : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmy Text . substring ( my Token Start , Ġindex ) ĊĊĠĠĠ Ġfun Ġnext Token (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġindex ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġmy Text . length Ġ&& ĠCharacter . is Whitespace ( my Text [ i ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġmy Text . length ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġmy Token Start Ġ= Ġi ĊĠĠĠĠĠĠĠ Ġvar ĠisIn Quote Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġmy Text [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isIn Quote Ġ&& ĠCharacter . is Whitespace ( a )) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ== Ġ'\\ ' Ġ&& Ġi Ġ+ Ġ 1 Ġ< Ġmy Text . length Ġ&& Ġmy Text [ i Ġ+ Ġ 1 ] Ġ== Ġ'"' Ġ-> Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ== Ġ'"' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisIn Quote Ġ= Ġ! isIn Quote ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( i Ġ< Ġmy Text . length ) ĊĊĠĠĠĠĠĠĠ Ġindex Ġ= Ġi ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ