@@ -2,15 +2,13 @@ import org.gradle.api.Action
22import org.gradle.api.Plugin
33import org.gradle.api.Project
44import org.gradle.api.file.ConfigurableFileCollection
5- import org.gradle.api.file.Directory
65import org.gradle.api.file.DirectoryProperty
76import org.gradle.api.file.FileCollection
87import org.gradle.api.invocation.BuildInvocationDetails
98import org.gradle.api.logging.Logger
109import org.gradle.api.logging.Logging
1110import org.gradle.api.provider.ListProperty
1211import org.gradle.api.provider.Property
13- import org.gradle.api.provider.Provider
1412import org.gradle.api.tasks.SourceSet
1513import org.gradle.api.tasks.SourceSetContainer
1614import org.gradle.api.tasks.compile.AbstractCompile
@@ -102,20 +100,21 @@ class InstrumentPlugin implements Plugin<Project> {
102100 javaVersion = javaVersion ?: DEFAULT_JAVA_VERSION // null not accepted
103101 it. inputs. property(" javaVersion" , javaVersion)
104102
105- def plugins = extension. plugins
106- it. inputs. property(" plugins" , plugins)
103+ it. inputs. property(" plugins" , extension. plugins)
107104
108- def compileTaskClasspath = it. classpath
109- def rawClassesDir = it. destinationDirectory
105+ it. inputs. files(extension. additionalClasspath)
110106
111- def additionalClassPath = findAdditionalClassPath(extension)
112- it. inputs. files(additionalClassPath)
107+ // Temporary location for raw (un-instrumented) classes
108+ DirectoryProperty tmpUninstrumentedClasses = project. objects. directoryProperty(). value(
109+ project. layout. buildDirectory. dir(" tmp/${ it.name} -raw-classes" )
110+ )
113111
114- def instrumentingClassPath = project. objects. fileCollection()
112+ // Class path to use for instrumentation post-processing
113+ ConfigurableFileCollection instrumentingClassPath = project. objects. fileCollection()
115114 instrumentingClassPath. setFrom(
116- compileTaskClasspath ,
117- rawClassesDir ,
118- additionalClassPath,
115+ it . classpath ,
116+ extension . additionalClasspath ,
117+ tmpUninstrumentedClasses
119118 )
120119
121120 // This were the post processing happens, i.e. were the instrumentation is applied
@@ -124,30 +123,22 @@ class InstrumentPlugin implements Plugin<Project> {
124123 project. objects. newInstance(
125124 InstrumentPostProcessingAction ,
126125 javaVersion,
127- plugins,
126+ extension . plugins,
128127 instrumentingClassPath,
129- rawClassesDir,
128+ it. destinationDirectory,
129+ tmpUninstrumentedClasses
130130 )
131131 )
132132 logger. info(" [InstrumentPlugin] Configured post-compile instrumentation for $compileTaskName for source-set $sourceSetName " )
133133 }
134134 }
135135 }
136136 }
137-
138- private static List<Provider<Directory > > findAdditionalClassPath (InstrumentExtension extension ) {
139- return extension. additionalClasspath. getOrDefault(' instrumentJava' , []). collect { dirProperty ->
140- dirProperty. map {
141- def fileName = it. asFile. name
142- it. dir(" ../${ fileName.replaceFirst('^main', 'raw')} " ) // TODO there's a hidden contract here
143- }
144- }
145- }
146137}
147138
148139abstract class InstrumentExtension {
149140 abstract ListProperty<String > getPlugins ()
150- Map< String / * taskName */ , List <DirectoryProperty >> additionalClasspath = [:]
141+ abstract ListProperty <DirectoryProperty > getAdditionalClasspath ()
151142}
152143
153144abstract class InstrumentPostProcessingAction implements Action<AbstractCompile > {
@@ -165,22 +156,26 @@ abstract class InstrumentPostProcessingAction implements Action<AbstractCompile>
165156 @Inject
166157 abstract WorkerExecutor getWorkerExecutor ()
167158
159+ // Those cannot be private other wise Groovy will fail at runtime with a missing property ex
168160 final String javaVersion
169161 final ListProperty<String > plugins
170162 final FileCollection instrumentingClassPath
171- final DirectoryProperty rawClassesDirectory
163+ final DirectoryProperty compilerOutputDirectory
164+ final DirectoryProperty tmpDirectory
172165
173166 @Inject
174167 InstrumentPostProcessingAction (
175168 String javaVersion ,
176169 ListProperty<String > plugins ,
177170 FileCollection instrumentingClassPath ,
178- DirectoryProperty rawClassesDir
171+ DirectoryProperty compilerOutputDirectory ,
172+ DirectoryProperty tmpDirectory
179173 ) {
180174 this . javaVersion = javaVersion
181175 this . plugins = plugins
182176 this . instrumentingClassPath = instrumentingClassPath
183- this . rawClassesDirectory = rawClassesDir
177+ this . compilerOutputDirectory = compilerOutputDirectory
178+ this . tmpDirectory = tmpDirectory
184179 }
185180
186181 @Override
@@ -190,7 +185,7 @@ abstract class InstrumentPostProcessingAction implements Action<AbstractCompile>
190185 " javaVersion=${ javaVersion} , \n " +
191186 " plugins=${ plugins.get()} , \n " +
192187 " instrumentingClassPath=${ instrumentingClassPath.files} , \n " +
193- " rawClassesDirectory=${ rawClassesDirectory .get().asFile} "
188+ " rawClassesDirectory=${ compilerOutputDirectory .get().asFile} "
194189 )
195190 def postCompileAction = this
196191 workQueue(). submit(InstrumentAction . class, parameters -> {
@@ -201,8 +196,8 @@ abstract class InstrumentPostProcessingAction implements Action<AbstractCompile>
201196 )
202197 parameters. plugins. set(postCompileAction. plugins)
203198 parameters. instrumentingClassPath. setFrom(postCompileAction. instrumentingClassPath)
204- parameters. classesDirectory . set(postCompileAction. rawClassesDirectory )
205- parameters. tmpDirectory. set(project . layout . buildDirectory . dir( " tmp/ ${ task.name } -raw-classes " ) )
199+ parameters. compilerOutputDirectory . set(postCompileAction. compilerOutputDirectory )
200+ parameters. tmpDirectory. set(postCompileAction . tmpDirectory )
206201 })
207202 }
208203
@@ -227,7 +222,7 @@ interface InstrumentWorkParameters extends WorkParameters {
227222 ConfigurableFileCollection getPluginClassPath ()
228223 ListProperty<String > getPlugins ()
229224 ConfigurableFileCollection getInstrumentingClassPath ()
230- DirectoryProperty getClassesDirectory ()
225+ DirectoryProperty getCompilerOutputDirectory ()
231226 DirectoryProperty getTmpDirectory ()
232227}
233228
@@ -254,29 +249,29 @@ abstract class InstrumentAction implements WorkAction<InstrumentWorkParameters>
254249 }
255250 }
256251 }
257- Path classesDirectory = parameters. classesDirectory . get(). asFile. toPath()
258- Path tmpSourceDir = parameters. tmpDirectory. get(). asFile. toPath()
252+ Path classesDirectory = parameters. compilerOutputDirectory . get(). asFile. toPath()
253+ Path tmpUninstrumentedDir = parameters. tmpDirectory. get(). asFile. toPath()
259254
260- // Delete tmpSourceDir contents recursively
261- if (Files . exists(tmpSourceDir )) {
262- Files . walk(tmpSourceDir )
255+ // Delete previous tmpSourceDir contents recursively
256+ if (Files . exists(tmpUninstrumentedDir )) {
257+ Files . walk(tmpUninstrumentedDir )
263258 .sorted(Comparator . reverseOrder())
264259 .forEach { p ->
265- if (! p. equals(tmpSourceDir )) {
260+ if (! p. equals(tmpUninstrumentedDir )) {
266261 Files . deleteIfExists(p)
267262 }
268263 }
269264 }
270265
271266 Files . move(
272267 classesDirectory,
273- tmpSourceDir ,
268+ tmpUninstrumentedDir ,
274269 StandardCopyOption . REPLACE_EXISTING ,
275270 StandardCopyOption . ATOMIC_MOVE ,
276271 )
277272
278273 ClassLoader instrumentingCL = createClassLoader(parameters. instrumentingClassPath, pluginCL)
279- InstrumentingPlugin . instrumentClasses(plugins, instrumentingCL, tmpSourceDir . toFile(), classesDirectory. toFile())
274+ InstrumentingPlugin . instrumentClasses(plugins, instrumentingCL, tmpUninstrumentedDir . toFile(), classesDirectory. toFile())
280275 }
281276
282277 static ClassLoader createClassLoader (cp , parent = InstrumentAction . classLoader) {
0 commit comments