/* Ċ Ġ* Ġ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 . annot ator Ċ Ċ import Ġcom . intellij . code Insight . daemon . impl . Highlight Info Ċ import Ġcom . intellij . code Insight . daemon . impl . Highlight Info Type Ċ import Ġcom . intellij . lang . annotation . Annotation Session Ċ import Ġcom . intellij . openapi . action System . Ide Actions Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . editor . colors . Code Insight Colors Ċ import Ġcom . intellij . openapi . editor . colors . Text Attributes Key Ċ import Ġcom . intellij . openapi . keymap . Key map Manager Ċ import Ġcom . intellij . openapi . keymap . Key map Util Ċ import Ġcom . intellij . openapi . project . D umb Service Ċ import Ġcom . intellij . openapi . util . Key Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . impl . source . resolve . reference . impl . providers . File Reference Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġcom . intellij . util . containers . Container Util Ċ import Ġorg . jetbrains . r . R Bundle Ċ import Ġorg . jetbrains . r . highlight ing .* Ċ import Ġorg . jetbrains . r . hints . parameter Info . R Argument Info Ċ import Ġorg . jetbrains . r . psi . RP si Util Ċ import Ġorg . jetbrains . r . psi . RP si Util . is Field Like Component Ċ import Ġorg . jetbrains . r . psi . Reference Kind Ċ import Ġorg . jetbrains . r . psi . api .* Ċ import Ġorg . jetbrains . r . psi . get Kind Ċ import Ġorg . jetbrains . r . psi . isFunction From Library Ċ Ċ class ĠR Annot ator Visitor ( private Ġval Ġholder : ĠMutable List < Highlight Info >, Ġval Ġannotation Session : ĠAnnotation Session ) Ġ: ĠR Visitor () Ġ{ ĊĊĠ Ġoverride Ġfun Ġvisit Call Expression ( call Expression : ĠR Call Expression ) Ġ{ ĊĠĠĠ Ġval Ġexpression Ġ= Ġcall Expression . expression ĊĠĠĠ Ġif Ġ( expression Ġis ĠR Namespace Access Expression Ġ&& Ġexpression . identifier Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġhighlight ( expression . identifier !! , ĠFUNCTION _ CALL ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( expression Ġis ĠR Identifier Expression ) Ġ{ ĊĠĠĠĠĠ Ġhighlight ( expression , ĠFUNCTION _ CALL ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġotherwise Ġit 's Ġa Ġcomplex Ġexpression , Ġlets Ġuse Ġthe Ġdefault Ġhighlighting Ġfor Ġit ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Namespace Access Expression ( o : ĠR Namespace Access Expression ) Ġ{ ĊĠĠĠ Ġhighlight ( o . namespace , ĠNAMES PACE ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Identifier Expression ( element : ĠR Identifier Expression ) Ġ{ ĊĠĠĠ Ġanalyze Identifier Expression ( element )?. let Ġ{ Ġhighlight ( element , Ġit ) Ġ} ĊĊĠĠĠ Ġif Ġ( element . name Ġ== Ġ"... ") Ġ{ ĊĠĠĠĠĠ Ġif Ġ( element . parent Ġ! is ĠR Call Expression Ġ&& ĊĠĠĠĠĠĠĠĠĠ ĠPsi Tree Util . getParent OfType ( element , ĠR ArgumentList :: class . java ) Ġ== Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠ Ġ! is Dot s Function Definition ( element ) Ġ&& ĊĠĠĠĠĠĠĠĠĠ Ġ! declared Dot s Parameter ( element )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĠHighlight Info . new Highlight Info ( Highlight Info Type . WARNING ). range ( element ). description And Tooltip ( ĊĠĠĠĠĠĠĠĠĠ ĠR Bundle . message (" inspection . message . used . in . incorrect . context ")). create () ĊĠĠĠĠĠĠĠ Ġif Ġ( info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġholder . add ( info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis Dot s Function Definition ( element : ĠR Identifier Expression ): ĠBoolean Ġ= ĊĠĠĠ Ġ( element . parent Ġas ? ĠR Assignment Statement )?. let Ġ{ Ġit . assign ee Ġ== Ġelement Ġ&& Ġit . assigned Value Ġis ĠR Function Expression Ġ} Ġ?: Ġfalse ĊĊĠ Ġprivate Ġfun Ġdeclared Dot s Parameter ( element : ĠR Identifier Expression ): ĠBoolean Ġ{ ĊĠĠĠ Ġvar Ġcurrent : ĠRP si Element Ġ= Ġelement ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠ Ġval Ġr Function Expression Ġ= ĠPsi Tree Util . getParent OfType ( current , ĠR Function Expression :: class . java ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠ Ġval Ġparameter List Ġ= Ġr Function Expression . parameter List Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠ Ġfor Ġ( parameter Ġin Ġparameter List . parameter List ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parameter . variable ?. name Ġ== Ġ"... ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcurrent Ġ= Ġr Function Expression ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Parameter ( r Parameter : ĠR Parameter ) Ġ{ ĊĠĠĠ Ġhighlight ( r Parameter . name Identifier Ġ?: Ġreturn , ĠPARAMETER ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Operator Expression ( operator Expression : ĠR Operator Expression ) Ġ{ ĊĠĠĠ Ġval Ġright Ġ= Ġoperator Expression . right Expr Ġ?: Ġreturn ĊĠĠĠ Ġif Ġ(! is Field Like Component ( right )) Ġreturn ĊĠĠĠ Ġif Ġ( right Ġis ĠR StringLiteral Expression Ġ|| Ġright Ġis ĠR Identifier Expression ) Ġ{ ĊĠĠĠĠĠ Ġhighlight ( right , ĠFIELD ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġinfo Ġ= ĠHighlight Info . new Highlight Info ( Highlight Info Type . ERROR ). range ( right ). description And Tooltip ( ĊĠĠĠĠĠĠĠ ĠR Bundle . message (" inspection . message . r . grammar . does n . t . allow . here ", Ġright . text )). create () ĊĠĠĠĠĠ Ġif Ġ( info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġholder . add ( info ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit No Comma Tail ( no Comma : ĠR No Comma Tail ) Ġ{ ĊĠĠĠ Ġval Ġreport Element Ġ= ĠPsi Tree Util . find Child Of Any Type ( no Comma , ĠR Expression :: class . java , ĠR Named Argument :: class . java ) Ġ?: Ġreturn ĊĠĠĠ Ġval Ġoffset Ġ= Ġreport Element . text Range . start Offset ĊĠĠĠ Ġval Ġinfo Ġ= ĠHighlight Info . new Highlight Info ( Highlight Info Type . ERROR ). range ( Text Range ( offset , Ġoffset Ġ+ Ġ 1 )). description And Tooltip ( ĊĠĠĠĠĠ ĠR Bundle . message (" inspection . message . missing . comma ")). create () ĊĠĠĠ Ġif Ġ( info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġholder . add ( info ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit StringLiteral Expression ( o : ĠR StringLiteral Expression ) Ġ{ ĊĠĠĠ Ġval Ġcall Ġ= ĠPsi Tree Util . skip Parents OfType ( o , ĠR Named Argument :: class . java , ĠR ArgumentList :: class . java ) ĊĠĠĠ Ġif Ġ( call Ġ! is ĠR Call Expression ) Ġreturn ĊĊĠĠĠ Ġ// ĠTo Ġavoid ĠIndex Not Ready Exception ĊĠĠĠ Ġif Ġ( D umb Service . is D umb ( o . project )) Ġreturn ĊĠĠĠ Ġif Ġ(! call . isFunction From Library (" source ", Ġ" base ")) Ġreturn ĊĠĠĠ Ġif Ġ( R Argument Info . get Argument ByName ( call , Ġ" file ") Ġ!= Ġo ) Ġreturn ĊĊĠĠĠ Ġval Ġreference Ġ= Ġo . references . filter Is Instance < File Reference >(). single OrNull () Ġ?: Ġreturn ĊĠĠĠ Ġval Ġrange Ġ= Ġreference . range In Element ĊĠĠĠ Ġif Ġ( range . isEmpty ) Ġreturn ĊĊĠĠĠ Ġvar Ġmessage Ġ= Ġannotation Session . getUser Data ( source Tooltip Message Key ) ĊĠĠĠ Ġif Ġ( message Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġmessage Ġ= Ġsource Tooltip Message ĊĠĠĠĠĠ Ġannotation Session . put UserData ( source Tooltip Message Key , Ġmessage ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġinfo Ġ= ĠHighlight Info . new Highlight Info ( Highlight Info Type . INFORMATION ). range ( range . shift Right ( o . text Offset )). description And Tooltip ( ĊĠĠĠĠĠ Ġmessage ). text Attributes ( Code Insight Colors . IN ACTIVE _ HY PER LINK _ ATTRIBUTES ). create () ĊĠĠĠ Ġif Ġ( info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġholder . add ( info ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvisit Invalid Literal ( invalid : ĠR Invalid Literal ) Ġ{ ĊĠĠĠ Ġval Ġinfo Ġ= ĠHighlight Info . new Highlight Info ( Highlight Info Type . ERROR ). range ( invalid ). description And Tooltip ( ĊĠĠĠĠĠ ĠR Bundle . message (" inspection . message . unc losed . string . literal ")). create () ĊĠĠĠ Ġif Ġ( info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġholder . add ( info ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhighlight ( element : ĠPsi Element , Ġcolor Key : ĠText Attributes Key ) Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= ĠHighlight Info . new Highlight Info ( Highlight Info Type . INFORMATION ). range ( element ). text Attributes ( color Key ) ĊĠĠĠ Ġif Ġ( Application Manager . getApplication (). is UnitTest Mode ) Ġbuilder . description And Tooltip ( color Key . external Name ) ĊĠĠĠ Ġval Ġinfo Ġ= Ġbuilder . create () ĊĠĠĠ Ġif Ġ( info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġholder . add ( info ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġanalyze Identifier Expression ( element : ĠR Identifier Expression ): ĠText Attributes Key ? Ġ{ ĊĠĠĠ ĠRP si Util . get Call By Expression ( element )?. let Ġ{ Ġreturn Ġnull Ġ} ĊĠĠĠ ĠRP si Util . getName d Argument ByName Identifier ( element )?. let Ġ{ Ġreturn ĠNAME D _ ARGUMENT Ġ} ĊĠĠĠ ĠRP si Util . get Assignment By Assign ee ( element )?. let Ġ{ Ġassignment Ġ-> ĊĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġassignment . isFunction Declaration Ġ-> ĠFUNCTION _ DECL AR ATION ĊĠĠĠĠĠĠĠ Ġassignment . is Closure Assignment Ġ-> ĠCLO S URE ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLOCAL _ VARIABLE ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġelement . text Attribute ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsource Tooltip Message Key Ġ= ĠKey . create < String >(" r . source . file . message ") ĊĊĠĠĠ Ġprivate Ġval Ġsource Tooltip Message : ĠString ĊĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Prefix Ġ= ĠR Bundle . message (" open . source . file . in . editor . tooltip ") ĊĠĠĠĠĠĠĠ Ġval Ġshortcuts Ġ= ĠKey map Manager . getInstance (). active Key map . get Shortcut s ( Ide Actions . ACTION _ GOTO _ DECL AR ATION ) ĊĠĠĠĠĠĠĠ Ġval Ġshortcut Text Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠContainer Util . find ( shortcuts ) Ġ{ Ġ! it . is Keyboard Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( Key map Util . get Shortcut Text ( it ). replace ( Regex (" Button \\ d Ġ"), Ġ"")) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ ĠContainer Util . find ( shortcuts ) Ġ{ Ġit . is Keyboard Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNotEmpty ()) Ġappend (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( Key map Util . get Shortcut Text ( it )) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( shortcut Text . isNotEmpty ()) Ġmessage Prefix Ġ+ Ġ" Ġ($ shortcut Text )" ĊĠĠĠĠĠĠĠ Ġelse Ġmessage Prefix ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ internal Ġval ĠR Identifier Expression . text Attribute : ĠText Attributes Key ? ĊĠ Ġget () Ġ= Ġwhen Ġ( get Kind ()) Ġ{ ĊĠĠĠ ĠReference Kind . LOCAL _ VARIABLE Ġ-> ĠLOCAL _ VARIABLE ĊĠĠĠ ĠReference Kind . CLO S URE Ġ-> ĠCLO S URE ĊĠĠĠ ĠReference Kind . PARAMETER Ġ-> ĠPARAMETER ĊĠĠĠ Ġelse Ġ-> Ġnull ĊĠ Ġ}