/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠMar cin ĠBu k ow ie ck i . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġio . vac uum . lint Ċ Ċ import Ġcom . go ide . sdk . Go Sdk Util Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġio . vac uum . notifications . Vac uum Notifier Ċ import Ġio . vac uum . settings . Vac uum Settings State Ċ import Ġio . vac uum . utils . Vac uum Bundle Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . InputStream Reader Ċ Ċ /** Ċ Ġ* Ġ@ author ĠMar cin ĠBu k ow ie ck i Ċ Ġ*/ Ċ class ĠGo Lint Process ( private Ġval Ġfiles : ĠList < Psi File >, Ġprivate Ġval Ġproject : ĠProject ): ĠL int Process < Go Lint Result > Ġ{ ĊĊĠĠĠ Ġconstructor ( file : ĠPsi File ): Ġthis ( listOf ( file ), Ġfile . project ) ĊĊĠĠĠ Ġoverride Ġfun Ġexecute (): ĠGo Lint Result Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! check Go Lint ( this . project )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGo Lint Result ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= Ġmutable ListOf < Go Lint Message >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( f Ġin Ġfiles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= Ġexecute Lint ( f . project , Ġf . virtual File . path ) Ġ?: Ġreturn ĠGo Lint Result ( emptyList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbr Ġ= ĠBufferedReader ( InputStream Reader ( process . inputStream )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġbr . readLine () Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGo Lint Output Parser (). parse Line ( line )?. let Ġ{ Ġit Ġ-> Ġmessages . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGo Lint Result ( messages ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcommand (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" gol int " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLogger . getInstance ( Go Lint Process :: java Class . name ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġexecute Lint ( project : ĠProject , ĠfilePath : ĠString ): ĠProcess ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= Ġtry Execute ( path Prefix Ġ= Ġ"", ĠfilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( process Ġ!= Ġnull ) Ġreturn Ġprocess ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgo Path Bins Ġ= ĠGo Sdk Util . get Go Path Roots ( project , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( go Path Bin Ġin Ġgo Path Bins ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġtry Execute ( go Path Bin . path Ġ+ Ġ"/ bin /", ĠfilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcheck Go Lint ( project : ĠProject , Ġshow Notification : ĠBoolean Ġ= Ġfalse ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Vac uum Settings State . getInstance (). enable Go Lint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( execute Lint ( project , Ġ"- foo ") Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Notification ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ac uum Notifier . notify Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ac uum Bundle . message (" vac uum . gol int . notification . title "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ac uum Bundle . message (" vac uum . gol int . notification . message ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtry Execute ( path Prefix : ĠString , ĠfilePath : ĠString ): ĠProcess ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRuntime . get Runtime (). exec ( path Prefix Ġ+ Ġ" gol int Ġ$ filePath ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Exception Ġwhile Ġchecking Ġg ol int ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ