diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv index 87ea3b2..c10149d 100644 --- a/LICENSE-3rdparty.csv +++ b/LICENSE-3rdparty.csv @@ -9,6 +9,7 @@ import,com.android.tools.build,Apache-2.0,Copyright (C) 2013 The Android Open So import,com.squareup.okhttp3,Apache-2.0,"Copyright 2019 Square, Inc" import,org.jetbrains,Apache-2.0,Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors import,org.jetbrains.kotlin,Apache-2.0,Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors +import,com.google.auto.service,Apache-2.0,Copyright 2013 Google LLC import,org.json,JSON,Copyright (c) 2002 JSON.org import(test),com.github.xgouchet.Elmyr,MIT,Copyright 2017-2019 Xavier F. Gouchet import(test),net.wuerl.kotlin,Apache-2.0,Copyright 2016 Andreas Würl diff --git a/dd-sdk-android-gradle-plugin/build.gradle.kts b/dd-sdk-android-gradle-plugin/build.gradle.kts index a4cc008..397d1f7 100644 --- a/dd-sdk-android-gradle-plugin/build.gradle.kts +++ b/dd-sdk-android-gradle-plugin/build.gradle.kts @@ -16,6 +16,7 @@ plugins { // Build id("java-gradle-plugin") kotlin("jvm") + kotlin("kapt") // Publish `maven-publish` @@ -46,6 +47,10 @@ dependencies { testImplementation(libs.okHttpMock) testImplementation(libs.androidToolsPluginGradle) testImplementation(libs.kotlinPluginGradle) + + compileOnly(libs.kotlinCompilerEmbeddable) + compileOnly(libs.autoServiceAnnotation) + kapt(libs.autoService) } kotlinConfig() diff --git a/dd-sdk-android-gradle-plugin/src/main/kotlin/com/datadog/gradle/plugin/kcp/ComposeTagTransformer.kt b/dd-sdk-android-gradle-plugin/src/main/kotlin/com/datadog/gradle/plugin/kcp/ComposeTagTransformer.kt new file mode 100644 index 0000000..104c5a8 --- /dev/null +++ b/dd-sdk-android-gradle-plugin/src/main/kotlin/com/datadog/gradle/plugin/kcp/ComposeTagTransformer.kt @@ -0,0 +1,12 @@ +package com.datadog.gradle.plugin.kcp + +import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext +import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext +import org.jetbrains.kotlin.cli.common.messages.MessageCollector + +// TODO RUM-8583: Implement Compose semantics tag instrumentation. +@Suppress("UnusedPrivateProperty") +internal class ComposeTagTransformer( + private val messageCollector: MessageCollector, + private val pluginContext: IrPluginContext +) : IrElementTransformerVoidWithContext() diff --git a/dd-sdk-android-gradle-plugin/src/main/kotlin/com/datadog/gradle/plugin/kcp/DatadogIrExtension.kt b/dd-sdk-android-gradle-plugin/src/main/kotlin/com/datadog/gradle/plugin/kcp/DatadogIrExtension.kt new file mode 100644 index 0000000..524bb49 --- /dev/null +++ b/dd-sdk-android-gradle-plugin/src/main/kotlin/com/datadog/gradle/plugin/kcp/DatadogIrExtension.kt @@ -0,0 +1,20 @@ +package com.datadog.gradle.plugin.kcp + +import org.jetbrains.kotlin.backend.common.extensions.FirIncompatiblePluginAPI +import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension +import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext +import org.jetbrains.kotlin.cli.common.messages.MessageCollector +import org.jetbrains.kotlin.ir.declarations.IrModuleFragment + +/** + * The extension registers all the visitors that need to explore the code being compiled. + */ +@FirIncompatiblePluginAPI +class DatadogIrExtension(private val messageCollector: MessageCollector) : IrGenerationExtension { + + override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) { + val composeTagTransformer = ComposeTagTransformer(messageCollector, pluginContext) + + moduleFragment.accept(composeTagTransformer, null) + } +} diff --git a/dd-sdk-android-gradle-plugin/src/main/kotlin/com/datadog/gradle/plugin/kcp/DatadogPluginRegistrar.kt b/dd-sdk-android-gradle-plugin/src/main/kotlin/com/datadog/gradle/plugin/kcp/DatadogPluginRegistrar.kt new file mode 100644 index 0000000..b631e16 --- /dev/null +++ b/dd-sdk-android-gradle-plugin/src/main/kotlin/com/datadog/gradle/plugin/kcp/DatadogPluginRegistrar.kt @@ -0,0 +1,32 @@ +package com.datadog.gradle.plugin.kcp + +import com.google.auto.service.AutoService +import org.jetbrains.kotlin.backend.common.extensions.FirIncompatiblePluginAPI +import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +import org.jetbrains.kotlin.cli.common.messages.MessageCollector +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar +import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi +import org.jetbrains.kotlin.config.CommonConfigurationKeys +import org.jetbrains.kotlin.config.CompilerConfiguration + +/** + * The Registrar makes the plugin visible to the Kotlin Compiler, and provides the extensions to use. + */ +@OptIn(ExperimentalCompilerApi::class) +@AutoService(CompilerPluginRegistrar::class) +class DatadogPluginRegistrar : CompilerPluginRegistrar() { + + // Supports Kotlin 2.x compiler + override val supportsK2 = true + + @OptIn(FirIncompatiblePluginAPI::class) + override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) { + val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE) + val useFir = configuration.getBoolean(CommonConfigurationKeys.USE_FIR) + + if (!useFir) { + IrGenerationExtension.registerExtension(DatadogIrExtension(messageCollector)) + } + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a4304a4..53323d4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -40,6 +40,10 @@ kotlinGrammarParser = "c35b50fa44" datadogSdk = "2.18.0" datadogPluginGradle = "1.15.0" +# Kotlin Compiler Plugin +kotlinCompilerEmbeddable = "1.8.20" +autoService = "1.0.1" + [libraries] # Classpaths @@ -93,6 +97,11 @@ fuzzyWuzzy = { module = "me.xdrop:fuzzywuzzy", version.ref = "fuzzyWuzzy" } datadogSdkRum = { module = "com.datadoghq:dd-sdk-android-rum", version.ref = "datadogSdk" } datadogPluginGradle = { module = "com.datadoghq:dd-sdk-android-gradle-plugin", version.ref = "datadogPluginGradle" } +# Kotlin Compiler Plugin +kotlinCompilerEmbeddable = { module = "org.jetbrains.kotlin:kotlin-compiler-embeddable", version.ref = "kotlinCompilerEmbeddable" } +autoService = { module = "com.google.auto.service:auto-service", version.ref = "autoService" } +autoServiceAnnotation = { module = "com.google.auto.service:auto-service-annotations", version.ref = "autoService" } + [bundles] jUnit5 = [