package Ġname . k ro pp . intellij . make file Ċ Ċ import Ġcom . intellij . lang .* Ċ import Ġcom . intellij . lang . annotation .* Ċ import Ġcom . intellij . lang . annotation . Highlight Severity .* Ċ import Ġcom . intellij . openapi . editor . colors .* Ċ import Ġcom . intellij . openapi . util .* Ċ import Ġcom . intellij . psi .* Ċ import Ġcom . intellij . psi . impl . source . resolve . reference . impl . providers .* Ċ import Ġcom . intellij . psi . tree .* Ċ import Ġname . k ro pp . intellij . make file . Makefile Syntax Highlight er . Companion . FUNCTION Ċ import Ġname . k ro pp . intellij . make file . Makefile Syntax Highlight er . Companion . PR ER EQ UIS ITE Ċ import Ġname . k ro pp . intellij . make file . Makefile Syntax Highlight er . Companion . SPECIAL _ TARGET Ċ import Ġname . k ro pp . intellij . make file . Makefile Syntax Highlight er . Companion . STRING Ċ import Ġname . k ro pp . intellij . make file . Makefile Syntax Highlight er . Companion . TARGET Ċ import Ġname . k ro pp . intellij . make file . Makefile Syntax Highlight er . Companion . VARIABLE Ċ import Ġname . k ro pp . intellij . make file . Makefile Syntax Highlight er . Companion . VARIABLE _ VALUE Ċ import Ġname . k ro pp . intellij . make file . psi .* ĊĊ Ċ class ĠMakefile Annot ator Ġ: ĠAnnot ator Ġ{ ĊĠ Ġprivate Ġval Ġline Token Set Ġ= ĠToken Set . create ( Makefile Types . IDENTIFIER ) ĊĊĠ Ġoverride Ġfun Ġannotate ( element : ĠPsi Element , Ġholder : ĠAnnotation Holder ) Ġ{ ĊĠĠĠ Ġif Ġ( element Ġis ĠMakefile Target Ġ&& Ġ!( element . parent . parent . parent Ġas ĠMakefile Rule ). is Unused ()) Ġ{ ĊĠĠĠĠĠ Ġholder . mark ( element , Ġif Ġ( element . is Special Target ) ĠSPECIAL _ TARGET Ġelse ĠTARGET ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( element Ġis ĠMakefile Pr erequis ite ) Ġ{ ĊĠĠĠĠĠ Ġholder . mark ( element , ĠPR ER EQ UIS ITE ) ĊĊĠĠĠĠĠ Ġif Ġ( Regex (""" \ $\ (( .* )\ ) "" "). matches ( element . text )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġtarget Line Ġ= Ġelement . parent . parent . parent Ġas ĠMakefile Target Line ĊĠĠĠĠĠ Ġif Ġ( target Line . targets . target List . first OrNull ()?. is Special Target Ġ== Ġfalse Ġ&& Ġtarget Line . target Pattern Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget References Ġ= Ġelement . references . filter Ġ{ Ġit Ġis ĠMakefile Target Reference Ġ&& Ġit . multi Resolve ( false ). isNotEmpty () Ġ}. any () ĊĊĠĠĠĠĠĠĠ Ġvar Ġfile Reference Resolved Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġun resolved File : ĠText Range ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġelement . references . filter Ġ{ Ġit Ġis ĠFile Reference Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . resolve () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! target References ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġelement . text Range . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġstart Offset Ġ+ Ġit . range In Element . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġstart Offset Ġ+ Ġit . range In Element . end Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Range Ġ= ĠText Range . create ( start , Ġend ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun resolved File Ġ= Ġun resolved File ?. union ( text Range ) Ġ?: Ġtext Range ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Reference Resolved Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! target References Ġ&& Ġ! file Reference Resolved ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġholder . new Annotation ( WE AK _ WARNING , Ġ" Un resolved Ġpr erequis ite "). range ( element ). with Fix ( Create Rule Fix ( element )). create () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( un resolved File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġholder . new Annotation ( WE AK _ WARNING , Ġ" File Ġnot Ġfound "). range ( un resolved File !! ). create () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( element Ġis ĠMakefile Variable ) Ġ{ ĊĠĠĠĠĠ Ġholder . mark ( element , ĠVARIABLE ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( element Ġis ĠMakefile Variable Value ) Ġ{ ĊĠĠĠĠĠ Ġelement . node . getChildren ( line Token Set ). forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġholder . mark ( it , ĠVARIABLE _ VALUE ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( element Ġis ĠMakefile FunctionName Ġ&& Ġelement . parent Ġis ĠMakefile Function ) Ġ{ ĊĠĠĠĠĠ Ġholder . mark ( element , ĠFUNCTION ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( element Ġis ĠMakefile String ) Ġ{ ĊĠĠĠĠĠ Ġholder . mark ( element , ĠSTRING ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( element Ġis ĠMakefile Variable Usage ) Ġ{ ĊĠĠĠĠĠ Ġholder . mark ( element , ĠVARIABLE ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠAnnotation Holder . mark ( element : ĠPsi Element , Ġattr : ĠText Attributes Key ) Ġ{ ĊĠĠĠ Ġnew Sil ent Annotation ( INFORMATION ). range ( element ). text Attributes ( attr ). create () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠAnnotation Holder . mark ( node : ĠAST Node , Ġattr : ĠText Attributes Key ) Ġ{ ĊĠĠĠ Ġnew Sil ent Annotation ( INFORMATION ). range ( node ). text Attributes ( attr ). create () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠMakefile Rule . is Unused (): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( recipe ?. isEmpty Ġ== Ġfalse ) Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( target Line . targets . target List . any Ġ{ Ġit . is Special Target Ġ|| Ġit . is Pattern Target Ġ}) Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( target Line . prerequisites ?. normal Pr erequisites ?. pr erequis ite List ?. any () Ġ== Ġtrue ) Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( target Line . prerequisites ?. order Only Pr erequisites ?. pr erequis ite List ?. any () Ġ== Ġtrue ) Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( target Line . variable Assignment Ġ!= Ġnull ) Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( target Line . private var Ġ!= Ġnull ) Ġreturn Ġfalse ĊĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} Ċ }