/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . r . console Ċ Ċ import Ġcom . intellij . ide . DataManager Ċ import Ġcom . intellij . openapi . action System . Ide Actions Ċ import Ġcom . intellij . openapi . command . Write Command Action Ċ import Ġcom . intellij . openapi . editor . Document Ċ import Ġcom . intellij . openapi . editor . action System . Editor Action Manager Ċ import Ġcom . intellij . openapi . editor . ex . Editor Ex Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . psi . Psi Document Manager Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . Psi WhiteSpace Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġcom . intellij . psi . util . elementType Ċ import Ġorg . jetbrains . r . parsing . RE lement Types Ċ import Ġorg . jetbrains . r . psi . R Recursive Element Visitor Ċ import Ġorg . jetbrains . r . psi . api . R Call Expression Ċ import Ġorg . jetbrains . r . statistics . R Statistics Ċ Ċ object ĠR Console Enter Handler Ġ{ ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġif Ġthe Ġ[ editor ]' s Ġcontent Ġis Ġnot Ġready ĠENTER Ġwill Ġbe Ġsend Ġto Ġ[ editor ] ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġ[ editor ]' s Ġcontent Ġis Ġready Ġto Ġbe Ġsend Ġto ĠREPL Ġor Ġfalse Ġotherwise ĊĠĠ Ġ*/ ĊĠ Ġfun Ġhandle Enter Pressed ( editor : ĠEditor Ex ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġproject Ġ= Ġeditor . project Ġ?: Ġthrow ĠIllegalArgumentException () ĊĠĠĠ Ġval Ġline Count Ġ= Ġeditor . document . line Count ĊĠĠĠ Ġval Ġcaret Position Ġ= Ġeditor . caret Model . logical Position ĊĊĠĠĠ Ġif Ġ( caret Position . line Ġ!= Ġline Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġeditor . selection Model . remove Selection () ĊĠĠĠ Ġif Ġ( caret Position . line Ġ== Ġline Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġ// Ġwe Ġcan Ġmove Ġcaret Ġif Ġonly Ġit 's Ġon Ġthe Ġlast Ġline Ġof Ġcommand ĊĠĠĠĠĠ Ġval Ġline End Offset Ġ= Ġeditor . document . getLine End Offset ( caret Position . line ) ĊĠĠĠĠĠ Ġeditor . caret Model . moveTo Offset ( line End Offset ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġpsi Mgr Ġ= ĠPsi Document Manager . getInstance ( project ) ĊĠĠĠ Ġpsi Mgr . commit Document ( editor . document ) ĊĊĠĠĠ Ġval Ġcaret Offset Ġ= Ġeditor . expected Caret Offset ĊĠĠĠ Ġval Ġat Element Ġ= Ġfind First None Space Element ( psi Mgr . get Psi File ( editor . document ) !! , Ġcaret Offset ) ĊĠĠĠ Ġif Ġ( at Element Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġexecute Enter Handler ( project , Ġeditor ) ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis At The EndOf Command Ġ= Ġeditor . document . get LineNumber ( caret Offset ) Ġ== Ġeditor . document . line Count Ġ- Ġ 1 ĊĠĠĠ Ġval Ġhas Complete Statement Ġ= Ġcheck Complete ( at Element ) ĊĠĠĠ Ġif Ġ( is At The EndOf Command Ġ&& Ġhas Complete Statement ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġexecute Enter Handler ( project , Ġeditor ) ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġfun Ġexecute Enter Handler ( project : ĠProject , Ġeditor : ĠEditor Ex ) Ġ{ ĊĠĠĠ Ġval Ġenter Handler Ġ= ĠEditor Action Manager . getInstance (). getAction Handler ( Ide Actions . ACTION _ EDITOR _ ENTER ) ĊĠĠĠ ĠWrite Command Action . run Write Command Action ( project ) Ġ{ ĊĠĠĠĠĠ Ġenter Handler . execute ( editor , Ġnull , ĠData Manager . getInstance (). getData Context ( editor . component )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġreport Calls From Console Ġ= Ġset Of (" install . packages ", Ġ" install _ github ") ĊĊĠ Ġfun Ġanalyze Prompt ( console View : ĠR Console View ) Ġ{ ĊĠĠĠ Ġval Ġfile Ġ= Ġconsole View . file ĊĠĠĠ Ġfile . accept ( object Ġ: ĠR Recursive Element Visitor () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call Expression ( call : ĠR Call Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . visit Call Expression ( call ) ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcall . expression . text ĊĠĠĠĠĠĠĠ Ġif Ġ( report Calls From Console . contains ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠR Statistics . log Console MethodCall ( console View . project , Ġname ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcheck Complete ( el : ĠPsi Element ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġfile Ġ= Ġel . containing File ĊĠĠĠ Ġif Ġ( el . elementType Ġ== ĠR Element Types . R _ INVALID _ STRING ) Ġreturn Ġfalse ĊĠĠĠ Ġreturn Ġ! Psi Tree Util . has Error Elements ( file ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfind First None Space Element ( psi File : ĠPsi File , Ġoffset : ĠInt ): ĠPsi Element ? Ġ{ ĊĠĠĠ Ġfor Ġ( i Ġin Ġoffset Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġel Ġ= Ġpsi File . findElement At ( i ) ĊĠĠĠĠĠ Ġif Ġ( el Ġ!= Ġnull Ġ&& Ġel Ġ! is ĠPsi WhiteSpace ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġel ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Line At Offset ( doc : ĠDocument , Ġoffset : ĠInt ): ĠString Ġ{ ĊĠĠĠ Ġval Ġline Ġ= Ġdoc . get LineNumber ( offset ) ĊĠĠĠ Ġval Ġstart Ġ= Ġdoc . getLine Start Offset ( line ) ĊĠĠĠ Ġval Ġend Ġ= Ġdoc . getLine End Offset ( line ) ĊĠĠĠ Ġreturn Ġdoc . getText ( Text Range ( start , Ġend )) ĊĠ Ġ} Ċ }