Merge "Introduce ExperimentalProcessingAPI annotation for room processing APIs" into androidx-main
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryType.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryType.kt
index 9a0f332..276651e 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryType.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryType.kt
@@ -95,6 +95,12 @@
         checkApi = RunApiTasks.No("Annotation Processor"),
         compilationTarget = CompilationTarget.HOST
     ),
+    ANNOTATION_PROCESSOR_UTILS(
+        publish = Publish.SNAPSHOT_AND_RELEASE,
+        sourceJars = true,
+        checkApi = RunApiTasks.No("Annotation Processor Helper Library"),
+        compilationTarget = CompilationTarget.HOST
+    ),
     OTHER_CODE_PROCESSOR(
         publish = Publish.SNAPSHOT_AND_RELEASE,
         sourceJars = false,
diff --git a/room/compiler-processing-testing/build.gradle b/room/compiler-processing-testing/build.gradle
index 109c5db..e310d6e 100644
--- a/room/compiler-processing-testing/build.gradle
+++ b/room/compiler-processing-testing/build.gradle
@@ -17,6 +17,8 @@
 import androidx.build.LibraryGroups
 import androidx.build.LibraryType
 import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
 import static androidx.build.dependencies.DependenciesKt.*
 
 plugins {
@@ -68,12 +70,18 @@
 tasks.named("compileKotlin").configure {
     dependsOn(writeTestPropsTask)
 }
+// enable opt in only for tests so that we don't create non experimental APIs by mistake
+// in the source.
+tasks.named("compileTestKotlin", KotlinCompile.class).configure {
+    it.kotlinOptions {
+        freeCompilerArgs += ["-Xopt-in=androidx.room.compiler.processing.ExperimentalProcessingApi"]
+    }
+}
 
 androidx {
     name = "AndroidX Room XProcessor Testing"
-    type = LibraryType.ANNOTATION_PROCESSOR
+    type = LibraryType.ANNOTATION_PROCESSOR_UTILS
     mavenGroup = LibraryGroups.ROOM
     inceptionYear = "2020"
-    publish = Publish.NONE
     description = "Testing helpers for Room XProcessing APIs"
 }
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticJavacProcessor.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticJavacProcessor.kt
index d80bd31..95ede95 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticJavacProcessor.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticJavacProcessor.kt
@@ -20,6 +20,7 @@
 import javax.lang.model.SourceVersion
 
 @Suppress("VisibleForTests")
+@ExperimentalProcessingApi
 class SyntheticJavacProcessor private constructor(
     private val impl: SyntheticProcessorImpl
 ) : JavacTestProcessor(), SyntheticProcessor by impl {
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt
index d1bceda..c2f0594 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package androidx.room.compiler.processing
 
 import androidx.room.compiler.processing.util.XTestInvocation
@@ -23,6 +22,7 @@
 import com.google.devtools.ksp.processing.SymbolProcessor
 import com.google.devtools.ksp.symbol.KSAnnotated
 
+@ExperimentalProcessingApi
 class SyntheticKspProcessor private constructor(
     private val impl: SyntheticProcessorImpl
 ) : SymbolProcessor, SyntheticProcessor by impl {
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticProcessor.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticProcessor.kt
index 8cd0076..dbf283c 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticProcessor.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticProcessor.kt
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package androidx.room.compiler.processing
 
 import androidx.room.compiler.processing.util.RecordingXMessager
@@ -22,6 +21,7 @@
 /**
  * Common interface for SyntheticProcessors that we create for testing.
  */
+@ExperimentalProcessingApi
 internal interface SyntheticProcessor {
     /**
      * List of invocations that was sent to the test code.
@@ -54,6 +54,7 @@
  * Helper class to implement [SyntheticProcessor] processor that handles the communication with
  * the testing infrastructure.
  */
+@ExperimentalProcessingApi
 internal class SyntheticProcessorImpl(
     handlers: List<(XTestInvocation) -> Unit>
 ) : SyntheticProcessor {
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationResultSubject.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationResultSubject.kt
index 4aea1fa..182a8e4 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationResultSubject.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationResultSubject.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing.util
 
+import androidx.room.compiler.processing.ExperimentalProcessingApi
 import androidx.room.compiler.processing.SyntheticJavacProcessor
 import androidx.room.compiler.processing.SyntheticProcessor
 import androidx.room.compiler.processing.util.runner.CompilationTestRunner
@@ -34,6 +35,7 @@
 /**
  * Holds the information about a test compilation result.
  */
+@ExperimentalProcessingApi
 abstract class CompilationResult internal constructor(
     /**
      * The test infra which run this test
@@ -87,6 +89,7 @@
  * Truth subject that can run assertions on the [CompilationResult].
  * see: [XTestInvocation.assertCompilationResult]
  */
+@ExperimentalProcessingApi
 class CompilationResultSubject(
     failureMetadata: FailureMetadata,
     val compilationResult: CompilationResult,
@@ -370,7 +373,7 @@
         }
     }
 }
-
+@ExperimentalProcessingApi
 internal class JavaCompileTestingCompilationResult(
     testRunner: CompilationTestRunner,
     @Suppress("unused")
@@ -397,7 +400,7 @@
         }
     }
 }
-
+@ExperimentalProcessingApi
 internal class KotlinCompileTestingCompilationResult(
     testRunner: CompilationTestRunner,
     @Suppress("unused")
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/ProcessorTestExt.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/ProcessorTestExt.kt
index cb942f4..5221c8c 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/ProcessorTestExt.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/ProcessorTestExt.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing.util
 
+import androidx.room.compiler.processing.ExperimentalProcessingApi
 import androidx.room.compiler.processing.util.runner.CompilationTestRunner
 import androidx.room.compiler.processing.util.runner.JavacCompilationTestRunner
 import androidx.room.compiler.processing.util.runner.KaptCompilationTestRunner
@@ -27,6 +28,7 @@
 import java.io.ByteArrayOutputStream
 import java.io.File
 
+@ExperimentalProcessingApi
 private fun runTests(
     params: TestCompilationParameters,
     vararg runners: CompilationTestRunner
@@ -68,6 +70,7 @@
     assertThat(runCount).isAtLeast(minTestCount)
 }
 
+@ExperimentalProcessingApi
 fun runProcessorTestWithoutKsp(
     sources: List<Source> = emptyList(),
     classpath: List<File> = emptyList(),
@@ -99,6 +102,7 @@
  * assertion on [XTestInvocation.assertCompilationResult] which expects a failure (e.g. checking
  * errors).
  */
+@ExperimentalProcessingApi
 fun runProcessorTest(
     sources: List<Source> = emptyList(),
     classpath: List<File> = emptyList(),
@@ -108,6 +112,7 @@
 /**
  * @see runProcessorTest
  */
+@ExperimentalProcessingApi
 fun runProcessorTest(
     sources: List<Source> = emptyList(),
     classpath: List<File> = emptyList(),
@@ -134,6 +139,7 @@
  *
  * @see runProcessorTest
  */
+@ExperimentalProcessingApi
 fun runJavaProcessorTest(
     sources: List<Source>,
     classpath: List<File> = emptyList(),
@@ -147,6 +153,7 @@
 /**
  * @see runJavaProcessorTest
  */
+@ExperimentalProcessingApi
 fun runJavaProcessorTest(
     sources: List<Source>,
     classpath: List<File> = emptyList(),
@@ -165,6 +172,7 @@
 /**
  * Runs the test only with kapt compilation backend
  */
+@ExperimentalProcessingApi
 fun runKaptTest(
     sources: List<Source>,
     classpath: List<File> = emptyList(),
@@ -178,6 +186,7 @@
 /**
  * @see runKaptTest
  */
+@ExperimentalProcessingApi
 fun runKaptTest(
     sources: List<Source>,
     classpath: List<File> = emptyList(),
@@ -196,6 +205,7 @@
 /**
  * Runs the test only with ksp compilation backend
  */
+@ExperimentalProcessingApi
 fun runKspTest(
     sources: List<Source>,
     classpath: List<File> = emptyList(),
@@ -209,6 +219,7 @@
 /**
  * @see runKspTest
  */
+@ExperimentalProcessingApi
 fun runKspTest(
     sources: List<Source>,
     classpath: List<File> = emptyList(),
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/XTestInvocation.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/XTestInvocation.kt
index a8b1502..1dcf191 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/XTestInvocation.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/XTestInvocation.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing.util
 
+import androidx.room.compiler.processing.ExperimentalProcessingApi
 import androidx.room.compiler.processing.XProcessingEnv
 import androidx.room.compiler.processing.XRoundEnv
 import com.google.common.truth.Truth
@@ -24,6 +25,7 @@
 /**
  * Data holder for XProcessing tests to access the processing environment.
  */
+@ExperimentalProcessingApi
 class XTestInvocation(
     processingEnv: XProcessingEnv,
     roundEnv: XRoundEnv
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/CompilationTestRunner.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/CompilationTestRunner.kt
index 43bca34..ba50be6 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/CompilationTestRunner.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/CompilationTestRunner.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing.util.runner
 
+import androidx.room.compiler.processing.ExperimentalProcessingApi
 import androidx.room.compiler.processing.util.CompilationResult
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.XTestInvocation
@@ -24,6 +25,7 @@
 /**
  * Common interface for compilation tests
  */
+@ExperimentalProcessingApi
 internal interface CompilationTestRunner {
     // user visible name that we can print in assertions
     val name: String
@@ -33,6 +35,7 @@
     fun compile(params: TestCompilationParameters): CompilationResult
 }
 
+@ExperimentalProcessingApi
 internal data class TestCompilationParameters(
     val sources: List<Source> = emptyList(),
     val classpath: List<File> = emptyList(),
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/JavacCompilationTestRunner.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/JavacCompilationTestRunner.kt
index a70f146..9097b02 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/JavacCompilationTestRunner.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/JavacCompilationTestRunner.kt
@@ -16,12 +16,14 @@
 
 package androidx.room.compiler.processing.util.runner
 
+import androidx.room.compiler.processing.ExperimentalProcessingApi
 import androidx.room.compiler.processing.SyntheticJavacProcessor
 import androidx.room.compiler.processing.util.CompilationResult
 import androidx.room.compiler.processing.util.JavaCompileTestingCompilationResult
 import androidx.room.compiler.processing.util.Source
 import com.google.testing.compile.Compiler
 
+@ExperimentalProcessingApi
 internal object JavacCompilationTestRunner : CompilationTestRunner {
 
     override val name: String = "javac"
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KaptCompilationTestRunner.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KaptCompilationTestRunner.kt
index 39426f3..6e1f860 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KaptCompilationTestRunner.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KaptCompilationTestRunner.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing.util.runner
 
+import androidx.room.compiler.processing.ExperimentalProcessingApi
 import androidx.room.compiler.processing.SyntheticJavacProcessor
 import androidx.room.compiler.processing.util.CompilationResult
 import androidx.room.compiler.processing.util.KotlinCompilationUtil
@@ -23,6 +24,7 @@
 import com.tschuchort.compiletesting.KotlinCompilation
 import java.io.ByteArrayOutputStream
 
+@ExperimentalProcessingApi
 internal object KaptCompilationTestRunner : CompilationTestRunner {
 
     override val name: String = "kapt"
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KspCompilationTestRunner.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KspCompilationTestRunner.kt
index a927d56c..3ebaa0b 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KspCompilationTestRunner.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KspCompilationTestRunner.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing.util.runner
 
+import androidx.room.compiler.processing.ExperimentalProcessingApi
 import androidx.room.compiler.processing.SyntheticKspProcessor
 import androidx.room.compiler.processing.util.CompilationResult
 import androidx.room.compiler.processing.util.KotlinCompilationUtil
@@ -30,6 +31,7 @@
 import java.io.File
 import javax.tools.Diagnostic
 
+@ExperimentalProcessingApi
 internal object KspCompilationTestRunner : CompilationTestRunner {
 
     override val name: String = "ksp"
diff --git a/room/compiler-processing/build.gradle b/room/compiler-processing/build.gradle
index 362439f..0f69d5c 100644
--- a/room/compiler-processing/build.gradle
+++ b/room/compiler-processing/build.gradle
@@ -49,7 +49,8 @@
 tasks.withType(KotlinCompile).configureEach {
     kotlinOptions {
         freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn",
-                             "-Xopt-in=kotlin.contracts.ExperimentalContracts"]
+                             "-Xopt-in=kotlin.contracts.ExperimentalContracts",
+                             "-Xopt-in=androidx.room.compiler.processing.ExperimentalProcessingApi"]
     }
 }
 
@@ -60,7 +61,7 @@
 
 androidx {
     name = "AndroidX Room XProcessor"
-    type = LibraryType.ANNOTATION_PROCESSOR
+    type = LibraryType.ANNOTATION_PROCESSOR_UTILS
     mavenGroup = LibraryGroups.ROOM
     inceptionYear = "2020"
     description = "Processing Environment Abstraction for AndroidX Room"
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ExperimentalProcessingApi.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ExperimentalProcessingApi.kt
new file mode 100644
index 0000000..00a7604
--- /dev/null
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ExperimentalProcessingApi.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * 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 androidx.room.compiler.processing
+
+/**
+ * These APIs are experimental and are not designed to be used by external artifacts.
+ *
+ * Make sure to jarjar them if you are using these APIs in your own processor.
+ */
+@RequiresOptIn
+@Retention(AnnotationRetention.BINARY)
+annotation class ExperimentalProcessingApi
\ No newline at end of file
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/JavacTestProcessor.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/JavacTestProcessor.kt
index 134cc91..aa9b92a 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/JavacTestProcessor.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/JavacTestProcessor.kt
@@ -29,6 +29,7 @@
  * in Auto Common.
  */
 @VisibleForTesting
+@ExperimentalProcessingApi
 abstract class JavacTestProcessor : AbstractProcessor() {
     val xProcessingEnv by lazy {
         // lazily create this as it is not available on construction time
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XProcessingEnv.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XProcessingEnv.kt
index 2bd34f4..c7e67cc 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XProcessingEnv.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XProcessingEnv.kt
@@ -29,9 +29,10 @@
 /**
  * API for a Processor that is either backed by Java's Annotation Processing API or KSP.
  */
+@ExperimentalProcessingApi
 interface XProcessingEnv {
 
-    val backend: XProcessingEnv.Backend
+    val backend: Backend
     /**
      * The logger interface to log messages
      */
diff --git a/room/compiler/build.gradle b/room/compiler/build.gradle
index e5dade8..f31a895 100644
--- a/room/compiler/build.gradle
+++ b/room/compiler/build.gradle
@@ -246,7 +246,8 @@
 tasks.withType(KotlinCompile).configureEach {
     kotlinOptions {
         freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn",
-                             "-Xopt-in=kotlin.contracts.ExperimentalContracts"]
+                             "-Xopt-in=kotlin.contracts.ExperimentalContracts",
+                             "-Xopt-in=androidx.room.compiler.processing.ExperimentalProcessingApi"]
     }
 }