/* Ċ Ġ* Ġ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 . k apt 3 Ċ Ċ import Ġcom . sun . tools . javac . comp . Compile States .* Ċ import Ġcom . sun . tools . javac . main . Java Compiler Ċ import Ġcom . sun . tools . javac . main . Option Ċ import Ġcom . sun . tools . javac . processing . Annotation Processing Error Ċ import Ġcom . sun . tools . javac . processing . J av ac F iler Ċ import Ġcom . sun . tools . javac . processing . J av ac Processing Environment Ċ import Ġcom . sun . tools . javac . tree . J CT ree Ċ import Ġorg . jetbrains . kotlin . k apt 3 . diagnostic . K apt Error Ċ import Ġorg . jetbrains . kotlin . k apt 3 . util . is Java 9 Or Later Ċ import Ġorg . jetbrains . kotlin . k apt 3 . util . put J av ac Option Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . measure Time Millis With Result Ċ import Ġjava . io . File Ċ import Ġjavax . annotation . processing . Processor Ċ import Ġjavax . annotation . processing . Round Environment Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . tools . Java FileObject Ċ import Ġcom . sun . tools . javac . util . List Ġas ĠJ av ac List Ċ Ċ fun ĠK apt Context <* >. do Annotation Processing ( ĊĠĠĠĠĠĠĠ Ġjava Source Files : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġprocessors : ĠList < Processor >, ĊĠĠĠĠĠĠĠ Ġcompile Classpath : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġannotation Processing Classpath : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġannotation Processors : ĠString , ĊĠĠĠĠĠĠĠ Ġsources Output Dir : ĠFile , ĊĠĠĠĠĠĠĠ Ġclasses Output Dir : ĠFile , ĊĠĠĠĠĠĠĠ Ġadditional Sources : ĠJ av ac List < J CT ree . JC Compilation Unit > Ġ= ĠJ av ac List . nil (), ĊĠĠĠĠĠĠĠ Ġwith J dk : ĠBoolean Ġ= Ġfalse Ċ ) Ġ{ ĊĠĠĠ Ġwith Ġ( options ) Ġ{ ĊĠĠĠĠĠĠĠ Ġput ( Option . PROC , Ġ" only ") Ġ// ĠOnly Ġprocess Ġannotations ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! with J dk ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput J av ac Option (" BOOT CLAS SPATH ", Ġ" BOOT _ CLASS _ PATH ", Ġ"") Ġ// ĠNo Ġboot Ġclasspath ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġput J av ac Option (" CLAS SPATH ", Ġ" CLASS _ PATH ", Ġcompile Classpath . join ToString ( File . path Separator ) Ġ{ Ġit . canonical Path Ġ}) ĊĠĠĠĠĠĠĠ Ġput J av ac Option (" PROCESS OR PATH ", Ġ" PROCESS OR _ PATH ", Ġannotation Processing Classpath . join ToString ( File . path Separator ) Ġ{ Ġit . canonical Path Ġ}) ĊĠĠĠĠĠĠĠ Ġput ( Option . PROCESS OR , Ġannotation Processors ) ĊĠĠĠĠĠĠĠ Ġput ( Option . S , Ġsources Output Dir . canonical Path ) ĊĠĠĠĠĠĠĠ Ġput ( Option . D , Ġclasses Output Dir . canonical Path ) ĊĠĠĠĠĠĠĠ Ġput ( Option . ENCODING , Ġ" UTF - 8 ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġprocessing Environment Ġ= ĠJ av ac Processing Environment . instance ( context ) ĊĠĠĠ Ġval Ġwrapped Processors Ġ= Ġprocessors . map Ġ{ ĠProcessor Wrapper ( it ) Ġ} ĊĊĠĠĠ Ġval Ġcompiler After AP : ĠJava Compiler ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Java 9 Or Later ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Process Annotations Method Ġ= ĠJava Compiler :: class . java . declared Methods . single Ġ{ Ġit . name Ġ== Ġ" init Process Annotations " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Process Annotations Method . invoke ( compiler , Ġwrapped Processors , Ġempty List < Java FileObject >(), Ġempty List < String >()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompiler . init Process Annotations ( wrapped Processors ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġparsed Java Files Ġ= Ġparse Java Files ( java Source Files ) ĊĊĠĠĠĠĠĠĠ Ġcompiler After AP Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Log . interceptor Data . files Ġ= Ġparsed Java Files . map Ġ{ Ġit . source File Ġto Ġit Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanalyzed Files Ġ= Ġcompiler . stop If Error Occurred ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompile State . PARSE , Ġcompiler . enter Trees ( parsed Java Files Ġ+ Ġadditional Sources )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Java 9 Or Later ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocess Annotations Method Ġ= Ġcompiler . java Class . getMethod (" process Annotations ", ĠJ av ac List :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Annotations Method . invoke ( compiler , Ġanalyzed Files ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompiler ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompiler . process Annotations ( analy zed Files ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠAnnotation Processing Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠK apt Error ( K apt Error . Kind . EXCEPTION , Ġe . cause Ġ?: Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= Ġcompiler After AP . log ĊĊĠĠĠĠĠĠĠ Ġval Ġf iler Ġ= Ġprocessing Environment . filer Ġas ĠJ av ac F iler ĊĠĠĠĠĠĠĠ Ġval Ġerror Count Ġ= Ġlog . n errors ĊĠĠĠĠĠĠĠ Ġval Ġwarning Count Ġ= Ġlog . n warnings ĊĊĠĠĠĠĠĠĠ Ġif Ġ( logger . is Verbose ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Annotation Ġprocessing Ġcomplete , Ġerrors : Ġ$ error Count , Ġwarnings : Ġ$ warning Count ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Annotation Ġprocessor Ġstats :") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapped Processors . forEach Ġ{ Ġprocessor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrounds Ġ= Ġprocessor . rounds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġround Ms Ġ= Ġrounds . join ToString Ġ{ Ġ"$ it Ġms " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Ms Ġ= Ġrounds . sum () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ("${ processor . name }: Ġ${ rounds . size } Ġrounds Ġ($ round Ms ), Ġ$ total Ms Ġms Ġin Ġtotal ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġf iler . display State () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( log . n errors Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠK apt Error ( K apt Error . Kind . ERROR _ RAI SED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġprocessing Environment . close () ĊĠĠĠĠĠĠĠ Ġthis @ do Annotation Processing . close () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠProcessor Wrapper ( private Ġval Ġdelegate : ĠProcessor ) Ġ: ĠProcessor Ġby Ġdelegate Ġ{ ĊĠĠĠ Ġval Ġrounds Ġ= Ġmutable ListOf < Long >() ĊĊĠĠĠ Ġval Ġname : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdelegate . java Class . simple Name ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( annotations : ĠMutable Set < out ĠType Element > ?, Ġround Env : ĠRound Environment ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( time , Ġresult ) Ġ= Ġmeasure Time Millis With Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . process ( annotations , Ġround Env ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrounds Ġ+= Ġtime ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠK apt Context <* >. parse Java Files ( java Source Files : ĠList < File >): ĠJ av ac List < J CT ree . JC Compilation Unit > Ġ{ ĊĠĠĠ Ġval Ġjava File Objects Ġ= Ġfile Manager . get Java File Objects From Files ( java Source Files ) ĊĊĠĠĠ Ġreturn Ġcompiler . stop If Error Occurred ( Compile State . PARSE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Modules IfNeeded ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompiler . stop If Error Occurred ( Compile State . PARSE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompiler . parse Files ( java File Objects )))) Ċ } Ċ Ċ private Ġfun ĠK apt Context <* >. init Modules IfNeeded ( files : ĠJ av ac List < J CT ree . JC Compilation Unit >): ĠJ av ac List < J CT ree . JC Compilation Unit > Ġ{ ĊĠĠĠ Ġif Ġ( is Java 9 Or Later ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinit Modules Method Ġ= Ġcompiler . java Class . getMethod (" init Modules ", ĠJ av ac List :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġcompiler . stop If Error Occurred ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompile State . PARSE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Modules Method . invoke ( compiler , Ġfiles ) Ġas ĠJ av ac List < J CT ree . JC Compilation Unit >) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfiles Ċ }