@@ -4,6 +4,7 @@ import org.gradle.api.Project
44import org.gradle.api.file.ConfigurableFileCollection
55import org.gradle.api.file.Directory
66import org.gradle.api.file.DirectoryProperty
7+ import org.gradle.api.file.FileCollection
78import org.gradle.api.invocation.BuildInvocationDetails
89import org.gradle.api.logging.Logger
910import org.gradle.api.logging.Logging
@@ -32,16 +33,17 @@ import java.util.regex.Matcher
3233@SuppressWarnings (' unused' )
3334class InstrumentPlugin implements Plugin<Project > {
3435 public static final String DEFAULT_JAVA_VERSION = ' default'
36+ public static final String INSTRUMENT_PLUGIN_CLASSPATH_CONFIGURATION = ' instrumentPluginClasspath'
3537 private final Logger logger = Logging . getLogger(InstrumentPlugin )
3638
3739 @Override
3840 void apply (Project project ) {
3941 InstrumentExtension extension = project. extensions. create(' instrument' , InstrumentExtension )
4042
41- project. pluginManager. withPlugin(" java" ) {configurePostCompilationInstrumentation(" java" , project, extension) }
42- project. pluginManager. withPlugin(" kotlin" ) {configurePostCompilationInstrumentation(" kotlin" , project, extension) }
43- project. pluginManager. withPlugin(" scala" ) {configurePostCompilationInstrumentation(" scala" , project, extension) }
44- project. pluginManager. withPlugin(" groovy" ) {configurePostCompilationInstrumentation(" groovy" , project, extension) }
43+ project. pluginManager. withPlugin(" java" ) { configurePostCompilationInstrumentation(" java" , project, extension) }
44+ project. pluginManager. withPlugin(" kotlin" ) { configurePostCompilationInstrumentation(" kotlin" , project, extension) }
45+ project. pluginManager. withPlugin(" scala" ) { configurePostCompilationInstrumentation(" scala" , project, extension) }
46+ project. pluginManager. withPlugin(" groovy" ) { configurePostCompilationInstrumentation(" groovy" , project, extension) }
4547 }
4648
4749 private void configurePostCompilationInstrumentation (String language , Project project , InstrumentExtension extension ) {
@@ -50,15 +52,15 @@ class InstrumentPlugin implements Plugin<Project> {
5052 sourceSets. configureEach { SourceSet sourceSet ->
5153 def sourceSetName = sourceSet. name
5254 logger. info(" [InstrumentPlugin] source-set: $sourceSetName , language: $language " )
53-
55+
5456 if (! sourceSetName. startsWith(SourceSet . MAIN_SOURCE_SET_NAME )) {
5557 logger. debug(" [InstrumentPlugin] Skipping non-main source set {} for language {}" , sourceSetName, language)
5658 return
5759 }
5860
5961 def compileTaskName = sourceSet. getCompileTaskName(language)
6062 logger. info(" [InstrumentPlugin] compile task name: " + compileTaskName)
61-
63+
6264 // For each compile task, append an instrumenting post-processing step
6365 // Examples of compile tasks:
6466 // - compileJava,
@@ -68,9 +70,22 @@ class InstrumentPlugin implements Plugin<Project> {
6870 // - compileKotlin,
6971 // - compileScala,
7072 // - compileGroovy,
71- project. tasks. named(compileTaskName, AbstractCompile ) {
73+ def compileTasks = project. tasks. withType(AbstractCompile ). matching {
74+ it. name == compileTaskName && ! it. source. isEmpty()
75+ }
76+
77+ project. configurations. whenObjectAdded { pluginConfig ->
78+ if (pluginConfig. name == INSTRUMENT_PLUGIN_CLASSPATH_CONFIGURATION ) {
79+ logger. info(' [InstrumentPlugin] instrumentPluginClasspath configuration was created' )
80+ compileTasks. configureEach {
81+ it. inputs. files(pluginConfig)
82+ }
83+ }
84+ }
85+
86+ compileTasks. configureEach {
7287 if (it. source. isEmpty()) {
73- logger. info (" [InstrumentPlugin] Skipping $compileTaskName for source set $sourceSetName as it has no source files" )
88+ logger. debug (" [InstrumentPlugin] Skipping $compileTaskName for source set $sourceSetName as it has no source files" )
7489 return
7590 }
7691
@@ -90,17 +105,10 @@ class InstrumentPlugin implements Plugin<Project> {
90105 def plugins = extension. plugins
91106 it. inputs. property(" plugins" , plugins)
92107
93- def pluginClassPath = project. objects. fileCollection()
94- def instrumentConfiguration = project. configurations. findByName(' instrumentPluginClasspath' )
95- if (instrumentConfiguration != null ) {
96- pluginClassPath. from(instrumentConfiguration)
97- it. inputs. files(pluginClassPath)
98- }
99-
100108 def compileTaskClasspath = it. classpath
101109 def rawClassesDir = it. destinationDirectory
102110
103- def additionalClassPath = findAdditionalClassPath(extension, it . name )
111+ def additionalClassPath = findAdditionalClassPath(extension)
104112 it. inputs. files(additionalClassPath)
105113
106114 def instrumentingClassPath = project. objects. fileCollection()
@@ -117,7 +125,6 @@ class InstrumentPlugin implements Plugin<Project> {
117125 InstrumentPostProcessingAction ,
118126 javaVersion,
119127 plugins,
120- pluginClassPath,
121128 instrumentingClassPath,
122129 rawClassesDir,
123130 )
@@ -128,11 +135,11 @@ class InstrumentPlugin implements Plugin<Project> {
128135 }
129136 }
130137
131- private static List<Provider<Directory > > findAdditionalClassPath (InstrumentExtension extension , String taskName ) {
132- return extension. additionalClasspath. getOrDefault(taskName , []). collect { dirProperty ->
138+ private static List<Provider<Directory > > findAdditionalClassPath (InstrumentExtension extension ) {
139+ return extension. additionalClasspath. getOrDefault(' instrumentJava ' , []). collect { dirProperty ->
133140 dirProperty. map {
134141 def fileName = it. asFile. name
135- it. dir(" ../${ fileName.replaceFirst('^main', 'raw')} " )
142+ it. dir(" ../${ fileName.replaceFirst('^main', 'raw')} " ) // TODO there's a hidden contract here
136143 }
137144 }
138145 }
@@ -148,48 +155,50 @@ abstract class InstrumentPostProcessingAction implements Action<AbstractCompile>
148155
149156 @Inject
150157 abstract Project getProject ()
158+
151159 @Inject
152160 abstract JavaToolchainService getJavaToolchainService ()
161+
153162 @Inject
154163 abstract BuildInvocationDetails getInvocationDetails ()
164+
155165 @Inject
156166 abstract WorkerExecutor getWorkerExecutor ()
157167
158168 final String javaVersion
159169 final ListProperty<String > plugins
160- final ConfigurableFileCollection pluginClassPath
161- final ConfigurableFileCollection instrumentingClassPath
170+ final FileCollection instrumentingClassPath
162171 final DirectoryProperty rawClassesDirectory
163172
164173 @Inject
165174 InstrumentPostProcessingAction (
166175 String javaVersion ,
167176 ListProperty<String > plugins ,
168- ConfigurableFileCollection pluginClassPath ,
169- ConfigurableFileCollection instrumentingClassPath ,
177+ FileCollection instrumentingClassPath ,
170178 DirectoryProperty rawClassesDir
171179 ) {
172180 this . javaVersion = javaVersion
173181 this . plugins = plugins
174- this . pluginClassPath = pluginClassPath
175182 this . instrumentingClassPath = instrumentingClassPath
176183 this . rawClassesDirectory = rawClassesDir
177184 }
178185
179186 @Override
180187 void execute (AbstractCompile task ) {
181188 logger. info(
182- " values: " +
183- " javaVersion=${ javaVersion} , " +
184- " plugins=${ plugins.get()} , " +
185- " pluginClassPath=${ pluginClassPath.files} , " +
186- " instrumentingClassPath=${ instrumentingClassPath.files} , " +
187- " rawClassesDirectory=${ rawClassesDirectory.get().asFile} "
189+ " [InstrumentPostProcessingAction] About to instrument classes \n " +
190+ " javaVersion=${ javaVersion} , \n " +
191+ " plugins=${ plugins.get()} , \n " +
192+ " instrumentingClassPath=${ instrumentingClassPath.files} , \n " +
193+ " rawClassesDirectory=${ rawClassesDirectory.get().asFile} "
188194 )
189195 def postCompileAction = this
190196 workQueue(). submit(InstrumentAction . class, parameters -> {
191197 parameters. buildStartedTime. set(invocationDetails. buildStartedTime)
192- parameters. pluginClassPath. from(postCompileAction. pluginClassPath)
198+ parameters. pluginClassPath. from(
199+ project. configurations. findByName(InstrumentPlugin . INSTRUMENT_PLUGIN_CLASSPATH_CONFIGURATION )
200+ ?: project. files()
201+ )
193202 parameters. plugins. set(postCompileAction. plugins)
194203 parameters. instrumentingClassPath. setFrom(postCompileAction. instrumentingClassPath)
195204 parameters. classesDirectory. set(postCompileAction. rawClassesDirectory)
@@ -249,12 +258,12 @@ abstract class InstrumentAction implements WorkAction<InstrumentWorkParameters>
249258 Path tmpSourceDir = parameters. tmpDirectory. get(). asFile. toPath()
250259
251260 // Delete tmpSourceDir contents recursively
252- if (tmpSourceDir . exists()) {
261+ if (Files . exists(tmpSourceDir )) {
253262 Files . walk(tmpSourceDir)
254263 .sorted(Comparator . reverseOrder())
255264 .forEach { p ->
256265 if (! p. equals(tmpSourceDir)) {
257- java.nio.file. Files. deleteIfExists(p)
266+ Files . deleteIfExists(p)
258267 }
259268 }
260269 }
@@ -267,7 +276,7 @@ abstract class InstrumentAction implements WorkAction<InstrumentWorkParameters>
267276 )
268277
269278 ClassLoader instrumentingCL = createClassLoader(parameters. instrumentingClassPath, pluginCL)
270- InstrumentingPlugin . instrumentClasses(plugins, instrumentingCL, tmpSourceDir, classesDirectory)
279+ InstrumentingPlugin . instrumentClasses(plugins, instrumentingCL, tmpSourceDir. toFile() , classesDirectory. toFile() )
271280 }
272281
273282 static ClassLoader createClassLoader (cp , parent = InstrumentAction . classLoader) {
0 commit comments