KT-15120 Gradle JS test compile task doesn't pick up production code

This commit is contained in:
Sergey Mashkov
2016-12-05 22:56:32 +03:00
parent 7b3bc0235b
commit 2ca336fb32
9 changed files with 102 additions and 19 deletions
@@ -15,9 +15,9 @@ class Kotlin2JsGradlePluginIT : BaseGradleIT() {
assertReportExists() assertReportExists()
assertContains( assertContains(
":libraryProject:jarSources\n", ":libraryProject:jarSources",
":mainProject:compileKotlin2Js\n", ":mainProject:compileKotlin2Js",
":libraryProject:compileKotlin2Js\n" ":libraryProject:compileKotlin2Js"
) )
listOf("mainProject/web/js/app.js", listOf("mainProject/web/js/app.js",
@@ -75,6 +75,23 @@ class Kotlin2JsGradlePluginIT : BaseGradleIT() {
} }
} }
@Test
fun testCompileTestCouldAccessProduction() {
val project = Project("kotlin2JsProjectWithTests", "2.10")
project.build("build") {
assertSuccessful()
assertContains(
":compileKotlin2Js",
":compileTestKotlin2Js"
)
assertFileExists("build/kotlin2js/main/module.js")
assertFileExists("build/kotlin2js/test/module-tests.js")
}
}
@Test @Test
fun testKotlinJsBuiltins() { fun testKotlinJsBuiltins() {
val project = Project("kotlinBuiltins", "3.2") val project = Project("kotlinBuiltins", "3.2")
@@ -90,4 +107,3 @@ class Kotlin2JsGradlePluginIT : BaseGradleIT() {
} }
} }
} }
@@ -0,0 +1,29 @@
buildscript {
repositories {
mavenLocal()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
apply plugin: 'kotlin2js'
repositories {
mavenLocal()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-js-library:$kotlin_version"
}
task jarSources(type: Jar) {
from sourceSets.main.allSource
classifier = 'source'
}
artifacts {
compile jarSources
}
compileKotlin2Js.kotlinOptions.outputFile = "${buildDir}/kotlin2js/main/module.js"
compileTestKotlin2Js.kotlinOptions.outputFile = "${buildDir}/kotlin2js/test/module-tests.js"
@@ -0,0 +1,5 @@
package example
class MyProductionClass {
var i = 0
}
@@ -0,0 +1,11 @@
package test
import org.junit.Test
import example.MyProductionClass
class MyTest {
@Test
fun mySimpleTest() {
MyProductionClass().i = 10
}
}
@@ -22,8 +22,7 @@ import org.gradle.api.internal.file.FileResolver
import org.gradle.api.logging.Logger import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging import org.gradle.api.logging.Logging
import org.jetbrains.kotlin.gradle.internal.KotlinSourceSetProviderImpl import org.jetbrains.kotlin.gradle.internal.KotlinSourceSetProviderImpl
import org.jetbrains.kotlin.gradle.tasks.AndroidTasksProvider import org.jetbrains.kotlin.gradle.tasks.*
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
import java.io.FileNotFoundException import java.io.FileNotFoundException
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
@@ -56,7 +55,7 @@ open class KotlinAndroidPluginWrapper @Inject constructor(fileResolver: FileReso
open class Kotlin2JsPluginWrapper @Inject constructor(fileResolver: FileResolver): KotlinBasePluginWrapper(fileResolver) { open class Kotlin2JsPluginWrapper @Inject constructor(fileResolver: FileResolver): KotlinBasePluginWrapper(fileResolver) {
override fun getPlugin(kotlinGradleBuildServices: KotlinGradleBuildServices) = override fun getPlugin(kotlinGradleBuildServices: KotlinGradleBuildServices) =
Kotlin2JsPlugin(KotlinTasksProvider(), KotlinSourceSetProviderImpl(fileResolver), kotlinPluginVersion) Kotlin2JsPlugin(Kotlin2JsTasksProvider(), KotlinSourceSetProviderImpl(fileResolver), kotlinPluginVersion)
} }
private fun Any.loadKotlinVersionFromResource(log: Logger): String { private fun Any.loadKotlinVersionFromResource(log: Logger): String {
@@ -32,16 +32,18 @@ internal abstract class TaskToFriendTaskMapper {
sealed internal class RegexTaskToFriendTaskMapper( sealed internal class RegexTaskToFriendTaskMapper(
private val prefix: String, private val prefix: String,
suffix: String suffix: String,
private val postfixReplacement: String
) : TaskToFriendTaskMapper() { ) : TaskToFriendTaskMapper() {
class Default : RegexTaskToFriendTaskMapper("compile", "TestKotlin") class Default : RegexTaskToFriendTaskMapper("compile", "TestKotlin", "Kotlin")
class Android : RegexTaskToFriendTaskMapper("compile", "(Unit|Android)TestKotlin") class JavaScript : RegexTaskToFriendTaskMapper("compile", "TestKotlin2Js", "Kotlin2Js")
class Android : RegexTaskToFriendTaskMapper("compile", "(Unit|Android)TestKotlin", "Kotlin")
private val regex = "$prefix(.*)$suffix".toRegex() private val regex = "$prefix(.*)$suffix".toRegex()
override fun getFriendByName(name: String): String? { override fun getFriendByName(name: String): String? {
val match = regex.matchEntire(name) ?: return null val match = regex.matchEntire(name) ?: return null
val variant = match.groups[1]?.value ?: "" val variant = match.groups[1]?.value ?: ""
return prefix + variant + "Kotlin" return prefix + variant + postfixReplacement
} }
} }
@@ -19,17 +19,13 @@ package org.jetbrains.kotlin.gradle.tasks
import org.codehaus.groovy.runtime.MethodClosure import org.codehaus.groovy.runtime.MethodClosure
import org.gradle.api.GradleException import org.gradle.api.GradleException
import org.gradle.api.Task import org.gradle.api.Task
import org.gradle.api.file.FileTree
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.logging.Logger import org.gradle.api.logging.Logger
import org.gradle.api.tasks.SourceTask import org.gradle.api.tasks.SourceTask
import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.compile.AbstractCompile import org.gradle.api.tasks.compile.AbstractCompile
import org.gradle.api.tasks.incremental.IncrementalTaskInputs import org.gradle.api.tasks.incremental.IncrementalTaskInputs
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.annotation.AnnotationFileUpdater import org.jetbrains.kotlin.annotation.AnnotationFileUpdater
import org.jetbrains.kotlin.annotation.SourceAnnotationsRegistry import org.jetbrains.kotlin.annotation.SourceAnnotationsRegistry
import org.jetbrains.kotlin.build.JvmSourceRoot
import org.jetbrains.kotlin.cli.common.CLICompiler import org.jetbrains.kotlin.cli.common.CLICompiler
import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
@@ -321,10 +317,22 @@ open class Kotlin2JsCompile() : AbstractKotlinCompile<K2JSCompilerArguments>(),
override fun populateCompilerArguments(): K2JSCompilerArguments { override fun populateCompilerArguments(): K2JSCompilerArguments {
val args = K2JSCompilerArguments().apply { fillDefaultValues() } val args = K2JSCompilerArguments().apply { fillDefaultValues() }
args.libraryFiles = project.configurations.getByName("compile") val friendDependency = friendTaskName
?.let { project.getTasksByName(it, false).singleOrNull() as? Kotlin2JsCompile }
?.outputFile
?.let { File(it).parentFile }
?.let { if (LibraryUtils.isKotlinJavascriptLibrary(it)) it else null }
?.absolutePath
val dependencies = project.configurations.getByName("compile")
.filter { LibraryUtils.isKotlinJavascriptLibrary(it) } .filter { LibraryUtils.isKotlinJavascriptLibrary(it) }
.map { it.canonicalPath } .map { it.canonicalPath }
.toTypedArray()
args.libraryFiles = when (friendDependency) {
null -> dependencies.toTypedArray()
else -> (dependencies + friendDependency).toTypedArray()
}
kotlinOptionsImpl.updateArguments(args) kotlinOptionsImpl.updateArguments(args)
return args return args
} }
@@ -334,7 +342,6 @@ open class Kotlin2JsCompile() : AbstractKotlinCompile<K2JSCompilerArguments>(),
override fun callCompiler(args: K2JSCompilerArguments, sourceRoots: SourceRoots, changedFiles: ChangedFiles) { override fun callCompiler(args: K2JSCompilerArguments, sourceRoots: SourceRoots, changedFiles: ChangedFiles) {
sourceRoots as SourceRoots.ForJs sourceRoots as SourceRoots.ForJs
val messageCollector = GradleMessageCollector(logger)
logger.debug("Calling compiler") logger.debug("Calling compiler")
destinationDir.mkdirs() destinationDir.mkdirs()
args.freeArgs = args.freeArgs + sourceRoots.kotlinSourceFiles.map { it.absolutePath } args.freeArgs = args.freeArgs + sourceRoots.kotlinSourceFiles.map { it.absolutePath }
@@ -32,12 +32,19 @@ internal open class KotlinTasksProvider {
} }
fun createKotlinJSTask(project: Project, name: String, sourceSetName: String): Kotlin2JsCompile = fun createKotlinJSTask(project: Project, name: String, sourceSetName: String): Kotlin2JsCompile =
project.tasks.create(name, Kotlin2JsCompile::class.java) project.tasks.create(name, Kotlin2JsCompile::class.java).apply {
friendTaskName = taskToFriendTaskMapper[this]
}
protected open val taskToFriendTaskMapper: TaskToFriendTaskMapper = protected open val taskToFriendTaskMapper: TaskToFriendTaskMapper =
RegexTaskToFriendTaskMapper.Default() RegexTaskToFriendTaskMapper.Default()
} }
internal class Kotlin2JsTasksProvider : KotlinTasksProvider() {
override val taskToFriendTaskMapper: TaskToFriendTaskMapper =
RegexTaskToFriendTaskMapper.JavaScript()
}
internal class AndroidTasksProvider : KotlinTasksProvider() { internal class AndroidTasksProvider : KotlinTasksProvider() {
override val taskToFriendTaskMapper: TaskToFriendTaskMapper = override val taskToFriendTaskMapper: TaskToFriendTaskMapper =
RegexTaskToFriendTaskMapper.Android() RegexTaskToFriendTaskMapper.Android()
@@ -27,6 +27,13 @@ class RegexTaskToFriendTaskMapperTest {
Assert.assertEquals(null, mapper["compileKotlin"]) Assert.assertEquals(null, mapper["compileKotlin"])
} }
@Test
fun getFriendTasksNameJavaScript() {
val mapper = RegexTaskToFriendTaskMapper.JavaScript()
Assert.assertEquals("compileKotlin2Js", mapper["compileTestKotlin2Js"])
Assert.assertEquals(null, mapper["compileKotlin2Js"])
}
@Test @Test
fun getFriendTaskNameAndroid() { fun getFriendTaskNameAndroid() {
val mapper = RegexTaskToFriendTaskMapper.Android() val mapper = RegexTaskToFriendTaskMapper.Android()