Move importsDumper to compiler plugin

This commit is contained in:
Dmitry Savvinov
2018-05-16 16:25:29 +03:00
parent 16ee2df585
commit da7b59984f
32 changed files with 136 additions and 70 deletions
-1
View File
@@ -141,7 +141,6 @@ extra["versions.javaslang"] = "2.0.6"
extra["versions.ant"] = "1.8.2"
extra["versions.android"] = "2.3.1"
extra["versions.kotlinx-coroutines-core"] = "0.20"
extra["versions.kotlinx-serialization-runtime"] = "0.4.2"
extra["versions.kotlinx-coroutines-jdk8"] = "0.20"
extra["versions.json"] = "20160807"
extra["versions.native-platform"] = "0.14"
-1
View File
@@ -141,7 +141,6 @@ extra["versions.javaslang"] = "2.0.6"
extra["versions.ant"] = "1.8.2"
extra["versions.android"] = "2.3.1"
extra["versions.kotlinx-coroutines-core"] = "0.20"
extra["versions.kotlinx-serialization-runtime"] = "0.4.2"
extra["versions.kotlinx-coroutines-jdk8"] = "0.20"
extra["versions.json"] = "20160807"
extra["versions.native-platform"] = "0.14"
-1
View File
@@ -20,7 +20,6 @@ dependencies {
compile(project(":js:js.translator"))
compile(project(":js:js.serializer"))
compile(project(":js:js.dce"))
compile(commonDep("org.jetbrains.kotlinx", "kotlinx-serialization-runtime")) { isTransitive = false }
compile(commonDep("org.fusesource.jansi", "jansi"))
compile(commonDep("org.jline", "jline"))
compile(files("${System.getProperty("java.home")}/../lib/tools.jar"))
@@ -222,13 +222,6 @@ class K2JVMCompilerArguments : CommonCompilerArguments() {
)
var noExceptionOnExplicitEqualsForBoxedNull by FreezableVar(false)
@Argument(
value = "-Xoutput-imports",
valueDescription = "<path>",
description = "Output imports from all compiled files to the specified file in JSON format"
)
var outputImports: String? by FreezableVar(null)
@Argument(value = "-Xenable-jvm-default", description = "Allow to use '@JvmDefault' for JVM default method support")
var enableJvmDefault: Boolean by FreezableVar(false)
@@ -23,7 +23,10 @@ import org.jetbrains.kotlin.cli.common.ExitCode.*
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.messages.*
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.*
import org.jetbrains.kotlin.cli.jvm.compiler.*
import org.jetbrains.kotlin.cli.jvm.compiler.CompileEnvironmentUtil
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler
import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot
import org.jetbrains.kotlin.cli.jvm.config.JvmModulePathRoot
import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoot
@@ -31,7 +34,6 @@ import org.jetbrains.kotlin.cli.jvm.modules.CoreJrtFileSystem
import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser
import org.jetbrains.kotlin.cli.jvm.repl.ReplFromTerminal
import org.jetbrains.kotlin.codegen.CompilationException
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -390,11 +392,6 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
configuration.put(JVMConfigurationKeys.ADD_BUILT_INS_FROM_COMPILER_TO_DEPENDENCIES, arguments.addCompilerBuiltIns)
configuration.put(JVMConfigurationKeys.CREATE_BUILT_INS_FROM_MODULE_DEPENDENCIES, arguments.loadBuiltInsFromDependencies)
if (arguments.outputImports != null) {
configuration.put(JVMConfigurationKeys.OUTPUT_IMPORTS, arguments.outputImports!!)
configuration.add(ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS, ImportsProducerComponentRegistrar())
}
arguments.declarationsOutputPath?.let { configuration.put(JVMConfigurationKeys.DECLARATIONS_JSON_PATH, it) }
}
-3
View File
@@ -219,7 +219,4 @@ messages/**)
# remove when KT-18563 would be fixed
-keep class org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt { *; }
# for imports dumper in compiler
-keep class kotlinx.serialization.** { *; }
-keep class net.jpountz.lz4.* { *; }
-3
View File
@@ -215,6 +215,3 @@ messages/**)
# remove when KT-18563 would be fixed
-keep class org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt { *; }
# for imports dumper in compiler
-keep class kotlinx.serialization.** { *; }
-3
View File
@@ -223,7 +223,4 @@ messages/**)
# remove when KT-18563 would be fixed
-keep class org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt { *; }
# for imports dumper in compiler
-keep class kotlinx.serialization.** { *; }
-keep class net.jpountz.lz4.* { *; }
-3
View File
@@ -219,6 +219,3 @@ messages/**)
# remove when KT-18563 would be fixed
-keep class org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt { *; }
# for imports dumper in compiler
-keep class kotlinx.serialization.** { *; }
@@ -139,9 +139,6 @@ public class JVMConfigurationKeys {
public static final CompilerConfigurationKey<List<String>> ADDITIONAL_JAVA_MODULES =
CompilerConfigurationKey.create("additional Java modules");
public static final CompilerConfigurationKey<String> OUTPUT_IMPORTS =
CompilerConfigurationKey.create("output imports");
public static final CompilerConfigurationKey<Boolean> ENABLE_JVM_DEFAULT =
CompilerConfigurationKey.create("Allow to use '@JvmDefault'");
}
-1
View File
@@ -39,7 +39,6 @@ where advanced options include:
-Xno-optimize Disable optimizations
-Xno-param-assertions Don't generate not-null assertions on parameters of methods accessible from Java
-Xno-receiver-assertions Don't generate not-null assertion for extension receiver arguments of platform types
-Xoutput-imports=<path> Output imports from all compiled files to the specified file in JSON format
-Xscript-resolver-environment=<key=value[,]>
Script resolver environment in key-value pairs (the value could be quoted and escaped)
-Xsingle-module Combine modules for source files and binary dependencies into a single module
-1
View File
@@ -24,7 +24,6 @@ dependencies {
fatJarContents(commonDep("com.google.code.findbugs", "jsr305"))
fatJarContents(commonDep("io.javaslang", "javaslang"))
fatJarContents(commonDep("org.jetbrains.kotlinx", "kotlinx-coroutines-core")) { isTransitive = false }
fatJarContents(commonDep("org.jetbrains.kotlinx", "kotlinx-serialization-runtime")) { isTransitive = false }
fatJarContents(intellijCoreDep()) { includeJars("intellij-core") }
fatJarContents(intellijDep()) { includeIntellijCoreJarDependencies(project, { !(it.startsWith("jdom") || it.startsWith("log4j")) }) }
@@ -24,7 +24,6 @@ dependencies {
fatJarContents(commonDep("com.google.code.findbugs", "jsr305"))
fatJarContents(commonDep("io.javaslang", "javaslang"))
fatJarContents(commonDep("org.jetbrains.kotlinx", "kotlinx-coroutines-core")) { isTransitive = false }
fatJarContents(commonDep("org.jetbrains.kotlinx", "kotlinx-serialization-runtime")) { isTransitive = false }
fatJarContents(intellijCoreDep()) { includeJars("intellij-core") }
fatJarContents(intellijDep()) { includeIntellijCoreJarDependencies(project, { !(it.startsWith("jdom") || it.startsWith("log4j")) }) }
+39
View File
@@ -0,0 +1,39 @@
description = "Extension for saving imports of .kt-files in JSON"
plugins {
kotlin("jvm")
id("jps-compatible")
}
val kotlinxSerializationVersion = "0.4.2"
dependencies {
compile(project(":compiler:frontend.java"))
compile(project(":compiler:plugin-api"))
compileOnly("org.jetbrains.kotlinx", "kotlinx-serialization-runtime", kotlinxSerializationVersion) { isTransitive = false }
compile(intellijCoreDep()) { includeJars("intellij-core") }
testCompile(project(":compiler:tests-common"))
testCompile(projectTests(":compiler:tests-common"))
embeddedComponents("org.jetbrains.kotlinx", "kotlinx-serialization-runtime", kotlinxSerializationVersion) { isTransitive = false }
}
sourceSets {
"main" { projectDefault() }
"test" { projectDefault() }
}
projectTest {
workingDir = rootDir
dependsOn(":dist")
}
runtimeJar {
fromEmbeddedComponents()
}
dist()
@@ -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.
#
org.jetbrains.kotlin.importsDumper.ImportsDumperCommandLineProcessor
@@ -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.
#
org.jetbrains.kotlin.importsDumper.ImportsDumperComponentRegistrar
@@ -0,0 +1,42 @@
/*
* 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.
*/
package org.jetbrains.kotlin.importsDumper
import org.jetbrains.kotlin.compiler.plugin.CliOption
import org.jetbrains.kotlin.compiler.plugin.CliOptionProcessingException
import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.CompilerConfigurationKey
object ImportsDumperCliOptions {
val DESTINATION = CliOption(
name = "output-imports",
valueDescription = "<path>",
description = "Output imports from all compiled files to the specified file in JSON format",
required = false // non-required because importsDumper is a bundled plugin
)
}
object ImportsDumperConfigurationKeys {
val DESTINATION = CompilerConfigurationKey.create<String>("Destination of imports dump")
}
class ImportsDumperCommandLineProcessor : CommandLineProcessor {
override val pluginId: String = PLUGIN_ID
override val pluginOptions: Collection<CliOption> = listOf(ImportsDumperCliOptions.DESTINATION)
override fun processOption(option: CliOption, value: String, configuration: CompilerConfiguration) {
when (option) {
ImportsDumperCliOptions.DESTINATION -> configuration.put(ImportsDumperConfigurationKeys.DESTINATION, value)
else -> throw CliOptionProcessingException("Unknown option: ${option.name}")
}
}
companion object {
const val PLUGIN_ID = "org.jetbrains.kotlin.importsDumper"
}
}
@@ -0,0 +1,18 @@
/*
* 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.
*/
package org.jetbrains.kotlin.importsDumper
import com.intellij.mock.MockProject
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
class ImportsDumperComponentRegistrar : ComponentRegistrar {
override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) {
val destinationPath = configuration[ImportsDumperConfigurationKeys.DESTINATION] ?: return
AnalysisHandlerExtension.registerExtension(project, ImportsDumperExtension(destinationPath))
}
}
@@ -3,18 +3,14 @@
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.cli.jvm.compiler
package org.jetbrains.kotlin.importsDumper
import com.intellij.mock.MockProject
import com.intellij.openapi.project.Project
import kotlinx.serialization.internal.StringSerializer
import kotlinx.serialization.json.JSON
import kotlinx.serialization.list
import kotlinx.serialization.map
import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.container.ComponentProvider
import org.jetbrains.kotlin.context.ProjectContext
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
@@ -23,14 +19,7 @@ import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
import java.io.File
class ImportsProducerComponentRegistrar : ComponentRegistrar {
override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) {
val destinationPath = configuration[JVMConfigurationKeys.OUTPUT_IMPORTS] ?: return
AnalysisHandlerExtension.registerExtension(project, ImportsProducerExtension(destinationPath))
}
}
class ImportsProducerExtension(destinationPath: String) : AnalysisHandlerExtension {
class ImportsDumperExtension(destinationPath: String) : AnalysisHandlerExtension {
private val destination: File = File(destinationPath)
override fun doAnalysis(
@@ -3,29 +3,27 @@
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.cli
package org.jetbrains.kotlin.importsDumper
import com.intellij.openapi.util.io.FileUtil
import com.intellij.testFramework.TestDataPath
import junit.framework.TestCase
import org.jetbrains.kotlin.cli.AbstractCliTest.*
import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.test.TestCaseWithTmpdir
import org.jetbrains.kotlin.test.TestMetadata
import java.io.File
@TestMetadata("compiler/testData/importsProducer")
@TestMetadata("plugins/imports-dumper/testData")
@TestDataPath("\$PROJECT_ROOT")
class ImportsProducerTest : TestCaseWithTmpdir() {
class ImportsDumperTest : TestCaseWithTmpdir() {
@TestMetadata("simpleCase/importsProducer.args")
fun testImportsProducer() {
doTest("compiler/testData/importsProducer/simpleCase")
fun testSimple() {
doTest("plugins/imports-dumper/testData/simpleCase")
}
fun doTest(testDataDirPath: String) {
private fun doTest(testDataDirPath: String) {
System.setProperty("java.awt.headless", "true")
val testDataDir = File(testDataDirPath)
val expectedDumpFile = testDataDir.resolve(testDataDir.name + ".dump")
@@ -33,7 +31,7 @@ class ImportsProducerTest : TestCaseWithTmpdir() {
val actualDumpFile = tmpdir.resolve(testDataDir.name + ".dump")
// Check CLI-output of compiler
val actualOutput = invokeImportsProducerAndGrabOutput(testDataDir, tmpdir, actualDumpFile)
val actualOutput = invokeImportsDumperAndGrabOutput(testDataDir, tmpdir, actualDumpFile)
KotlinTestUtils.assertEqualsToFile(expectedOutputFile, actualOutput)
// Check imports dump
@@ -45,27 +43,27 @@ class ImportsProducerTest : TestCaseWithTmpdir() {
KotlinTestUtils.assertEqualsToFile(expectedDumpFile, actualRelativizedDump)
}
private fun invokeImportsProducerAndGrabOutput(testDataDir: File, tmpDir: File, actualDumpFile: File): String {
private fun invokeImportsDumperAndGrabOutput(testDataDir: File, tmpDir: File, actualDumpFile: File): String {
val importsDumperJarInDist = File("dist/kotlinc/lib/kotlin-imports-dumper-compiler-plugin.jar")
if (!importsDumperJarInDist.exists()) {
TestCase.fail(".jar for imports dumper isn't found, searched: ${importsDumperJarInDist.absolutePath}")
}
val compiler = K2JVMCompiler()
val (output, exitCode) = executeCompilerGrabOutput(
compiler,
listOf(
testDataDir.absolutePath,
DESTINATION_COMPILER_ARGUMENT,
"-d",
tmpDir.path,
OUTPUT_IMPORTS_COMPILER_ARGUMENT + "=" + actualDumpFile.path
"-Xplugin=${importsDumperJarInDist.path}",
"-P",
"plugin:${ImportsDumperCommandLineProcessor.PLUGIN_ID}:${ImportsDumperCliOptions.DESTINATION.name}=${actualDumpFile.path}"
)
)
// TestCase.assertEquals("Imports dumper should return ExitCode.OK", ExitCode.OK, exitCode)
return getNormalizedCompilerOutput(output, exitCode, testDataDir.path)
}
companion object {
const val DESTINATION_COMPILER_ARGUMENT = "-d"
const val OUTPUT_IMPORTS_COMPILER_ARGUMENT = "-Xoutput-imports"
}
}
private fun String.relativizeAbsolutePaths(relativeTo: File): String {
-1
View File
@@ -56,7 +56,6 @@ dependencies {
fatJarContents(commonDep("com.google.code.findbugs", "jsr305"))
fatJarContents(commonDep("io.javaslang", "javaslang"))
fatJarContents(commonDep("org.jetbrains.kotlinx", "kotlinx-coroutines-core")) { isTransitive = false }
fatJarContents(commonDep("org.jetbrains.kotlinx", "kotlinx-serialization-runtime")) { isTransitive = false }
proguardLibraryJars(files(firstFromJavaHomeThatExists("jre/lib/rt.jar", "../Classes/classes.jar"),
firstFromJavaHomeThatExists("jre/lib/jsse.jar", "../Classes/jsse.jar"),
-1
View File
@@ -56,7 +56,6 @@ dependencies {
fatJarContents(commonDep("com.google.code.findbugs", "jsr305"))
fatJarContents(commonDep("io.javaslang", "javaslang"))
fatJarContents(commonDep("org.jetbrains.kotlinx", "kotlinx-coroutines-core")) { isTransitive = false }
fatJarContents(commonDep("org.jetbrains.kotlinx", "kotlinx-serialization-runtime")) { isTransitive = false }
proguardLibraryJars(files(firstFromJavaHomeThatExists("jre/lib/rt.jar", "../Classes/classes.jar"),
firstFromJavaHomeThatExists("jre/lib/jsse.jar", "../Classes/jsse.jar"),
-1
View File
@@ -56,7 +56,6 @@ dependencies {
fatJarContents(commonDep("com.google.code.findbugs", "jsr305"))
fatJarContents(commonDep("io.javaslang", "javaslang"))
fatJarContents(commonDep("org.jetbrains.kotlinx", "kotlinx-coroutines-core")) { isTransitive = false }
fatJarContents(commonDep("org.jetbrains.kotlinx", "kotlinx-serialization-runtime")) { isTransitive = false }
proguardLibraryJars(files(firstFromJavaHomeThatExists("jre/lib/rt.jar", "../Classes/classes.jar"),
firstFromJavaHomeThatExists("jre/lib/jsse.jar", "../Classes/jsse.jar"),
+2
View File
@@ -89,6 +89,7 @@ include ":kotlin-build-common",
":noarg-ide-plugin",
":kotlin-sam-with-receiver-compiler-plugin",
":sam-with-receiver-ide-plugin",
":kotlin-imports-dumper-compiler-plugin",
":kotlin-source-sections-compiler-plugin",
":plugins:uast-kotlin",
":plugins:uast-kotlin-idea",
@@ -273,6 +274,7 @@ project(':examples:scripting-jvm-simple-script-host').projectDir = "$rootDir/lib
project(':examples:scripting-jvm-maven-deps').projectDir = "$rootDir/libraries/examples/scripting/jvm-maven-deps/script" as File
project(':examples:scripting-jvm-maven-deps-host').projectDir = "$rootDir/libraries/examples/scripting/jvm-maven-deps/host" as File
project(':pill:generate-all-tests').projectDir = "$rootDir/plugins/pill/generate-all-tests" as File
project(':kotlin-imports-dumper-compiler-plugin').projectDir = "$rootDir/plugins/imports-dumper" as File
// plugin markers:
project(':kotlin-gradle-plugin:plugin-marker').projectDir = file("$rootDir/libraries/tools/kotlin-gradle-plugin/plugin-marker")