@@ -10,6 +10,7 @@ import org.gradle.api.tasks.JavaExec
1010import org.gradle.api.tasks.SourceSet.MAIN_SOURCE_SET_NAME
1111import org.gradle.api.tasks.SourceSet.TEST_SOURCE_SET_NAME
1212import org.gradle.api.tasks.SourceSetContainer
13+ import org.gradle.api.tasks.TaskProvider
1314import org.gradle.api.tasks.compile.AbstractCompile
1415import org.gradle.api.tasks.testing.Test
1516import org.gradle.jvm.tasks.Jar
@@ -27,6 +28,8 @@ import java.nio.file.Paths
2728import javax.inject.Inject
2829
2930private const val CALL_SITE_INSTRUMENTER_MAIN_CLASS = " datadog.trace.plugin.csi.PluginApplication"
31+ private const val CSI = " csi"
32+ private const val CSI_SOURCE_SET = CSI
3033
3134abstract class CallSiteInstrumentationPlugin : Plugin <Project >{
3235 @get:Inject
@@ -36,19 +39,17 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
3639 project.pluginManager.apply (JavaPlugin ::class )
3740
3841 // Create plugin extension
39- val extension = project.extensions.create<CallSiteInstrumentationExtension >(" csi" )
40- project.afterEvaluate {
41- configureSourceSets(project, extension)
42- createTasks(project, extension)
43- }
42+ val extension = project.extensions.create<CallSiteInstrumentationExtension >(CSI )
43+ configureSourceSets(project, extension)
44+ createTasks(project, extension)
4445 }
4546
4647 private fun configureSourceSets (project : Project , extension : CallSiteInstrumentationExtension ) {
4748 // create a new source set for the csi files
4849 val targetFolder = newBuildFolder(project, extension.targetFolder.get().asFile.toString())
4950 val sourceSets = project.sourceSets
5051 val mainSourceSet = sourceSets.named(MAIN_SOURCE_SET_NAME ).get()
51- val csiSourceSet = sourceSets.create(" csi " ) {
52+ val csiSourceSet = sourceSets.create(CSI_SOURCE_SET ) {
5253 compileClasspath + = mainSourceSet.output // mainly needed for the plugin tests
5354 annotationProcessorPath + = mainSourceSet.annotationProcessorPath
5455 java.srcDir(targetFolder)
@@ -96,9 +97,9 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
9697 }
9798
9899 private fun createTasks (project : Project , extension : CallSiteInstrumentationExtension ) {
99- registerGenerateCallSiteTask(project, extension, " compileJava" )
100- val targetFolder = extension.targetFolder.get().asFile
100+ registerGenerateCallSiteTask(project, extension, project.tasks.named<AbstractCompile >(" compileJava" ))
101101
102+ val targetFolder = extension.targetFolder.get().asFile
102103 project.tasks.withType<AbstractCompile >().matching {
103104 task -> task.name.startsWith(" compileTest" )
104105 }.configureEach {
@@ -120,25 +121,28 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
120121
121122 private fun registerGenerateCallSiteTask (project : Project ,
122123 csiExtension : CallSiteInstrumentationExtension ,
123- compileTaskName : String ) {
124- val taskName = compileTaskName.replace(" compile" , " generateCallSite" )
125- val rootFolder = csiExtension.rootFolder.getOrElse(project.rootDir)
124+ mainCompileTask : TaskProvider <AbstractCompile >) {
125+ val genTaskName = mainCompileTask.name.replace(" compile" , " generateCallSite" )
126126 val pluginJarFile = Paths .get(
127- rootFolder.toString(),
127+ csiExtension. rootFolder.getOrElse(project.rootDir) .toString(),
128128 " buildSrc" ,
129129 " call-site-instrumentation-plugin" ,
130130 " build" ,
131131 " libs" ,
132132 " call-site-instrumentation-plugin-all.jar"
133133 ).toFile()
134- val compileTask = project.tasks.named< AbstractCompile >(compileTaskName)
135- val callSiteGeneratorTask = project.tasks.register<JavaExec >(taskName ) {
134+
135+ val callSiteGeneratorTask = project.tasks.register<JavaExec >(genTaskName ) {
136136 // Task description
137137 group = " call site instrumentation"
138- description = " Generates call sites from $compileTaskName "
138+ description = " Generates call sites from ${mainCompileTask.name} "
139+
140+ // Remote Debug
141+ // jvmArgs("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:5005")
142+
139143 // Task input & output
140144 val output = csiExtension.targetFolder
141- val inputProvider = compileTask.map { it.destinationDirectory.get() }
145+ val inputProvider = mainCompileTask.flatMap { it.destinationDirectory }
142146 inputs.dir(inputProvider)
143147 outputs.dir(output)
144148
@@ -152,28 +156,37 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
152156
153157 // Write the call site instrumenter arguments into a temporary file
154158 doFirst {
155- val sourceSetOutput = project.sourceSets.matching { it.name.startsWith(MAIN_SOURCE_SET_NAME ) }.flatMap {
156- it.output.classesDirs.files
157- }
158- val programClassPath = csiExtension.configurations.get().flatMap {
159- it.files
159+ val callsitesClassPath = project.objects.fileCollection()
160+ .from(
161+ project.sourceSets.named(MAIN_SOURCE_SET_NAME ).map { it.output },
162+ csiExtension.configurations
163+ )
164+
165+ if (project.logger.isInfoEnabled) {
166+ project.logger.info(
167+ " Aggregated CSI classpath:\n {}" ,
168+ callsitesClassPath.toSet().sorted().joinToString(" \n " ) { it.toString() }
169+ )
160170 }
161171
162- val arguments = listOf (
163- csiExtension.srcFolder.get().asFile.toString(),
164- inputProvider.get().asFile.toString(),
165- output.get().asFile.toString(),
166- csiExtension.suffix.get(),
167- csiExtension.reporters.get().joinToString(" ," )
168- ) + (sourceSetOutput + programClassPath).map { it.toString() }
172+ val arguments = buildList {
173+ add(csiExtension.srcFolder.get().asFile.toString())
174+ add(inputProvider.get().asFile.toString())
175+ add(output.get().asFile.toString())
176+ add(csiExtension.suffix.get())
177+ add(csiExtension.reporters.get().joinToString(" ," ))
178+
179+ // module program classpath
180+ addAll(callsitesClassPath.map { it.toString() })
181+ }
169182
170183 val argumentFile = newTempFile(temporaryDir, " call-site-arguments" )
171184 Files .write(argumentFile.toPath(), arguments)
172185 args(argumentFile.toString())
173186 }
174187
175188 // make task depends on compile
176- dependsOn(compileTask )
189+ dependsOn(mainCompileTask )
177190 }
178191
179192 // make all sourcesets' class tasks depend on call site generator
@@ -185,7 +198,7 @@ abstract class CallSiteInstrumentationPlugin : Plugin<Project>{
185198 }
186199
187200 // compile generated sources
188- sourceSets.named(" csi " ) {
201+ sourceSets.named(CSI_SOURCE_SET ) {
189202 project.tasks.named(compileJavaTaskName) {
190203 dependsOn(callSiteGeneratorTask)
191204 }
0 commit comments