/* Ċ Ġ* Ġ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 . annotation . processing Ċ Ċ import Ġcom . intellij . mock . Mock Project Ċ import Ġcom . intellij . openapi . extensions . Extensions Ċ import Ġorg . jetbrains . kotlin . annotation . Classpath Based Annotation Processing Extension Ċ import Ġorg . jetbrains . kotlin . annotation . processing . diagnostic . Default Error Messages Annotation Processing Ċ import Ġorg . jetbrains . kotlin . cli . jvm . config . IS _ K AP T 2 _ ENABLED _ KEY Ċ import Ġorg . jetbrains . kotlin . cli . jvm . config . Java Source Root Ċ import Ġorg . jetbrains . kotlin . cli . jvm . config . Jvm Content Root Ċ import Ġorg . jetbrains . kotlin . compiler . plugin . Cli Option Ċ import Ġorg . jetbrains . kotlin . compiler . plugin . Cli Option Processing Exception Ċ import Ġorg . jetbrains . kotlin . compiler . plugin . CommandLine Processor Ċ import Ġorg . jetbrains . kotlin . compiler . plugin . Component Registrar Ċ import Ġorg . jetbrains . kotlin . config . Compiler Configuration Ċ import Ġorg . jetbrains . kotlin . config . Compiler Configuration Key Ċ import Ġorg . jetbrains . kotlin . config . JVM Configuration Keys Ċ import Ġorg . jetbrains . kotlin . diagnostics . rendering . Default Error Messages Ċ import Ġorg . jetbrains . kotlin . java . model . internal . Je Element Registry Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . extensions . Analysis Handler Extension Ċ import Ġjava . io . File Ċ Ċ import Ġorg . jetbrains . kotlin . annotation . processing . Annotation Processing Configuration Keys . AN NOT ATION _ PROCESS OR _ CLAS SPATH Ċ import Ġorg . jetbrains . kotlin . annotation . processing . Annotation Processing Configuration Keys . AP T _ OPTIONS Ċ Ċ object ĠAnnotation Processing Configuration Keys Ġ{ ĊĠĠĠ Ġval ĠGENERATED _ OUTPUT _ DIR : ĠCompiler Configuration Key < String > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompiler Configuration Key . create < String >(" generated Ġfiles Ġoutput Ġdirectory ") ĊĊĠĠĠ Ġval ĠCLASS _ FILES _ OUTPUT _ DIR : ĠCompiler Configuration Key < String > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompiler Configuration Key . create < String >(" class Ġfiles Ġoutput Ġdirectory ") ĊĠĠĠĠĊĠĠĠ Ġval ĠAN NOT ATION _ PROCESS OR _ CLAS SPATH : ĠCompiler Configuration Key < List < String >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompiler Configuration Key . create < List < String >> (" annotation Ġprocessor Ġclasspath ") ĊĊĠĠĠ Ġval ĠA PT _ OPTIONS : ĠCompiler Configuration Key < List < String >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompiler Configuration Key . create < List < String >> (" annotation Ġprocessing Ġoptions ") ĊĊĠĠĠ Ġval ĠIN CRE MENT AL _ DATA _ FILE : ĠCompiler Configuration Key < String > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompiler Configuration Key . create < String >(" data Ġfile Ġfor Ġincremental Ġcompilation Ġsupport ") ĊĊĠĠĠ Ġval ĠVERBOSE _ MODE : ĠCompiler Configuration Key < String > Ġ= ĠĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompiler Configuration Key . create < String >(" verbose Ġmode ") Ċ } Ċ Ċ class ĠAnnotation Processing CommandLine Processor Ġ: ĠCommandLine Processor Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠAN NOT ATION _ PROCESS ING _ COMPILER _ PLUGIN _ ID : ĠString Ġ= Ġ" org . jetbrains . kotlin . k apt 2 " ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval ĠGENERATED _ OUTPUT _ DIR _ OPTION : ĠCli Option Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCli Option (" generated ", Ġ"< path >", Ġ" Output Ġpath Ġfor Ġthe Ġgenerated Ġfiles ", Ġrequired Ġ= Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġval ĠCLASS _ FILES _ OUTPUT _ DIR _ OPTION : ĠCli Option Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCli Option (" classes ", Ġ"< path >", Ġ" Output Ġpath Ġfor Ġthe Ġclass Ġfiles ", Ġrequired Ġ= Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġval ĠAN NOT ATION _ PROCESS OR _ CLAS SPATH _ OPTION : ĠCli Option Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCli Option (" ap classpath ", Ġ"< classpath >", Ġ" Annotation Ġprocessor Ġclasspath ", Ġ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Ġ= Ġfalse , Ġallow Multiple Occ urrences Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval ĠA PT _ OPTIONS _ OPTION : ĠCli Option Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCli Option (" ap option ", Ġ"< key >:< value >", Ġ" Annotation Ġprocessor Ġoption ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Ġ= Ġfalse , Ġallow Multiple Occ urrences Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval ĠIN CRE MENT AL _ DATA _ FILE _ OPTION : ĠCli Option Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCli Option (" incremental Data ", Ġ"< path >", Ġ" Location Ġof Ġthe Ġincremental Ġdata Ġfile ", Ġrequired Ġ= Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġval ĠVERBOSE _ MODE _ OPTION : ĠCli Option Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCli Option (" verbose ", Ġ" true Ġ| Ġfalse ", Ġ" Enable Ġverbose Ġoutput ", Ġrequired Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġplugin Id : ĠString Ġ= ĠAN NOT ATION _ PROCESS ING _ COMPILER _ PLUGIN _ ID ĊĊĠĠĠ Ġoverride Ġval Ġplugin Options : ĠCollection < Cli Option > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( GENERATED _ OUTPUT _ DIR _ OPTION , ĠAN NOT ATION _ PROCESS OR _ CLAS SPATH _ OPTION , ĠA PT _ OPTIONS _ OPTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCLASS _ FILES _ OUTPUT _ DIR _ OPTION , ĠIN CRE MENT AL _ DATA _ FILE _ OPTION , ĠVERBOSE _ MODE _ OPTION ) ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > ĠCompiler Configuration . append List ( option : ĠCompiler Configuration Key < List < T >>, Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpaths Ġ= ĠgetList ( option ). to Mutable List () ĊĠĠĠĠĠĠĠ Ġpaths . add ( value ) ĊĠĠĠĠĠĠĠ Ġput ( option , Ġpaths ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Option ( option : ĠCli Option , Ġvalue : ĠString , Ġconfiguration : ĠCompiler Configuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( option ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAN NOT ATION _ PROCESS OR _ CLAS SPATH _ OPTION Ġ-> Ġconfiguration . append List ( AN NOT ATION _ PROCESS OR _ CLAS SPATH , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA PT _ OPTIONS _ OPTION Ġ-> Ġconfiguration . append List ( AP T _ OPTIONS , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGENERATED _ OUTPUT _ DIR _ OPTION Ġ-> Ġconfiguration . put ( Annotation Processing Configuration Keys . GENERATED _ OUTPUT _ DIR , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCLASS _ FILES _ OUTPUT _ DIR _ OPTION Ġ-> Ġconfiguration . put ( Annotation Processing Configuration Keys . CLASS _ FILES _ OUTPUT _ DIR , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIN CRE MENT AL _ DATA _ FILE _ OPTION Ġ-> Ġconfiguration . put ( Annotation Processing Configuration Keys . INCREMENT AL _ DATA _ FILE , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVERBOSE _ MODE _ OPTION Ġ-> Ġconfiguration . put ( Annotation Processing Configuration Keys . VERBOSE _ MODE , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠCli Option Processing Exception (" Unknown Ġoption : Ġ${ option . name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠAnnotation Processing Component Registrar Ġ: ĠComponent Registrar Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġregister Project Components ( project : ĠMock Project , Ġconfiguration : ĠCompiler Configuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Output Dir Ġ= Ġconfiguration . get ( Annotation Processing Configuration Keys . GENERATED _ OUTPUT _ DIR ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġap Classpath Ġ= Ġconfiguration . get ( AN NOT ATION _ PROCESS OR _ CLAS SPATH )?. map (:: File ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġap Options Ġ= Ġ( configuration . get ( AP T _ OPTIONS ) Ġ?: ĠlistOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . split (': ') Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . size Ġ== Ġ 2 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit [ 0 ] Ġto Ġit [ 1 ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () ĊĊĠĠĠĠĠĠĠ Ġval Ġincremental Data File Ġ= Ġconfiguration . get ( Annotation Processing Configuration Keys . INCREMENT AL _ DATA _ FILE )?. let (:: File ) ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerated Output Dir File Ġ= ĠFile ( generated Output Dir ) ĊĠĠĠĠĠĠĠ Ġgenerated Output Dir File . mkdir s () ĊĊĠĠĠĠĠĠĠ Ġval Ġcontent Roots Ġ= Ġconfiguration [ JVM Configuration Keys . CONTENT _ ROOT S ] Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġcompile Classpath Ġ= Ġcontent Roots . filter Is Instance < Jvm Content Root >(). map Ġ{ Ġit . file Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġclasspath Ġ= Ġap Classpath Ġ+ Ġcompile Classpath ĊĊĠĠĠĠĠĠĠ Ġval Ġjava Roots Ġ= Ġcontent Roots . filter Is Instance < Java Source Root >(). map Ġ{ Ġit . file Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġclasses Output Dir Ġ= ĠFile ( configuration . get ( Annotation Processing Configuration Keys . CLASS _ FILES _ OUTPUT _ DIR ) Ġ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġconfiguration [ JVM Configuration Keys . MODULES ] !!. first (). getOutput Directory ()) Ġ ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġverbose Output Ġ= Ġconfiguration . get ( Annotation Processing Configuration Keys . VERBOSE _ MODE ) Ġ== Ġ" true " ĊĊĠĠĠĠĠĠĠ ĠExtensions . getRoot Area (). getExtension Point ( Default Error Messages . Extension . EP _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. register Extension ( Default Error Messages Annotation Processing ()) ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġ// ĠAn notations Ġwith Ġthe Ġ" SOURCE " Ġretention Ġwill Ġbe Ġwritten Ġto Ġclass Ġfiles ĊĠĠĠĠĠĠĠ Ġproject . put UserData ( IS _ K AP T 2 _ ENABLED _ KEY , Ġtrue ) ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġsource Retention Annotation Handler Ġ= Ġconfiguration [ JVM Configuration Keys . SOURCE _ RET ENT ION _ AN NOT ATION _ HANDLER ] ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġannotation Processing Extension Ġ= ĠClass path Based Annotation Processing Extension ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath , Ġap Options , Ġgenerated Output Dir File , Ġclasses Output Dir , Ġjava Roots , Ġverbose Output , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincremental Data File , Ġsource Retention Annotation Handler ) ĊĊĠĠĠĠĠĠĠ Ġproject . register Service ( Je Element Registry :: class . java , ĠJe Element Registry ()) ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ ĠAnalysis Handler Extension . register Extension ( project , Ġannotation Processing Extension ) ĊĠĠĠ Ġ} Ċ }