From e83f1b138b554209a310d6d04e810dfced4d4d29 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Mon, 23 Oct 2017 22:55:54 +0300 Subject: [PATCH] Perform non-IC build when JS lib is changed --- .../IncrementalJsCompilerRunner.kt | 15 ++++++- .../jetbrains/kotlin/gradle/BaseGradleIT.kt | 6 +++ .../kotlin/gradle/Kotlin2JsGradlePluginIT.kt | 21 +++++---- .../kotlin2JsICProject/app/build.gradle | 6 +++ .../app/src/main/kotlin/DummyInAppMain.kt | 1 + .../app/src/main/kotlin/useAInAppMain.kt | 3 ++ .../app/src/test/kotlin/DummyInAppTest.kt | 1 + .../app/src/test/kotlin/useAInAppTest.kt | 3 ++ .../kotlin2JsICProject/build.gradle | 43 +++---------------- .../kotlin2JsICProject/lib/build.gradle | 5 +++ .../lib/src/main/kotlin/A.kt | 3 ++ .../lib/src/main/kotlin/DummyInLibMain.kt | 1 + .../lib/src/main/kotlin/useAInLibMain.kt | 3 ++ .../lib/src/test/kotlin/DummyInLibTest.kt | 1 + .../lib/src/test/kotlin/useAInLibTest.kt | 3 ++ .../kotlin2JsICProject/settings.gradle | 1 + .../src/main/kotlin/foo/A.kt | 19 -------- .../src/main/kotlin/foo/dummy.kt | 19 -------- .../src/main/kotlin/foo/useA.kt | 19 -------- 19 files changed, 68 insertions(+), 105 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/main/kotlin/DummyInAppMain.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/main/kotlin/useAInAppMain.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/test/kotlin/DummyInAppTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/test/kotlin/useAInAppTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/main/kotlin/A.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/main/kotlin/DummyInLibMain.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/main/kotlin/useAInLibMain.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/test/kotlin/DummyInLibTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/test/kotlin/useAInLibTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/settings.gradle delete mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/src/main/kotlin/foo/A.kt delete mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/src/main/kotlin/foo/dummy.kt delete mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/src/main/kotlin/foo/useA.kt diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt index 4390a182a67..24014ad0f22 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt @@ -16,12 +16,12 @@ package org.jetbrains.kotlin.incremental +import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.build.GeneratedFile import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.js.K2JSCompiler -import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler import org.jetbrains.kotlin.config.IncrementalCompilation import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.incremental.components.LookupTracker @@ -83,6 +83,16 @@ class IncrementalJsCompilerRunner( override fun calculateSourcesToCompile(caches: IncrementalJsCachesManager, changedFiles: ChangedFiles.Known, args: K2JSCompilerArguments): CompilationMode { if (BuildInfo.read(lastBuildInfoFile) == null) return CompilationMode.Rebuild { "No information on previous build" } + val libs = (args.libraries ?: "").split(File.pathSeparator).mapTo(HashSet()) { File(it) } + val libsDirs = libs.filter { it.isDirectory } + + val changedLib = changedFiles.allAsSequence.find { it in libs } + ?: changedFiles.allAsSequence.find { changedFile -> + libsDirs.any { libDir -> FileUtil.isAncestor(libDir, changedFile, true) } + } + + if (changedLib != null) return CompilationMode.Rebuild { "Library has been changed: $changedLib" } + return CompilationMode.Incremental(getDirtyFiles(changedFiles)) } @@ -133,4 +143,7 @@ class IncrementalJsCompilerRunner( args.freeArgs = freeArgsBackup } } + + private val ChangedFiles.Known.allAsSequence: Sequence + get() = modified.asSequence() + removed.asSequence() } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt index a11d67ea933..094d418772d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt @@ -404,6 +404,12 @@ abstract class BaseGradleIT { } } + val Project.allKotlinFiles: Iterable + get() = projectDir.allKotlinFiles() + + fun Project.projectFile(name: String): File = + projectDir.getFileByName(name) + fun CompiledProject.assertCompiledJavaSources( sources: Iterable, weakTesting: Boolean = false diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt index 32e66a38753..fc9ca060314 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt @@ -242,22 +242,25 @@ class Kotlin2JsGradlePluginIT : BaseGradleIT() { } @Test - fun testIncrementalCompilation() { - val project = Project("kotlin2JsICProject", "4.0") - project.build("build") { + fun testIncrementalCompilation() = Project("kotlin2JsICProject", "4.0").run { + build("build") { assertSuccessful() assertContains(USING_EXPERIMENTAL_JS_INCREMENTAL_COMPILATION_MESSAGE) - assertCompiledKotlinSources(project.relativize(project.projectDir.allKotlinFiles())) + assertCompiledKotlinSources(project.relativize(allKotlinFiles)) } - val aKt = project.projectDir.getFileByName("A.kt").apply { - modify { it.replace("val x: String", "val x: Int") } + build("build") { + assertSuccessful() + assertCompiledKotlinSources(emptyList()) } - val useAKt = project.projectDir.getFileByName("useA.kt") - project.build("build") { + + projectFile("A.kt").modify { + it.replace("val x = 0", "val x = \"a\"") + } + build("build") { assertSuccessful() assertContains(USING_EXPERIMENTAL_JS_INCREMENTAL_COMPILATION_MESSAGE) - assertCompiledKotlinSources(project.relativize(aKt, useAKt)) + assertCompiledKotlinSources(project.relativize(allKotlinFiles - projectFile("DummyInLibMain.kt"))) } } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/build.gradle new file mode 100644 index 00000000000..ec2aef86ee3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/build.gradle @@ -0,0 +1,6 @@ +apply plugin: 'kotlin2js' + +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" + compile project(":lib") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/main/kotlin/DummyInAppMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/main/kotlin/DummyInAppMain.kt new file mode 100644 index 00000000000..e3a3a646b77 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/main/kotlin/DummyInAppMain.kt @@ -0,0 +1 @@ +class DummyInAppMain \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/main/kotlin/useAInAppMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/main/kotlin/useAInAppMain.kt new file mode 100644 index 00000000000..38b49cac01e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/main/kotlin/useAInAppMain.kt @@ -0,0 +1,3 @@ +fun useAInAppMain(a: A) { + println(a.x) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/test/kotlin/DummyInAppTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/test/kotlin/DummyInAppTest.kt new file mode 100644 index 00000000000..4c4a777b0c1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/test/kotlin/DummyInAppTest.kt @@ -0,0 +1 @@ +class DummyInAppTest \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/test/kotlin/useAInAppTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/test/kotlin/useAInAppTest.kt new file mode 100644 index 00000000000..d796284f02a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/app/src/test/kotlin/useAInAppTest.kt @@ -0,0 +1,3 @@ +fun useAInAppTest(a: A) { + println(a.x) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/build.gradle index 3b14c8da937..f37b00da1c9 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/build.gradle @@ -8,42 +8,9 @@ buildscript { } } -apply plugin: 'kotlin2js' - -repositories { - mavenLocal() - mavenCentral() -} - -dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" -} - -task jarSources(type: Jar) { - from sourceSets.main.allSource - classifier = 'source' -} -artifacts { - compile jarSources -} - -def outDir = "${buildDir}/kotlin2js/main/" - -compileKotlin2Js.kotlinOptions.outputFile = outDir + "test-library.js" - -jar { - from sourceSets.main.allSource - include "**/*.kt" - - from outDir - include "**/*.js" - - manifest { - attributes( - "Specification-Title": "Kotlin JavaScript Lib", - "Kotlin-JS-Module-Name": "test-library" - ) +subprojects { + repositories { + mavenLocal() + mavenCentral() } -} - -jar.dependsOn(compileKotlin2Js) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/build.gradle new file mode 100644 index 00000000000..0b1b94ff880 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/build.gradle @@ -0,0 +1,5 @@ +apply plugin: 'kotlin2js' + +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/main/kotlin/A.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/main/kotlin/A.kt new file mode 100644 index 00000000000..06d355d6719 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/main/kotlin/A.kt @@ -0,0 +1,3 @@ +class A { + val x = 0 +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/main/kotlin/DummyInLibMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/main/kotlin/DummyInLibMain.kt new file mode 100644 index 00000000000..0169b5e7a87 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/main/kotlin/DummyInLibMain.kt @@ -0,0 +1 @@ +class DummyInLibMain \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/main/kotlin/useAInLibMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/main/kotlin/useAInLibMain.kt new file mode 100644 index 00000000000..289dca3a5ab --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/main/kotlin/useAInLibMain.kt @@ -0,0 +1,3 @@ +fun useAInLibMain(a: A) { + println(a.x) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/test/kotlin/DummyInLibTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/test/kotlin/DummyInLibTest.kt new file mode 100644 index 00000000000..01ce194c02f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/test/kotlin/DummyInLibTest.kt @@ -0,0 +1 @@ +class DummyInLibTest \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/test/kotlin/useAInLibTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/test/kotlin/useAInLibTest.kt new file mode 100644 index 00000000000..435c20a4b2c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/lib/src/test/kotlin/useAInLibTest.kt @@ -0,0 +1,3 @@ +fun useAInLibTest(a: A) { + println(a.x) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/settings.gradle new file mode 100644 index 00000000000..ac2c1c2bb8f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/settings.gradle @@ -0,0 +1 @@ +include ':app', ":lib" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/src/main/kotlin/foo/A.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/src/main/kotlin/foo/A.kt deleted file mode 100644 index fde45bd9680..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/src/main/kotlin/foo/A.kt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2010-2017 JetBrains s.r.o. - * - * 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 foo - -class A(val x: String) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/src/main/kotlin/foo/dummy.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/src/main/kotlin/foo/dummy.kt deleted file mode 100644 index 0eff2412c79..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/src/main/kotlin/foo/dummy.kt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2010-2017 JetBrains s.r.o. - * - * 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 foo - -fun dummy() {} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/src/main/kotlin/foo/useA.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/src/main/kotlin/foo/useA.kt deleted file mode 100644 index 3cce91d2710..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsICProject/src/main/kotlin/foo/useA.kt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2010-2017 JetBrains s.r.o. - * - * 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 foo - -fun useA(a: A) = a.x \ No newline at end of file