diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ExplicitApiIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ExplicitApiIT.kt
index 215b8aaa740..6f81690c8c8 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ExplicitApiIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ExplicitApiIT.kt
@@ -189,4 +189,85 @@ class ExplicitApiIT : KGPBaseTest() {
}
}
}
+
+ @DisplayName("Explicit api mode is enabled if added inside android extension")
+ @AndroidGradlePluginTests
+ @GradleAndroidTest
+ fun explicitApiInsideAndroidExtension(
+ gradleVersion: GradleVersion,
+ agpVersion: String,
+ jdkVersion: JdkVersions.ProvidedJdk
+ ) {
+ project(
+ "AndroidSimpleApp",
+ gradleVersion,
+ buildOptions = defaultBuildOptions.copy(
+ androidVersion = agpVersion,
+ logLevel = LogLevel.DEBUG,
+ ),
+ buildJdk = jdkVersion.location
+ ) {
+ buildGradle.modify {
+ it.replace(
+ "kotlin {",
+ """
+ |kotlin {
+ | explicitApiWarning()
+ """.trimMargin()
+ )
+ }
+ build(":compileDebugKotlin") {
+ assertTasksExecuted(":compileDebugKotlin")
+ assertCompilerArgument(":compileDebugKotlin", "-Xexplicit-api=warning")
+ }
+ build(":compileDebugUnitTestKotlin") {
+ assertTasksExecuted(":compileDebugUnitTestKotlin")
+ assertNoCompilerArgument(":compileDebugUnitTestKotlin", "-Xexplicit-api=warning")
+ }
+ }
+ }
+
+ @DisplayName("Explicit api mode is enabled only for non-test variants in Android project in customized source directories")
+ @AndroidGradlePluginTests
+ @GradleAndroidTest
+ fun explicitApiCustomizedAndroidSourceSets(
+ gradleVersion: GradleVersion,
+ agpVersion: String,
+ jdkVersion: JdkVersions.ProvidedJdk
+ ) {
+ project(
+ "AndroidExtraSourceDirsApp",
+ gradleVersion,
+ buildOptions = defaultBuildOptions.copy(
+ androidVersion = agpVersion,
+ logLevel = LogLevel.DEBUG,
+ ),
+ buildJdk = jdkVersion.location
+ ) {
+ buildGradle.modify {
+ it.replace(
+ "compileOptions {",
+ """
+ |kotlin {
+ | explicitApi = 'warning'
+ | }
+ | compileOptions {
+ """.trimMargin()
+ )
+ }
+ build(":compileDebugKotlin") {
+ assertTasksExecuted(":compileDebugKotlin")
+ assertCompilerArgument(":compileDebugKotlin", "-Xexplicit-api=warning")
+ assertOutputContains("Visibility must be specified in explicit API mode")
+ }
+ build(":compileDebugUnitTestKotlin") {
+ assertTasksExecuted(":compileDebugUnitTestKotlin")
+ assertNoCompilerArgument(":compileDebugUnitTestKotlin", "-Xexplicit-api=warning")
+ }
+ build(":compileDebugAndroidTestKotlin") {
+ assertTasksExecuted(":compileDebugAndroidTestKotlin")
+ assertNoCompilerArgument(":compileDebugAndroidTestKotlin", "-Xexplicit-api=warning")
+ }
+ }
+ }
}
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/build.gradle
new file mode 100644
index 00000000000..c94ebeb6c3c
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/build.gradle
@@ -0,0 +1,47 @@
+plugins {
+ id "com.android.application"
+ id "org.jetbrains.kotlin.android"
+}
+
+repositories {
+ mavenLocal()
+ google()
+ mavenCentral()
+}
+
+android {
+ namespace = "com.example.android_many_source_dirs_app"
+ compileSdkVersion 33
+
+ defaultConfig {
+ applicationId "com.example"
+ minSdkVersion 24
+ targetSdkVersion 33
+ versionCode 1
+ versionName "1.0"
+ }
+
+ // Needed for older AGP. It can be removed when the lowest supported AGP version is 4.2.0 or newer.
+ compileOptions {
+ sourceCompatibility 1.8
+ targetCompatibility 1.8
+ }
+
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+
+ sourceSets.getByName("test").kotlin.srcDirs += 'src/test/reserveUnitTest'
+ sourceSets.getByName("androidTest").kotlin.srcDirs += 'src/androidTest/additionalTest'
+ sourceSets.getByName("main").kotlin.srcDirs += 'src/main/extraSources'
+
+}
+
+dependencies {
+ implementation "androidx.core:core-ktx:1.6.0"
+ implementation "com.google.android.material:material:1.6.0"
+ implementation "androidx.appcompat:appcompat:1.4.1"
+ testImplementation "junit:junit:4.13.2"
+ androidTestImplementation "androidx.test.ext:junit:1.1.5"
+ androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1"
+}
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/gradle.properties
new file mode 100644
index 00000000000..2d8d1e4dd15
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/gradle.properties
@@ -0,0 +1 @@
+android.useAndroidX=true
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/androidTest/additionalTest/android_many_source_dirs_app/BaseInstrumentedTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/androidTest/additionalTest/android_many_source_dirs_app/BaseInstrumentedTest.kt
new file mode 100644
index 00000000000..e7f76c30c62
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/androidTest/additionalTest/android_many_source_dirs_app/BaseInstrumentedTest.kt
@@ -0,0 +1,10 @@
+package android_many_source_dirs_app
+
+open class BaseInstrumentedTest {
+
+ fun setUp() {}
+
+ fun updateUserInfo() {
+
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/androidTest/java/com/example/android_many_source_dirs_app/ExampleInstrumentedTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/androidTest/java/com/example/android_many_source_dirs_app/ExampleInstrumentedTest.kt
new file mode 100644
index 00000000000..e460e121456
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/androidTest/java/com/example/android_many_source_dirs_app/ExampleInstrumentedTest.kt
@@ -0,0 +1,25 @@
+package com.example.android_many_source_dirs_app
+
+import android_many_source_dirs_app.BaseInstrumentedTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest : BaseInstrumentedTest() {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.example.android_many_source_dirs_app", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/AndroidManifest.xml
new file mode 100644
index 00000000000..2fe3e78c055
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/AndroidManifest.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/extraSources/android_many_source_dirs_app/NotesApplication.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/extraSources/android_many_source_dirs_app/NotesApplication.kt
new file mode 100644
index 00000000000..7411af2e0b2
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/extraSources/android_many_source_dirs_app/NotesApplication.kt
@@ -0,0 +1,6 @@
+package android_many_source_dirs_app
+
+import android.app.Application
+
+class NotesApplication : Application() {
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/java/com/example/android_many_source_dirs_app/MainActivity.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/java/com/example/android_many_source_dirs_app/MainActivity.kt
new file mode 100644
index 00000000000..fbdb18ef5ff
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/java/com/example/android_many_source_dirs_app/MainActivity.kt
@@ -0,0 +1,15 @@
+package com.example.android_many_source_dirs_app
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import android_many_source_dirs_app.NotesApplication
+
+public class MainActivity : AppCompatActivity() {
+
+ private lateinit var notesApp: NotesApplication
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_main)
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/drawable/ic_launcher_background.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 00000000000..07d5da9cbf1
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/drawable/ic_launcher_foreground.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 00000000000..2b068d11462
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/layout/activity_main.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/layout/activity_main.xml
new file mode 100644
index 00000000000..17eab17ba76
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/layout/activity_main.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 00000000000..6f3b755bf50
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/values/strings.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/values/strings.xml
new file mode 100644
index 00000000000..5f5434775aa
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ Android_many_source_dirs_app
+
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/test/java/com/example/android_many_source_dirs_app/ExampleUnitTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/test/java/com/example/android_many_source_dirs_app/ExampleUnitTest.kt
new file mode 100644
index 00000000000..afe72628225
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/test/java/com/example/android_many_source_dirs_app/ExampleUnitTest.kt
@@ -0,0 +1,18 @@
+package com.example.android_many_source_dirs_app
+
+import android_many_source_dirs_app.BaseUnitTest
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest : BaseUnitTest() {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/test/reserveUnitTest/android_many_source_dirs_app/BaseUnitTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/test/reserveUnitTest/android_many_source_dirs_app/BaseUnitTest.kt
new file mode 100644
index 00000000000..978355ccfe7
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/test/reserveUnitTest/android_many_source_dirs_app/BaseUnitTest.kt
@@ -0,0 +1,6 @@
+package android_many_source_dirs_app
+
+open class BaseUnitTest {
+
+ fun createTestData(){}
+}
\ No newline at end of file