[gradle-plugin] Fix KNPE in mpp plugin

This commit is contained in:
Ilya Matveev
2018-09-02 17:09:07 +07:00
committed by Ilya Matveev
parent deee714be8
commit 98785874e0
6 changed files with 42 additions and 50 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
buildscript {
ext.kotlin_version = '1.2.31'
ext.kotlin_version = '1.3-M2'
repositories {
google()
+12
View File
@@ -1,3 +1,15 @@
allprojects {
buildscript {
repositories {
maven { url "http://dl.bintray.com/kotlin/kotlin-eap" }
}
}
repositories {
maven { url "http://dl.bintray.com/kotlin/kotlin-eap" }
}
}
task build {
subprojects.each {
dependsOn("${it.path}:build")
+1 -1
View File
@@ -1,5 +1,5 @@
buildscript {
ext.kotlin_version = '1.2.31'
ext.kotlin_version = '1.3-M2'
repositories {
mavenCentral()
+1 -1
View File
@@ -1,5 +1,5 @@
buildscript {
ext.kotlin_version = '1.2.31'
ext.kotlin_version = '1.3-M2'
repositories {
mavenCentral()
@@ -1,63 +1,40 @@
package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.GradleException
import org.gradle.api.Named
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Project
import org.gradle.api.artifacts.ProjectDependency
import org.gradle.api.plugins.JavaPluginConvention
import org.gradle.api.tasks.SourceSetContainer
import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.plugin.tasks.KonanCompileTask
import javax.inject.Inject
open class KotlinNativePlatformPlugin: KotlinPlatformImplementationPluginBase("native") {
protected val commonProjects = arrayListOf<Project>()
private val Project.konanMultiplatformTasks: Collection<KonanCompileTask>
get() = tasks.withType(KonanCompileTask::class.java).filter { it.enableMultiplatform }
override fun apply(project: Project) {
val expectedByConfig = project.configurations.create(EXPECTED_BY_CONFIG_NAME)
expectedByConfig.isTransitive = false
expectedByConfig.dependencies.whenObjectAdded { dep ->
if (dep is ProjectDependency) {
addCommonProject(dep.dependencyProject, project)
} else {
throw GradleException("$project '${expectedByConfig.name}' dependency is not a project: $dep")
}
}
override fun configurationsForCommonModuleDependency(project: Project) = emptyList<Configuration>()
open class RequestedCommonSourceSet @Inject constructor(private val name: String): Named {
override fun getName() = name
}
internal fun <T> Project.whenEvaluated(fn: Project.() -> T) {
if (state.executed) {
fn()
} else {
afterEvaluate { it.fn() }
}
override fun addCommonSourceSetToPlatformSourceSet(commonSourceSet: Named, platformProject: Project) {
val commonSourceSetName = commonSourceSet.name
platformProject.konanMultiplatformTasks
.filter { it.commonSourceSets.contains(commonSourceSetName) }
.forEach { task: KonanCompileTask ->
getKotlinSourceDirectorySetSafe(commonSourceSet)!!.srcDirs.forEach {
task.commonSrcDir(it)
}
}
}
protected fun addCommonProject(commonProject: Project, platformProject: Project) {
commonProjects.add(commonProject)
commonProject.whenEvaluated {
if (!commonProject.pluginManager.hasPlugin("kotlin-platform-common")) {
throw GradleException("Platform project $platformProject has an " +
"'$EXPECTED_BY_CONFIG_NAME' dependency to non-common project $commonProject")
}
platformProject.tasks
.withType(KonanCompileTask::class.java)
.filter { it.enableMultiplatform }
.forEach { task: KonanCompileTask ->
task.commonSourceSets.forEach { commonSourceSetName ->
val commonSourceSet = commonProject.sourceSets.findByName(commonSourceSetName) ?:
throw GradleException("Cannot find a source set with name '$commonSourceSetName' " +
"in a common project '${commonProject.path}' " +
"for an artifact '${task.artifactName}' " +
"in a platform project '${platformProject.path}'")
commonSourceSet.kotlin!!.srcDirs.forEach {
task.commonSrcDir(it)
}
}
override fun namedSourceSetsContainer(project: Project): NamedDomainObjectContainer<*> =
project.container(RequestedCommonSourceSet::class.java).apply {
project.konanMultiplatformTasks.forEach { task ->
task.commonSourceSets.forEach { maybeCreate(it) }
}
}
}
protected val Project.sourceSets: SourceSetContainer
get() = convention.getPlugin(JavaPluginConvention::class.java).sourceSets
}
@@ -16,6 +16,8 @@
package org.jetbrains.kotlin.gradle.plugin.test
import spock.lang.Ignore
import java.nio.file.Files
import java.nio.file.Paths
@@ -315,6 +317,7 @@ class MultiplatformSpecification extends BaseKonanSpecification {
result.output.contains("has an 'expectedBy' dependency to non-common project")
}
@Ignore("TODO in the Big Kotlin plugin")
def 'Build should fail if custom common source set doesn\'t exist'() {
when:
def project = KonanProject.createEmpty(projectDirectory) { KonanProject it ->