diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/SubpluginsIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/SubpluginsIT.kt index 368201eb8a7..3aab2f45c24 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/SubpluginsIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/SubpluginsIT.kt @@ -131,4 +131,13 @@ class SubpluginsIT : BaseGradleIT() { assertFileExists("${kotlinClassesDir(subproject = "a/b", sourceSet = "test")}MyTestClass.class") } } + + @Test + fun testAllopenFromScript() { + Project("allOpenFromScript").build("build") { + assertSuccessful() + assertFileExists("${kotlinClassesDir(sourceSet = "main")}MyClass.class") + assertFileExists("${kotlinClassesDir(sourceSet = "test")}MyTestClass.class") + } + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/build.gradle new file mode 100644 index 00000000000..1cf2b561ae8 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/build.gradle @@ -0,0 +1 @@ +apply from: './kotlin.gradle' \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/kotlin.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/kotlin.gradle new file mode 100644 index 00000000000..9d37fc4159d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/kotlin.gradle @@ -0,0 +1,26 @@ +buildscript { + repositories { + mavenLocal() + mavenCentral() + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version" + } +} + +apply plugin: org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper +apply plugin: org.jetbrains.kotlin.allopen.gradle.AllOpenGradleSubplugin + +repositories { + mavenLocal() + mavenCentral() +} + +allOpen { + annotation("AllOpen") +} + +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/src/main/kotlin/MyClass.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/src/main/kotlin/MyClass.kt new file mode 100644 index 00000000000..8f670a7ac8a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/src/main/kotlin/MyClass.kt @@ -0,0 +1,9 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +@AllOpen +class MyClass { + fun f() = 0 +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/src/main/kotlin/annotations.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/src/main/kotlin/annotations.kt new file mode 100644 index 00000000000..f3574cd70a0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/src/main/kotlin/annotations.kt @@ -0,0 +1,6 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +annotation class AllOpen \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/src/test/kotlin/MyTestClass.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/src/test/kotlin/MyTestClass.kt new file mode 100644 index 00000000000..f55ab2b4d58 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/allOpenFromScript/src/test/kotlin/MyTestClass.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +class MyTestClass : MyClass() { + override fun f() = 1 +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index 776d5737281..8a9f4e8d171 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -666,7 +666,21 @@ private fun SourceSet.clearJavaSrcDirs() { private fun loadSubplugins(project: Project, kotlinPluginVersion: String): SubpluginEnvironment = try { - val subplugins = ServiceLoader.load(KotlinGradleSubplugin::class.java, project.buildscript.classLoader) + val klass = KotlinGradleSubplugin::class.java + val buildscriptClassloader = project.buildscript.classLoader + val klassFromBuildscript = try { + buildscriptClassloader.loadClass(klass.canonicalName) + } catch (e: ClassNotFoundException) { + null + } + + val classloader = if (klass == klassFromBuildscript) { + buildscriptClassloader + } else { + klass.classLoader + } + + val subplugins = ServiceLoader.load(KotlinGradleSubplugin::class.java, classloader) .map { @Suppress("UNCHECKED_CAST") (it as KotlinGradleSubplugin) } SubpluginEnvironment(subplugins, kotlinPluginVersion)