From 0a78d2d299a5b5be0f4d93df676d19b34f941e94 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Mon, 31 Jul 2017 22:01:31 +0300 Subject: [PATCH] Isolate JS compiler in proto tests Proto tests are still in the 'jps-tests' module which is included in non-compiler tests. It is not safe to call the compiler directly in non-compiler tests because it might affect IDE tests. Original commit: 1cce1ef1f699f5c072df0a40b48e28adb54ff947 --- .../AbstractJsProtoComparisonTest.kt | 8 +-- .../AbstractProtoComparisonTest.kt | 3 -- .../kotlin/jps/incremental/compilerUtils.kt | 49 +++++++++++++++++++ .../kotlin/jps/build/KotlinBuilder.kt | 23 +++++---- 4 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/incremental/compilerUtils.kt diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/incremental/AbstractJsProtoComparisonTest.kt b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/incremental/AbstractJsProtoComparisonTest.kt index ec8f4f73c5f..f8c0186a077 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/incremental/AbstractJsProtoComparisonTest.kt +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/incremental/AbstractJsProtoComparisonTest.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.jps.incremental import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JsArgumentConstants import org.jetbrains.kotlin.cli.js.K2JSCompiler +import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.incremental.ClassProtoData import org.jetbrains.kotlin.incremental.Difference @@ -46,7 +47,6 @@ abstract class AbstractJsProtoComparisonTest : AbstractProtoComparisonTest { val incrementalResults = IncrementalResultsConsumerImpl() - // todo: find out if it is safe to call directly val services = Services.Builder().run { register(IncrementalResultsConsumer::class.java, incrementalResults) build() @@ -54,6 +54,7 @@ abstract class AbstractJsProtoComparisonTest : AbstractProtoComparisonTest + val env = createTestingCompilerEnvironment(messageCollector, outputItemsCollector, services) + runJSCompiler(args, env).let { exitCode -> val expectedOutput = "OK" - val actualOutput = (listOf(exitCode.name) + messageCollector.errors).joinToString("\n") + val actualOutput = (listOf(exitCode?.name) + messageCollector.errors).joinToString("\n") Assert.assertEquals(expectedOutput, actualOutput) } diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/incremental/AbstractProtoComparisonTest.kt b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/incremental/AbstractProtoComparisonTest.kt index 4882da01915..6d7cc01c6e5 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/incremental/AbstractProtoComparisonTest.kt +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/incremental/AbstractProtoComparisonTest.kt @@ -16,14 +16,11 @@ package org.jetbrains.kotlin.jps.incremental -import com.intellij.openapi.util.io.FileUtil -import com.intellij.testFramework.UsefulTestCase import org.jetbrains.kotlin.TestWithWorkingDir import org.jetbrains.kotlin.incremental.Difference import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.utils.Printer -import org.jetbrains.kotlin.utils.keysToMap import java.io.File abstract class AbstractProtoComparisonTest : TestWithWorkingDir() { diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/incremental/compilerUtils.kt b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/incremental/compilerUtils.kt new file mode 100644 index 00000000000..0662ebd3ee6 --- /dev/null +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/incremental/compilerUtils.kt @@ -0,0 +1,49 @@ +/* + * 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 org.jetbrains.kotlin.jps.incremental + +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.compilerRunner.* +import org.jetbrains.kotlin.config.Services +import org.jetbrains.kotlin.jps.build.KotlinBuilder +import org.jetbrains.kotlin.utils.PathUtil +import java.io.* + +fun createTestingCompilerEnvironment( + messageCollector: MessageCollector, + outputItemsCollector: OutputItemsCollectorImpl, + services: Services +): JpsCompilerEnvironment { + val paths = PathUtil.kotlinPathsForDistDirectory + + val wrappedMessageCollector = MessageCollectorToOutputItemsCollectorAdapter(messageCollector, outputItemsCollector) + return JpsCompilerEnvironment(paths, services, KotlinBuilder.classesToLoadByParent, wrappedMessageCollector, outputItemsCollector) +} + +fun runJSCompiler(args: K2JSCompilerArguments, env: JpsCompilerEnvironment): ExitCode? { + val argsArray = ArgumentUtils.convertArgumentsToStringList(args).toTypedArray() + + val stream = ByteArrayOutputStream() + val out = PrintStream(stream) + val exitCode = CompilerRunnerUtil.invokeExecMethod(K2JSCompiler::class.java.name, argsArray, env, out) + val reader = BufferedReader(StringReader(stream.toString())) + CompilerOutputParser.parseCompilerMessagesFromReader(env.messageCollector, reader, env.outputItemsCollector) + return exitCode as? ExitCode +} \ No newline at end of file diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index 6aba5f64536..fba0d50aa9f 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -81,6 +81,19 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { const val JVM_BUILD_META_INFO_FILE_NAME = "jvm-build-meta-info.txt" const val SKIP_CACHE_VERSION_CHECK_PROPERTY = "kotlin.jps.skip.cache.version.check" const val JPS_KOTLIN_HOME_PROPERTY = "jps.kotlin.home" + + val classesToLoadByParent: ClassCondition + get() = ClassCondition { className -> + className.startsWith("org.jetbrains.kotlin.load.kotlin.incremental.components.") + || className.startsWith("org.jetbrains.kotlin.incremental.components.") + || className.startsWith("org.jetbrains.kotlin.incremental.js") + || className == "org.jetbrains.kotlin.config.Services" + || className.startsWith("org.apache.log4j.") // For logging from compiler + || className == "org.jetbrains.kotlin.progress.CompilationCanceledStatus" + || className == "org.jetbrains.kotlin.progress.CompilationCanceledException" + || className == "org.jetbrains.kotlin.modules.TargetId" + || className == "org.jetbrains.kotlin.cli.common.ExitCode" + } } private val statisticsLogger = TeamcityStatisticsLogger() @@ -467,15 +480,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { return JpsCompilerEnvironment( paths, compilerServices, - ClassCondition { className -> - className.startsWith("org.jetbrains.kotlin.load.kotlin.incremental.components.") - || className.startsWith("org.jetbrains.kotlin.incremental.components.") - || className == "org.jetbrains.kotlin.config.Services" - || className.startsWith("org.apache.log4j.") // For logging from compiler - || className == "org.jetbrains.kotlin.progress.CompilationCanceledStatus" - || className == "org.jetbrains.kotlin.progress.CompilationCanceledException" - || className == "org.jetbrains.kotlin.modules.TargetId" - }, + classesToLoadByParent, messageCollector, OutputItemsCollectorImpl() )