/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 6 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . android Ċ Ċ import Ġcom . android . ide . common . bl ame . Message Ċ import Ġcom . android . ide . common . bl ame . SourceFile Position Ċ import Ġcom . android . ide . common . bl ame . Source Position Ċ import Ġcom . android . ide . common . bl ame . parser . util . Output Line Reader Ċ import Ġcom . google . common . base . Optional Ċ import Ġcom . google . common . collect . ImmutableList Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġorg . jetbrains . kotlin . k apt 3 . diagnostic . K apt Error Ċ import Ġjava . io . File Ċ import Ġjava . lang . IllegalStateException Ċ import Ġjava . util . regex . Pattern Ċ Ċ fun Ġparse ( line : ĠString , Ġreader : ĠOutput Line Reader , Ġmessages : ĠMutable List < Message >): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcolon Index 1 Ġ= Ġline . colon () ĊĠĠĠ Ġval Ġseverity Ġ= Ġif Ġ( colon Index 1 Ġ>= Ġ 0 ) Ġline . substring Before And Trim ( colon Index 1 ) Ġelse Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ(! severity . startsWith Severity Prefix ()) Ġreturn Ġfalse ĊĊĠĠĠ Ġval Ġline Wo Severity Ġ= Ġline . substring After And Trim ( colon Index 1 ) ĊĠĠĠ Ġval Ġcolon Index 2 Ġ= Ġline Wo Severity . colon (). skip Drive On Win ( line Wo Severity ) ĊĠĠĠ Ġif Ġ( colon Index 2 Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġline Wo Severity . substring Before And Trim ( colon Index 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Extension Ġ= Ġfile . extension . toLowerCase () ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . isFile Ġ|| Ġ( file Extension Ġ!= Ġ" kt " Ġ&& Ġfile Extension Ġ!= Ġ" java ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġadd Message ( create Message ( getMessage Kind ( severity ), Ġline Wo Severity . am end Next Lines IfNeeded ( reader )), Ġmessages ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġline Wo Path Ġ= Ġline Wo Severity . substring After And Trim ( colon Index 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġcolon Index 3 Ġ= Ġline Wo Path . colon () ĊĠĠĠĠĠĠĠ Ġif Ġ( colon Index 3 Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġline Wo Path . substring Before And Trim ( colon Index 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= ĠK OT LIN _ POSITION _ PATTERN . matcher ( position ). take If Ġ{ Ġit . matches () Ġ} Ġ?: ĠJ AV AC _ POSITION _ PATTERN . matcher ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġline Wo Path . substring After And Trim ( colon Index 3 ). am end Next Lines IfNeeded ( reader ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlineNumber Ġ= Ġmatcher . group ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Number Ġ= Ġif Ġ( matcher . group Count () Ġ>= Ġ 2 ) Ġmatcher . group ( 2 ) Ġelse Ġ" 1 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line Number Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Number Text Ġ= Ġsymbol Number . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġadd Message ( create Message With Location ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetMessage Kind ( severity ), Ġmessage , Ġpath , ĠlineNumber . toInt (), Ġsymbol Number Text , Ġsymbol Number Text ), Ġmessages ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġadd Message ( create Message ( getMessage Kind ( severity ), Ġmessage ), Ġmessages ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġadd Message ( create Message ( getMessage Kind ( severity ), Ġline Wo Severity . am end Next Lines IfNeeded ( reader )), Ġmessages ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfalse Ċ } Ċ Ċ private Ġval ĠCOL ON Ġ= Ġ":" Ċ private Ġval ĠK OT LIN _ POSITION _ PATTERN Ġ= ĠPattern . compile ("\\ (([ 0 - 9 ]* ), Ġ([ 0 - 9 ]*) \\ )") Ċ private Ġval ĠJ AV AC _ POSITION _ PATTERN Ġ= ĠPattern . compile (" ([ 0 - 9 ]+ )") Ċ Ċ private Ġfun ĠString . am end Next Lines IfNeeded ( reader : ĠOutput Line Reader ): ĠString Ġ{ ĊĠĠĠ Ġvar Ġnext Line Ġ= Ġreader . readLine () ĊĊĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder ( this ) ĊĠĠĠ Ġwhile Ġ( nextLine Ġ!= Ġnull Ġ&& Ġnext Line . is Next Message (). not ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append ("\ n "). append ( nextLine ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! reader . hasNext Line ()) Ġbreak ĊĊĠĠĠĠĠĠĠ Ġnext Line Ġ= Ġreader . readLine () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( nextLine Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġcode Ġis Ġneeded Ġfor Ġcompatibility Ġwith ĠAS Ġ 2 . 0 Ġand ĠIDEA Ġ 1 5 . 0 , Ġbecause Ġof Ġdifference Ġin Ġandroid Ġplugins ĊĠĠĠĠĠĠĠ Ġval Ġposition Field Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader :: class . java . getDeclared Field (" my Position ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( position Field Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Field . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Field . setInt ( reader , Ġposition Field . getInt ( reader ) Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġbuilder . toString () Ċ } Ċ Ċ private Ġfun ĠString . is Next Message (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcolon Index 1 Ġ= ĠindexOf ( COL ON ) ĊĠĠĠ Ġreturn Ġcolon Index 1 Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( colon Index 1 Ġ>= Ġ 0 Ġ&& Ġsubstring ( 0 , Ġcolon Index 1 ). startsWith Severity Prefix ()) Ġ// ĠNext ĠKotlin Ġmessage ĊĠĠĠĠĠĠĠĠĠĠ Ġ|| ĠString Util . contains IgnoreCase ( this , Ġ" FAILURE ") ĊĠĠĠĠĠĠĠĠĠĠ Ġ|| ĠString Util . contains IgnoreCase ( this , Ġ" FAILED ") Ċ } Ċ Ċ private Ġfun ĠString . startsWith Severity Prefix () Ġ= ĠgetMessage Kind ( this ) Ġ!= ĠMessage . Kind . UNKNOWN Ċ Ċ private Ġfun ĠgetMessage Kind ( kind : ĠString ) Ġ= Ġwhen Ġ( kind ) Ġ{ ĊĠĠĠ Ġ" e " Ġ-> ĠMessage . Kind . ERROR ĊĠĠĠ Ġ" w " Ġ-> ĠMessage . Kind . WARNING ĊĠĠĠ Ġ" i " Ġ-> ĠMessage . Kind . INFO ĊĠĠĠ Ġ" v " Ġ-> ĠMessage . Kind . SIMPLE ĊĠĠĠ Ġelse Ġ-> ĠMessage . Kind . UNKNOWN Ċ } Ċ Ċ private Ġfun ĠString . substring After And Trim ( index : ĠInt ) Ġ= Ġsubstring ( index Ġ+ Ġ 1 ). trim () Ċ private Ġfun ĠString . substring Before And Trim ( index : ĠInt ) Ġ= Ġsubstring ( 0 , Ġindex ). trim () Ċ private Ġfun ĠString . colon () Ġ= ĠindexOf ( COL ON ) Ċ private Ġfun ĠInt . skip Drive On Win ( line : ĠString ): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this Ġ== Ġ 1 ) Ġline . indexOf ( COL ON , Ġthis Ġ+ Ġ 1 ) Ġelse Ġthis Ċ } Ċ Ċ private Ġval ĠK AP T _ ERROR _ WH ILE _ AN NOT ATION _ PROCESS ING _ MARKER _ TEXT Ġ= ĊĠĠĠĠĠĠĠ ĠK apt Error :: class . java . canonical Name Ġ+ Ġ": Ġ" Ġ+ ĠK apt Error . Kind . ERROR _ RAI SED . message Ċ Ċ private Ġfun Ġis K apt Error While Annotation Processing ( message : ĠMessage ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( message . kind Ġ!= ĠMessage . Kind . ERROR ) Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( message . source File Positions . single OrNull () Ġ!= ĠSource File Position . UNKNOWN ) Ġreturn Ġfalse ĊĊĠĠĠ Ġval Ġmessage Text Ġ= Ġmessage . text ĊĠĠĠ Ġreturn Ġmessage Text . startsWith ( IllegalStateException :: class . java . name ) ĊĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġmessage Text . contains ( K AP T _ ERROR _ WH ILE _ AN NOT ATION _ PROCESS ING _ MARKER _ TEXT ) Ċ } Ċ Ċ private Ġfun Ġadd Message ( message : ĠMessage , Ġmessages : ĠMutable List < Message >): ĠBoolean Ġ{ ĊĠĠĠ Ġ// ĠIgnore ĠK apt Error . ERROR _ RAI SED Ġmessage Ġfrom Ġk apt . ĠWe Ġalready Ġprocessed Ġall Ġerrors Ġfrom Ġannotation Ġprocessing ĊĠĠĠ Ġif Ġ( is K apt Error While Annotation Processing ( message )) Ġreturn Ġtrue ĊĊĠĠĠ Ġvar Ġduplicates Previous Ġ= Ġfalse ĊĠĠĠ Ġval Ġmessage Count Ġ= Ġmessages . size ĊĠĠĠ Ġif Ġ( message Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Message Ġ= Ġmessages [ message Count Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġduplicates Previous Ġ= Ġlast Message Ġ== Ġmessage ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! duplicates Previous ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessages . add ( message ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ private Ġfun Ġcreate Message ( message Kind : ĠMessage . Kind , Ġtext : ĠString ): ĠMessage Ġ{ ĊĠĠĠ Ġreturn ĠMessage ( message Kind , Ġtext . trim (), Ġtext , ĠOptional . abs ent < String >(), ĠImmutableList . of ()) Ċ } Ċ Ċ private Ġfun Ġcreate Message With Location ( ĊĠĠĠĠĠĠĠ Ġmessage Kind : ĠMessage . Kind , ĊĠĠĠĠĠĠĠ Ġtext : ĠString , ĊĠĠĠĠĠĠĠ Ġfile : ĠString , ĊĠĠĠĠĠĠĠ ĠlineNumber : ĠInt , ĊĠĠĠĠĠĠĠ ĠcolumnIndex : ĠInt , ĊĠĠĠĠĠĠĠ Ġoffset : ĠInt Ċ ): ĠMessage Ġ{ ĊĠĠĠ Ġval Ġsource Position Ġ= ĠSource Position ( line Number Ġ- Ġ 1 , ĠcolumnIndex Ġ- Ġ 1 , Ġoffset ) ĊĠĠĠ Ġval Ġsource File Position Ġ= ĠSource File Position ( File ( file ), Ġsource Position ) ĊĠĠĠ Ġreturn ĠMessage ( message Kind , Ġtext . trim (), Ġsource File Position ) Ċ } Ċ