Rewrite performance statistics collection
This commit introduces notion of 'PerformanceManager' in CLI, suitable
for collecting performance metrics of the compiler. It:
- provides `notifyX{Started/Finished}` API, where 'X' is some
measurable event (previously there were just ad hoc manual time
measurements using System.nanoTime() and stuff)
- collects measurements, so that later they can be reported in an
appropriate way (previously measurements were reported immediately to
MessageCollector as plain strings)
- allows overriding to collect metrics, specific for just one target
platform compilation
Also, common logic of compiler performance statistics collection was
extracted from platform-compilers (K2JVMCompiler) to common classes
(CLICompiler), to allow other platform-compilers (e.g. K2JSCompiler)
re-use it.
This commit is contained in:
+3
@@ -150,6 +150,9 @@ abstract class CommonCompilerArguments : CommonToolArguments() {
|
|||||||
)
|
)
|
||||||
var properIeee754Comparisons by FreezableVar(false)
|
var properIeee754Comparisons by FreezableVar(false)
|
||||||
|
|
||||||
|
@Argument(value = "-Xreport-perf", description = "Report detailed performance statistics")
|
||||||
|
var reportPerf: Boolean by FreezableVar(false)
|
||||||
|
|
||||||
open fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> {
|
open fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> {
|
||||||
return HashMap<AnalysisFlag<*>, Any>().apply {
|
return HashMap<AnalysisFlag<*>, Any>().apply {
|
||||||
put(AnalysisFlag.skipMetadataVersionCheck, skipMetadataVersionCheck)
|
put(AnalysisFlag.skipMetadataVersionCheck, skipMetadataVersionCheck)
|
||||||
|
|||||||
-3
@@ -124,9 +124,6 @@ class K2JVMCompilerArguments : CommonCompilerArguments() {
|
|||||||
)
|
)
|
||||||
var constructorCallNormalizationMode: String? by FreezableVar(JVMConstructorCallNormalizationMode.DEFAULT.description)
|
var constructorCallNormalizationMode: String? by FreezableVar(JVMConstructorCallNormalizationMode.DEFAULT.description)
|
||||||
|
|
||||||
@Argument(value = "-Xreport-perf", description = "Report detailed performance statistics")
|
|
||||||
var reportPerf: Boolean by FreezableVar(false)
|
|
||||||
|
|
||||||
@Argument(
|
@Argument(
|
||||||
value = "-Xbuild-file",
|
value = "-Xbuild-file",
|
||||||
deprecatedName = "-module",
|
deprecatedName = "-module",
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.cli.common;
|
|||||||
|
|
||||||
import com.intellij.openapi.Disposable;
|
import com.intellij.openapi.Disposable;
|
||||||
import com.intellij.openapi.util.Disposer;
|
import com.intellij.openapi.util.Disposer;
|
||||||
import kotlin.collections.ArraysKt;
|
|
||||||
import kotlin.jvm.functions.Function1;
|
import kotlin.jvm.functions.Function1;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -28,23 +27,23 @@ import org.jetbrains.kotlin.cli.common.messages.GroupingMessageCollector;
|
|||||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector;
|
import org.jetbrains.kotlin.cli.common.messages.MessageCollector;
|
||||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollectorUtil;
|
import org.jetbrains.kotlin.cli.common.messages.MessageCollectorUtil;
|
||||||
import org.jetbrains.kotlin.cli.common.messages.MessageRenderer;
|
import org.jetbrains.kotlin.cli.common.messages.MessageRenderer;
|
||||||
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler;
|
|
||||||
import org.jetbrains.kotlin.cli.jvm.compiler.CompilerJarLocator;
|
import org.jetbrains.kotlin.cli.jvm.compiler.CompilerJarLocator;
|
||||||
import org.jetbrains.kotlin.config.*;
|
import org.jetbrains.kotlin.config.CommonConfigurationKeys;
|
||||||
|
import org.jetbrains.kotlin.config.CommonConfigurationKeysKt;
|
||||||
|
import org.jetbrains.kotlin.config.CompilerConfiguration;
|
||||||
|
import org.jetbrains.kotlin.config.Services;
|
||||||
import org.jetbrains.kotlin.progress.CompilationCanceledException;
|
import org.jetbrains.kotlin.progress.CompilationCanceledException;
|
||||||
import org.jetbrains.kotlin.progress.CompilationCanceledStatus;
|
import org.jetbrains.kotlin.progress.CompilationCanceledStatus;
|
||||||
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
|
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
|
||||||
import org.jetbrains.kotlin.utils.KotlinPaths;
|
import org.jetbrains.kotlin.utils.KotlinPaths;
|
||||||
import org.jetbrains.kotlin.utils.KotlinPathsFromHomeDir;
|
import org.jetbrains.kotlin.utils.KotlinPathsFromHomeDir;
|
||||||
import org.jetbrains.kotlin.utils.PathUtil;
|
import org.jetbrains.kotlin.utils.PathUtil;
|
||||||
import org.jetbrains.kotlin.utils.StringsKt;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.cli.common.ExitCode.*;
|
import static org.jetbrains.kotlin.cli.common.ExitCode.COMPILATION_ERROR;
|
||||||
|
import static org.jetbrains.kotlin.cli.common.ExitCode.INTERNAL_ERROR;
|
||||||
import static org.jetbrains.kotlin.cli.common.environment.UtilKt.setIdeaIoUseFallback;
|
import static org.jetbrains.kotlin.cli.common.environment.UtilKt.setIdeaIoUseFallback;
|
||||||
import static org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.*;
|
import static org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.*;
|
||||||
|
|
||||||
@@ -69,11 +68,16 @@ public abstract class CLICompiler<A extends CommonCompilerArguments> extends CLI
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public ExitCode execImpl(@NotNull MessageCollector messageCollector, @NotNull Services services, @NotNull A arguments) {
|
public ExitCode execImpl(@NotNull MessageCollector messageCollector, @NotNull Services services, @NotNull A arguments) {
|
||||||
|
CommonCompilerPerformanceManager performanceManager = getPerformanceManager();
|
||||||
|
if (arguments.getReportPerf()) {
|
||||||
|
performanceManager.enableCollectingPerformanceStatistics();
|
||||||
|
}
|
||||||
|
|
||||||
GroupingMessageCollector groupingCollector = new GroupingMessageCollector(messageCollector, arguments.getAllWarningsAsErrors());
|
GroupingMessageCollector groupingCollector = new GroupingMessageCollector(messageCollector, arguments.getAllWarningsAsErrors());
|
||||||
|
|
||||||
CompilerConfiguration configuration = new CompilerConfiguration();
|
CompilerConfiguration configuration = new CompilerConfiguration();
|
||||||
configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, groupingCollector);
|
configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, groupingCollector);
|
||||||
|
configuration.put(CLIConfigurationKeys.PERF_MANAGER, performanceManager);
|
||||||
try {
|
try {
|
||||||
setupCommonArgumentsAndServices(configuration, arguments, services);
|
setupCommonArgumentsAndServices(configuration, arguments, services);
|
||||||
setupPlatformSpecificArgumentsAndServices(configuration, arguments, services);
|
setupPlatformSpecificArgumentsAndServices(configuration, arguments, services);
|
||||||
@@ -89,6 +93,14 @@ public abstract class CLICompiler<A extends CommonCompilerArguments> extends CLI
|
|||||||
try {
|
try {
|
||||||
setIdeaIoUseFallback();
|
setIdeaIoUseFallback();
|
||||||
ExitCode code = doExecute(arguments, configuration, rootDisposable, paths);
|
ExitCode code = doExecute(arguments, configuration, rootDisposable, paths);
|
||||||
|
|
||||||
|
performanceManager.notifyCompilationFinished();
|
||||||
|
if (arguments.getReportPerf()) {
|
||||||
|
performanceManager.getMeasurementResults().forEach(
|
||||||
|
it -> configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY).report(INFO, "PERF: " + it.render(), null)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return groupingCollector.hasErrors() ? COMPILATION_ERROR : code;
|
return groupingCollector.hasErrors() ? COMPILATION_ERROR : code;
|
||||||
}
|
}
|
||||||
catch (CompilationCanceledException e) {
|
catch (CompilationCanceledException e) {
|
||||||
@@ -212,4 +224,7 @@ public abstract class CLICompiler<A extends CommonCompilerArguments> extends CLI
|
|||||||
@NotNull Disposable rootDisposable,
|
@NotNull Disposable rootDisposable,
|
||||||
@Nullable KotlinPaths paths
|
@Nullable KotlinPaths paths
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
protected abstract CommonCompilerPerformanceManager getPerformanceManager();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ public class CLIConfigurationKeys {
|
|||||||
CompilerConfigurationKey.create("message collector");
|
CompilerConfigurationKey.create("message collector");
|
||||||
public static final CompilerConfigurationKey<Boolean> ALLOW_KOTLIN_PACKAGE =
|
public static final CompilerConfigurationKey<Boolean> ALLOW_KOTLIN_PACKAGE =
|
||||||
CompilerConfigurationKey.create("allow kotlin package");
|
CompilerConfigurationKey.create("allow kotlin package");
|
||||||
public static final CompilerConfigurationKey<Boolean> REPORT_PERF =
|
public static final CompilerConfigurationKey<CommonCompilerPerformanceManager> PERF_MANAGER =
|
||||||
CompilerConfigurationKey.create("report performance information");
|
CompilerConfigurationKey.create("performance manager");
|
||||||
|
|
||||||
// Used in Eclipse plugin (see KotlinCLICompiler)
|
// Used in Eclipse plugin (see KotlinCLICompiler)
|
||||||
public static final CompilerConfigurationKey<String> INTELLIJ_PLUGIN_ROOT =
|
public static final CompilerConfigurationKey<String> INTELLIJ_PLUGIN_ROOT =
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* 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.cli.common
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.util.PerformanceCounter
|
||||||
|
import java.lang.management.ManagementFactory
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
abstract class CommonCompilerPerformanceManager(private val presentableName: String) {
|
||||||
|
protected val measurements: MutableList<PerformanceMeasurement> = mutableListOf()
|
||||||
|
protected var isEnabled: Boolean = false
|
||||||
|
private var initStartNanos = PerformanceCounter.currentTime()
|
||||||
|
private var analysisStart: Long = 0
|
||||||
|
private var generationStart: Long = 0
|
||||||
|
|
||||||
|
fun getMeasurementResults(): List<PerformanceMeasurement> = measurements
|
||||||
|
|
||||||
|
fun enableCollectingPerformanceStatistics() {
|
||||||
|
isEnabled = true
|
||||||
|
PerformanceCounter.setTimeCounterEnabled(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun notifyCompilerInitialized() {
|
||||||
|
if (!isEnabled) return
|
||||||
|
recordInitializationTime()
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun notifyCompilationFinished() {
|
||||||
|
if (!isEnabled) return
|
||||||
|
recordGcTime()
|
||||||
|
recordJitCompilationTime()
|
||||||
|
recordPerfCountersMeasurements()
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun notifyAnalysisStarted() {
|
||||||
|
analysisStart = PerformanceCounter.currentTime()
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun notifyAnalysisFinished(files: Int, lines: Int, additionalDescription: String?) {
|
||||||
|
val time = PerformanceCounter.currentTime() - analysisStart
|
||||||
|
measurements += CodeAnalysisMeasurement(files, lines, TimeUnit.NANOSECONDS.toMillis(time), additionalDescription)
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun notifyGenerationStarted() {
|
||||||
|
generationStart = PerformanceCounter.currentTime()
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun notifyGenerationFinished(lines: Int, files: Int, additionalDescription: String) {
|
||||||
|
val time = PerformanceCounter.currentTime() - generationStart
|
||||||
|
measurements += CodeGenerationMeasurement(lines, files, TimeUnit.NANOSECONDS.toMillis(time), additionalDescription)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun recordGcTime() {
|
||||||
|
if (!isEnabled) return
|
||||||
|
|
||||||
|
ManagementFactory.getGarbageCollectorMXBeans().forEach {
|
||||||
|
measurements += GarbageCollectionMeasurement(it.name, it.collectionTime)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun recordJitCompilationTime() {
|
||||||
|
if (!isEnabled) return
|
||||||
|
|
||||||
|
val bean = ManagementFactory.getCompilationMXBean() ?: return
|
||||||
|
measurements += JitCompilationMeasurement(bean.totalCompilationTime)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun recordInitializationTime() {
|
||||||
|
val time = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - initStartNanos)
|
||||||
|
measurements += CompilerInitializationMeasurement(time)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun recordPerfCountersMeasurements() {
|
||||||
|
PerformanceCounter.report { s -> measurements += PerformanceCounterMeasurement(s) }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* 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.cli.common
|
||||||
|
|
||||||
|
interface PerformanceMeasurement {
|
||||||
|
fun render(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class JitCompilationMeasurement(private val milliseconds: Long) : PerformanceMeasurement {
|
||||||
|
override fun render(): String = "JIT time is $milliseconds ms"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class CompilerInitializationMeasurement(private val milliseconds: Long) : PerformanceMeasurement {
|
||||||
|
override fun render(): String = "INIT: Compiler initialized in $milliseconds ms"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class CodeAnalysisMeasurement(private val files: Int, val lines: Int, private val milliseconds: Long, private val description: String?) :
|
||||||
|
PerformanceMeasurement {
|
||||||
|
|
||||||
|
private val speed: Double = lines.toDouble() * 1000 / milliseconds
|
||||||
|
|
||||||
|
override fun render(): String =
|
||||||
|
"ANALYZE: $files files ($lines lines) ${description ?: ""}in $milliseconds ms - ${"%.3f".format(speed)} loc/s"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class CodeGenerationMeasurement(private val files: Int, val lines: Int, private val milliseconds: Long, private val description: String?) :
|
||||||
|
PerformanceMeasurement {
|
||||||
|
|
||||||
|
private val speed: Double = lines.toDouble() * 1000 / milliseconds
|
||||||
|
|
||||||
|
override fun render(): String =
|
||||||
|
"GENERATE: $files files ($lines lines) ${description}in $milliseconds ms - ${"%.3f".format(speed)} loc/s"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class GarbageCollectionMeasurement(private val garbageCollectionKind: String, private val milliseconds: Long) : PerformanceMeasurement {
|
||||||
|
override fun render(): String = "GC time for $garbageCollectionKind is $milliseconds ms"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class PerformanceCounterMeasurement(private val counterReport: String) : PerformanceMeasurement {
|
||||||
|
override fun render(): String = counterReport
|
||||||
|
}
|
||||||
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.analyzer.AnalysisResult;
|
|||||||
import org.jetbrains.kotlin.backend.common.output.OutputFileCollection;
|
import org.jetbrains.kotlin.backend.common.output.OutputFileCollection;
|
||||||
import org.jetbrains.kotlin.cli.common.CLICompiler;
|
import org.jetbrains.kotlin.cli.common.CLICompiler;
|
||||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys;
|
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys;
|
||||||
|
import org.jetbrains.kotlin.cli.common.CommonCompilerPerformanceManager;
|
||||||
import org.jetbrains.kotlin.cli.common.ExitCode;
|
import org.jetbrains.kotlin.cli.common.ExitCode;
|
||||||
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments;
|
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments;
|
||||||
import org.jetbrains.kotlin.cli.common.arguments.K2JsArgumentConstants;
|
import org.jetbrains.kotlin.cli.common.arguments.K2JsArgumentConstants;
|
||||||
@@ -95,6 +96,8 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
|
|||||||
doMain(new K2JSCompiler(), args);
|
doMain(new K2JSCompiler(), args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final K2JSCompilerPerformanceManager performanceManager = new K2JSCompilerPerformanceManager();
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public K2JSCompilerArguments createArguments() {
|
public K2JSCompilerArguments createArguments() {
|
||||||
@@ -513,6 +516,11 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
|
|||||||
return commonPath != null ? commonPath.getPath() : ".";
|
return commonPath != null ? commonPath.getPath() : ".";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
protected CommonCompilerPerformanceManager getPerformanceManager() {
|
||||||
|
return performanceManager;
|
||||||
|
}
|
||||||
|
|
||||||
private static MainCallParameters createMainCallParameters(String main) {
|
private static MainCallParameters createMainCallParameters(String main) {
|
||||||
if (K2JsArgumentConstants.NO_CALL.equals(main)) {
|
if (K2JsArgumentConstants.NO_CALL.equals(main)) {
|
||||||
@@ -528,4 +536,12 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
|
|||||||
public String executableScriptFileName() {
|
public String executableScriptFileName() {
|
||||||
return "kotlinc-js";
|
return "kotlinc-js";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final class K2JSCompilerPerformanceManager extends CommonCompilerPerformanceManager {
|
||||||
|
public K2JSCompilerPerformanceManager() {
|
||||||
|
super("Kotlin to JS Compiler");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,11 +18,7 @@ package org.jetbrains.kotlin.cli.jvm
|
|||||||
|
|
||||||
import com.intellij.ide.highlighter.JavaFileType
|
import com.intellij.ide.highlighter.JavaFileType
|
||||||
import com.intellij.openapi.Disposable
|
import com.intellij.openapi.Disposable
|
||||||
import org.jetbrains.kotlin.cli.common.CLICompiler
|
import org.jetbrains.kotlin.cli.common.*
|
||||||
import org.jetbrains.kotlin.cli.common.CLICompiler.getLibraryFromHome
|
|
||||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
|
||||||
import org.jetbrains.kotlin.cli.common.CLITool
|
|
||||||
import org.jetbrains.kotlin.cli.common.ExitCode
|
|
||||||
import org.jetbrains.kotlin.cli.common.ExitCode.*
|
import org.jetbrains.kotlin.cli.common.ExitCode.*
|
||||||
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
|
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
|
||||||
import org.jetbrains.kotlin.cli.common.messages.*
|
import org.jetbrains.kotlin.cli.common.messages.*
|
||||||
@@ -47,22 +43,21 @@ import org.jetbrains.kotlin.load.java.JvmAbi
|
|||||||
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
|
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
|
||||||
import org.jetbrains.kotlin.script.ScriptDefinitionProvider
|
import org.jetbrains.kotlin.script.ScriptDefinitionProvider
|
||||||
import org.jetbrains.kotlin.script.StandardScriptDefinition
|
import org.jetbrains.kotlin.script.StandardScriptDefinition
|
||||||
import org.jetbrains.kotlin.util.PerformanceCounter
|
|
||||||
import org.jetbrains.kotlin.utils.KotlinPaths
|
import org.jetbrains.kotlin.utils.KotlinPaths
|
||||||
import org.jetbrains.kotlin.utils.PathUtil
|
import org.jetbrains.kotlin.utils.PathUtil
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.lang.management.ManagementFactory
|
import java.util.*
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
|
|
||||||
class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
|
class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
|
||||||
|
|
||||||
|
private val performanceManager: K2JVMCompilerPerformanceManager = K2JVMCompilerPerformanceManager()
|
||||||
|
|
||||||
override fun doExecute(
|
override fun doExecute(
|
||||||
arguments: K2JVMCompilerArguments,
|
arguments: K2JVMCompilerArguments,
|
||||||
configuration: CompilerConfiguration,
|
configuration: CompilerConfiguration,
|
||||||
rootDisposable: Disposable,
|
rootDisposable: Disposable,
|
||||||
paths: KotlinPaths?
|
paths: KotlinPaths?
|
||||||
): ExitCode {
|
): ExitCode {
|
||||||
PerformanceCounter.setTimeCounterEnabled(arguments.reportPerf)
|
|
||||||
|
|
||||||
val messageCollector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
|
val messageCollector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
|
||||||
|
|
||||||
configureJdkHome(arguments, configuration, messageCollector).let {
|
configureJdkHome(arguments, configuration, messageCollector).let {
|
||||||
@@ -209,11 +204,6 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arguments.reportPerf) {
|
|
||||||
reportGCTime(configuration)
|
|
||||||
reportCompilationTime(configuration)
|
|
||||||
PerformanceCounter.report { s -> reportPerf(configuration, s) }
|
|
||||||
}
|
|
||||||
return OK
|
return OK
|
||||||
} catch (e: CompilationException) {
|
} catch (e: CompilationException) {
|
||||||
messageCollector.report(
|
messageCollector.report(
|
||||||
@@ -225,6 +215,8 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getPerformanceManager(): CommonCompilerPerformanceManager = performanceManager
|
||||||
|
|
||||||
private fun loadPlugins(paths: KotlinPaths?, arguments: K2JVMCompilerArguments, configuration: CompilerConfiguration): ExitCode {
|
private fun loadPlugins(paths: KotlinPaths?, arguments: K2JVMCompilerArguments, configuration: CompilerConfiguration): ExitCode {
|
||||||
val pluginClasspaths = arguments.pluginClasspaths?.toMutableList() ?: ArrayList()
|
val pluginClasspaths = arguments.pluginClasspaths?.toMutableList() ?: ArrayList()
|
||||||
val pluginOptions = arguments.pluginOptions?.toMutableList() ?: ArrayList()
|
val pluginOptions = arguments.pluginOptions?.toMutableList() ?: ArrayList()
|
||||||
@@ -300,11 +292,7 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
|
|||||||
|
|
||||||
val environment = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
|
val environment = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
|
||||||
|
|
||||||
if (initStartNanos != 0L) {
|
performanceManager.notifyCompilerInitialized()
|
||||||
val initNanos = System.nanoTime() - initStartNanos
|
|
||||||
reportPerf(configuration, "INIT: Compiler initialized in " + TimeUnit.NANOSECONDS.toMillis(initNanos) + " ms")
|
|
||||||
initStartNanos = 0L
|
|
||||||
}
|
|
||||||
|
|
||||||
return if (messageCollector.hasErrors()) null else environment
|
return if (messageCollector.hasErrors()) null else environment
|
||||||
}
|
}
|
||||||
@@ -343,31 +331,14 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
|
|||||||
|
|
||||||
override fun executableScriptFileName(): String = "kotlinc-jvm"
|
override fun executableScriptFileName(): String = "kotlinc-jvm"
|
||||||
|
|
||||||
companion object {
|
private class K2JVMCompilerPerformanceManager : CommonCompilerPerformanceManager("Kotlin to JVM Compiler")
|
||||||
private var initStartNanos = System.nanoTime()
|
|
||||||
|
|
||||||
|
companion object {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun main(args: Array<String>) {
|
fun main(args: Array<String>) {
|
||||||
CLITool.doMain(K2JVMCompiler(), args)
|
CLITool.doMain(K2JVMCompiler(), args)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun reportPerf(configuration: CompilerConfiguration, message: String) {
|
|
||||||
if (!configuration.getBoolean(CLIConfigurationKeys.REPORT_PERF)) return
|
|
||||||
|
|
||||||
configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY).report(INFO, "PERF: $message")
|
|
||||||
}
|
|
||||||
|
|
||||||
fun reportGCTime(configuration: CompilerConfiguration) {
|
|
||||||
ManagementFactory.getGarbageCollectorMXBeans().forEach {
|
|
||||||
reportPerf(configuration, "GC time for ${it.name} is ${it.collectionTime} ms")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun reportCompilationTime(configuration: CompilerConfiguration) {
|
|
||||||
val bean = ManagementFactory.getCompilationMXBean() ?: return
|
|
||||||
reportPerf(configuration, "JIT time is ${bean.totalCompilationTime} ms")
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun putAdvancedOptions(configuration: CompilerConfiguration, arguments: K2JVMCompilerArguments) {
|
private fun putAdvancedOptions(configuration: CompilerConfiguration, arguments: K2JVMCompilerArguments) {
|
||||||
configuration.put(JVMConfigurationKeys.DISABLE_CALL_ASSERTIONS, arguments.noCallAssertions)
|
configuration.put(JVMConfigurationKeys.DISABLE_CALL_ASSERTIONS, arguments.noCallAssertions)
|
||||||
configuration.put(JVMConfigurationKeys.DISABLE_RECEIVER_ASSERTIONS, arguments.noReceiverAssertions)
|
configuration.put(JVMConfigurationKeys.DISABLE_RECEIVER_ASSERTIONS, arguments.noReceiverAssertions)
|
||||||
@@ -403,7 +374,6 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
configuration.put(CLIConfigurationKeys.ALLOW_KOTLIN_PACKAGE, arguments.allowKotlinPackage)
|
configuration.put(CLIConfigurationKeys.ALLOW_KOTLIN_PACKAGE, arguments.allowKotlinPackage)
|
||||||
configuration.put(CLIConfigurationKeys.REPORT_PERF, arguments.reportPerf)
|
|
||||||
configuration.put(JVMConfigurationKeys.USE_SINGLE_MODULE, arguments.singleModule)
|
configuration.put(JVMConfigurationKeys.USE_SINGLE_MODULE, arguments.singleModule)
|
||||||
configuration.put(JVMConfigurationKeys.ADD_BUILT_INS_FROM_COMPILER_TO_DEPENDENCIES, arguments.addCompilerBuiltIns)
|
configuration.put(JVMConfigurationKeys.ADD_BUILT_INS_FROM_COMPILER_TO_DEPENDENCIES, arguments.addCompilerBuiltIns)
|
||||||
configuration.put(JVMConfigurationKeys.CREATE_BUILT_INS_FROM_MODULE_DEPENDENCIES, arguments.loadBuiltInsFromDependencies)
|
configuration.put(JVMConfigurationKeys.CREATE_BUILT_INS_FROM_MODULE_DEPENDENCIES, arguments.loadBuiltInsFromDependencies)
|
||||||
|
|||||||
+13
-24
@@ -29,16 +29,13 @@ import org.jetbrains.kotlin.asJava.FilteredJvmDiagnostics
|
|||||||
import org.jetbrains.kotlin.backend.common.output.OutputFileCollection
|
import org.jetbrains.kotlin.backend.common.output.OutputFileCollection
|
||||||
import org.jetbrains.kotlin.backend.common.output.SimpleOutputFileCollection
|
import org.jetbrains.kotlin.backend.common.output.SimpleOutputFileCollection
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
|
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
|
||||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
import org.jetbrains.kotlin.cli.common.*
|
||||||
import org.jetbrains.kotlin.cli.common.ExitCode
|
|
||||||
import org.jetbrains.kotlin.cli.common.checkKotlinPackageUsage
|
|
||||||
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
|
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
|
||||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.OUTPUT
|
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.OUTPUT
|
||||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.WARNING
|
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.WARNING
|
||||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||||
import org.jetbrains.kotlin.cli.common.messages.OutputMessageUtil
|
import org.jetbrains.kotlin.cli.common.messages.OutputMessageUtil
|
||||||
import org.jetbrains.kotlin.cli.common.output.outputUtils.writeAll
|
import org.jetbrains.kotlin.cli.common.output.outputUtils.writeAll
|
||||||
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
|
|
||||||
import org.jetbrains.kotlin.cli.jvm.config.*
|
import org.jetbrains.kotlin.cli.jvm.config.*
|
||||||
import org.jetbrains.kotlin.codegen.*
|
import org.jetbrains.kotlin.codegen.*
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
@@ -356,7 +353,10 @@ object KotlinToJVMBytecodeCompiler {
|
|||||||
val sourceFiles = environment.getSourceFiles()
|
val sourceFiles = environment.getSourceFiles()
|
||||||
val collector = environment.messageCollector
|
val collector = environment.messageCollector
|
||||||
|
|
||||||
val analysisStart = PerformanceCounter.currentTime()
|
// Can be null for Scripts/REPL
|
||||||
|
val performanceManager = environment.configuration.get(CLIConfigurationKeys.PERF_MANAGER)
|
||||||
|
performanceManager?.notifyAnalysisStarted()
|
||||||
|
|
||||||
val analyzerWithCompilerReport = AnalyzerWithCompilerReport(collector, environment.configuration.languageVersionSettings)
|
val analyzerWithCompilerReport = AnalyzerWithCompilerReport(collector, environment.configuration.languageVersionSettings)
|
||||||
analyzerWithCompilerReport.analyzeAndReport(sourceFiles) {
|
analyzerWithCompilerReport.analyzeAndReport(sourceFiles) {
|
||||||
val project = environment.project
|
val project = environment.project
|
||||||
@@ -377,16 +377,7 @@ object KotlinToJVMBytecodeCompiler {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val analysisNanos = PerformanceCounter.currentTime() - analysisStart
|
performanceManager?.notifyAnalysisFinished(sourceFiles.size, environment.countLinesOfCode(sourceFiles), targetDescription)
|
||||||
|
|
||||||
val sourceLinesOfCode = environment.countLinesOfCode(sourceFiles)
|
|
||||||
val time = TimeUnit.NANOSECONDS.toMillis(analysisNanos)
|
|
||||||
val speed = sourceLinesOfCode.toFloat() * 1000 / time
|
|
||||||
|
|
||||||
val message = "ANALYZE: ${sourceFiles.size} files ($sourceLinesOfCode lines) ${targetDescription ?: ""}" +
|
|
||||||
"in $time ms - ${"%.3f".format(speed)} loc/s"
|
|
||||||
|
|
||||||
K2JVMCompiler.reportPerf(environment.configuration, message)
|
|
||||||
|
|
||||||
val analysisResult = analyzerWithCompilerReport.analysisResult
|
val analysisResult = analyzerWithCompilerReport.analysisResult
|
||||||
|
|
||||||
@@ -445,19 +436,17 @@ object KotlinToJVMBytecodeCompiler {
|
|||||||
|
|
||||||
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
||||||
|
|
||||||
val generationStart = PerformanceCounter.currentTime()
|
val performanceManager = environment.configuration.get(CLIConfigurationKeys.PERF_MANAGER)
|
||||||
|
performanceManager?.notifyGenerationStarted()
|
||||||
|
|
||||||
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)
|
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)
|
||||||
|
|
||||||
val generationNanos = PerformanceCounter.currentTime() - generationStart
|
performanceManager?.notifyGenerationFinished(
|
||||||
val desc = if (module != null) "target " + module.getModuleName() + "-" + module.getModuleType() + " " else ""
|
sourceFiles.size,
|
||||||
val numberOfSourceFiles = sourceFiles.size
|
environment.countLinesOfCode(sourceFiles),
|
||||||
val numberOfLines = environment.countLinesOfCode(sourceFiles)
|
additionalDescription = if (module != null) "target " + module.getModuleName() + "-" + module.getModuleType() + " " else ""
|
||||||
val time = TimeUnit.NANOSECONDS.toMillis(generationNanos)
|
)
|
||||||
val speed = numberOfLines.toFloat() * 1000 / time
|
|
||||||
val message = "GENERATE: $numberOfSourceFiles files ($numberOfLines lines) ${desc}in $time ms - ${"%.3f".format(speed)} loc/s"
|
|
||||||
|
|
||||||
K2JVMCompiler.reportPerf(environment.configuration, message)
|
|
||||||
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
||||||
|
|
||||||
AnalyzerWithCompilerReport.reportDiagnostics(
|
AnalyzerWithCompilerReport.reportDiagnostics(
|
||||||
|
|||||||
+12
-20
@@ -355,7 +355,10 @@ object KotlinToJVMBytecodeCompiler {
|
|||||||
val sourceFiles = environment.getSourceFiles()
|
val sourceFiles = environment.getSourceFiles()
|
||||||
val collector = environment.messageCollector
|
val collector = environment.messageCollector
|
||||||
|
|
||||||
val analysisStart = PerformanceCounter.currentTime()
|
// Can be null for Scripts/REPL
|
||||||
|
val performanceManager = environment.configuration.get(CLIConfigurationKeys.PERF_MANAGER)
|
||||||
|
performanceManager?.notifyAnalysisStarted()
|
||||||
|
|
||||||
val analyzerWithCompilerReport = AnalyzerWithCompilerReport(collector, environment.configuration.languageVersionSettings)
|
val analyzerWithCompilerReport = AnalyzerWithCompilerReport(collector, environment.configuration.languageVersionSettings)
|
||||||
analyzerWithCompilerReport.analyzeAndReport(sourceFiles) {
|
analyzerWithCompilerReport.analyzeAndReport(sourceFiles) {
|
||||||
val project = environment.project
|
val project = environment.project
|
||||||
@@ -376,16 +379,7 @@ object KotlinToJVMBytecodeCompiler {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val analysisNanos = PerformanceCounter.currentTime() - analysisStart
|
performanceManager?.notifyAnalysisFinished(sourceFiles.size, environment.countLinesOfCode(sourceFiles), targetDescription)
|
||||||
|
|
||||||
val sourceLinesOfCode = environment.countLinesOfCode(sourceFiles)
|
|
||||||
val time = TimeUnit.NANOSECONDS.toMillis(analysisNanos)
|
|
||||||
val speed = sourceLinesOfCode.toFloat() * 1000 / time
|
|
||||||
|
|
||||||
val message = "ANALYZE: ${sourceFiles.size} files ($sourceLinesOfCode lines) ${targetDescription ?: ""}" +
|
|
||||||
"in $time ms - ${"%.3f".format(speed)} loc/s"
|
|
||||||
|
|
||||||
K2JVMCompiler.reportPerf(environment.configuration, message)
|
|
||||||
|
|
||||||
val analysisResult = analyzerWithCompilerReport.analysisResult
|
val analysisResult = analyzerWithCompilerReport.analysisResult
|
||||||
|
|
||||||
@@ -444,19 +438,17 @@ object KotlinToJVMBytecodeCompiler {
|
|||||||
|
|
||||||
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
||||||
|
|
||||||
val generationStart = PerformanceCounter.currentTime()
|
val performanceManager = environment.configuration.get(CLIConfigurationKeys.PERF_MANAGER)
|
||||||
|
performanceManager?.notifyGenerationStarted()
|
||||||
|
|
||||||
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)
|
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)
|
||||||
|
|
||||||
val generationNanos = PerformanceCounter.currentTime() - generationStart
|
performanceManager?.notifyGenerationFinished(
|
||||||
val desc = if (module != null) "target " + module.getModuleName() + "-" + module.getModuleType() + " " else ""
|
sourceFiles.size,
|
||||||
val numberOfSourceFiles = sourceFiles.size
|
environment.countLinesOfCode(sourceFiles),
|
||||||
val numberOfLines = environment.countLinesOfCode(sourceFiles)
|
additionalDescription = if (module != null) "target " + module.getModuleName() + "-" + module.getModuleType() + " " else ""
|
||||||
val time = TimeUnit.NANOSECONDS.toMillis(generationNanos)
|
)
|
||||||
val speed = numberOfLines.toFloat() * 1000 / time
|
|
||||||
val message = "GENERATE: $numberOfSourceFiles files ($numberOfLines lines) ${desc}in $time ms - ${"%.3f".format(speed)} loc/s"
|
|
||||||
|
|
||||||
K2JVMCompiler.reportPerf(environment.configuration, message)
|
|
||||||
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
||||||
|
|
||||||
AnalyzerWithCompilerReport.reportDiagnostics(
|
AnalyzerWithCompilerReport.reportDiagnostics(
|
||||||
|
|||||||
+12
-20
@@ -355,7 +355,10 @@ object KotlinToJVMBytecodeCompiler {
|
|||||||
val sourceFiles = environment.getSourceFiles()
|
val sourceFiles = environment.getSourceFiles()
|
||||||
val collector = environment.messageCollector
|
val collector = environment.messageCollector
|
||||||
|
|
||||||
val analysisStart = PerformanceCounter.currentTime()
|
// Can be null for Scripts/REPL
|
||||||
|
val performanceManager = environment.configuration.get(CLIConfigurationKeys.PERF_MANAGER)
|
||||||
|
performanceManager?.notifyAnalysisStarted()
|
||||||
|
|
||||||
val analyzerWithCompilerReport = AnalyzerWithCompilerReport(collector, environment.configuration.languageVersionSettings)
|
val analyzerWithCompilerReport = AnalyzerWithCompilerReport(collector, environment.configuration.languageVersionSettings)
|
||||||
analyzerWithCompilerReport.analyzeAndReport(sourceFiles) {
|
analyzerWithCompilerReport.analyzeAndReport(sourceFiles) {
|
||||||
val project = environment.project
|
val project = environment.project
|
||||||
@@ -376,16 +379,7 @@ object KotlinToJVMBytecodeCompiler {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val analysisNanos = PerformanceCounter.currentTime() - analysisStart
|
performanceManager?.notifyAnalysisFinished(sourceFiles.size, environment.countLinesOfCode(sourceFiles), targetDescription)
|
||||||
|
|
||||||
val sourceLinesOfCode = environment.countLinesOfCode(sourceFiles)
|
|
||||||
val time = TimeUnit.NANOSECONDS.toMillis(analysisNanos)
|
|
||||||
val speed = sourceLinesOfCode.toFloat() * 1000 / time
|
|
||||||
|
|
||||||
val message = "ANALYZE: ${sourceFiles.size} files ($sourceLinesOfCode lines) ${targetDescription ?: ""}" +
|
|
||||||
"in $time ms - ${"%.3f".format(speed)} loc/s"
|
|
||||||
|
|
||||||
K2JVMCompiler.reportPerf(environment.configuration, message)
|
|
||||||
|
|
||||||
val analysisResult = analyzerWithCompilerReport.analysisResult
|
val analysisResult = analyzerWithCompilerReport.analysisResult
|
||||||
|
|
||||||
@@ -444,19 +438,17 @@ object KotlinToJVMBytecodeCompiler {
|
|||||||
|
|
||||||
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
||||||
|
|
||||||
val generationStart = PerformanceCounter.currentTime()
|
val performanceManager = environment.configuration.get(CLIConfigurationKeys.PERF_MANAGER)
|
||||||
|
performanceManager?.notifyGenerationStarted()
|
||||||
|
|
||||||
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)
|
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)
|
||||||
|
|
||||||
val generationNanos = PerformanceCounter.currentTime() - generationStart
|
performanceManager?.notifyGenerationFinished(
|
||||||
val desc = if (module != null) "target " + module.getModuleName() + "-" + module.getModuleType() + " " else ""
|
sourceFiles.size,
|
||||||
val numberOfSourceFiles = sourceFiles.size
|
environment.countLinesOfCode(sourceFiles),
|
||||||
val numberOfLines = environment.countLinesOfCode(sourceFiles)
|
additionalDescription = if (module != null) "target " + module.getModuleName() + "-" + module.getModuleType() + " " else ""
|
||||||
val time = TimeUnit.NANOSECONDS.toMillis(generationNanos)
|
)
|
||||||
val speed = numberOfLines.toFloat() * 1000 / time
|
|
||||||
val message = "GENERATE: $numberOfSourceFiles files ($numberOfLines lines) ${desc}in $time ms - ${"%.3f".format(speed)} loc/s"
|
|
||||||
|
|
||||||
K2JVMCompiler.reportPerf(environment.configuration, message)
|
|
||||||
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
||||||
|
|
||||||
AnalyzerWithCompilerReport.reportDiagnostics(
|
AnalyzerWithCompilerReport.reportDiagnostics(
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.cli.metadata
|
|||||||
import com.intellij.openapi.Disposable
|
import com.intellij.openapi.Disposable
|
||||||
import org.jetbrains.kotlin.cli.common.CLICompiler
|
import org.jetbrains.kotlin.cli.common.CLICompiler
|
||||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
||||||
|
import org.jetbrains.kotlin.cli.common.CommonCompilerPerformanceManager
|
||||||
import org.jetbrains.kotlin.cli.common.ExitCode
|
import org.jetbrains.kotlin.cli.common.ExitCode
|
||||||
import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments
|
import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments
|
||||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.*
|
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.*
|
||||||
@@ -38,6 +39,8 @@ import org.jetbrains.kotlin.utils.KotlinPaths
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class K2MetadataCompiler : CLICompiler<K2MetadataCompilerArguments>() {
|
class K2MetadataCompiler : CLICompiler<K2MetadataCompilerArguments>() {
|
||||||
|
private val performanceManager: K2MetadataCompilerPerformanceManager = K2MetadataCompilerPerformanceManager()
|
||||||
|
|
||||||
override fun createArguments() = K2MetadataCompilerArguments()
|
override fun createArguments() = K2MetadataCompilerArguments()
|
||||||
|
|
||||||
override fun setupPlatformSpecificArgumentsAndServices(
|
override fun setupPlatformSpecificArgumentsAndServices(
|
||||||
@@ -99,10 +102,14 @@ class K2MetadataCompiler : CLICompiler<K2MetadataCompilerArguments>() {
|
|||||||
// TODO: update this once a launcher script for K2MetadataCompiler is available
|
// TODO: update this once a launcher script for K2MetadataCompiler is available
|
||||||
override fun executableScriptFileName(): String = "kotlinc"
|
override fun executableScriptFileName(): String = "kotlinc"
|
||||||
|
|
||||||
|
override fun getPerformanceManager(): CommonCompilerPerformanceManager = performanceManager
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun main(args: Array<String>) {
|
fun main(args: Array<String>) {
|
||||||
doMain(K2MetadataCompiler(), args)
|
doMain(K2MetadataCompiler(), args)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class K2MetadataCompilerPerformanceManager : CommonCompilerPerformanceManager("Kotlin to Metadata compiler")
|
||||||
}
|
}
|
||||||
+1
@@ -18,6 +18,7 @@ where advanced options include:
|
|||||||
-Xproper-ieee754-comparisons Generate proper IEEE 754 comparisons in all cases if values are statically known to be of primitive numeric types
|
-Xproper-ieee754-comparisons Generate proper IEEE 754 comparisons in all cases if values are statically known to be of primitive numeric types
|
||||||
-Xread-deserialized-contracts Enable reading of contracts from metadata
|
-Xread-deserialized-contracts Enable reading of contracts from metadata
|
||||||
-Xreport-output-files Report source to output files mapping
|
-Xreport-output-files Report source to output files mapping
|
||||||
|
-Xreport-perf Report detailed performance statistics
|
||||||
-Xskip-metadata-version-check Load classes with bad metadata version anyway (incl. pre-release classes)
|
-Xskip-metadata-version-check Load classes with bad metadata version anyway (incl. pre-release classes)
|
||||||
-Xuse-experimental=<fq.name> Enable usages of COMPILATION-affecting experimental API for marker annotation with the given fully qualified name
|
-Xuse-experimental=<fq.name> Enable usages of COMPILATION-affecting experimental API for marker annotation with the given fully qualified name
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -32,7 +32,6 @@ where advanced options include:
|
|||||||
-Xno-optimize Disable optimizations
|
-Xno-optimize Disable optimizations
|
||||||
-Xno-param-assertions Don't generate not-null assertions on parameters of methods accessible from Java
|
-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
|
-Xno-receiver-assertions Don't generate not-null assertion for extension receiver arguments of platform types
|
||||||
-Xreport-perf Report detailed performance statistics
|
|
||||||
-Xscript-resolver-environment=<key=value[,]>
|
-Xscript-resolver-environment=<key=value[,]>
|
||||||
Script resolver environment in key-value pairs (the value could be quoted and escaped)
|
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
|
-Xsingle-module Combine modules for source files and binary dependencies into a single module
|
||||||
@@ -60,6 +59,7 @@ where advanced options include:
|
|||||||
-Xproper-ieee754-comparisons Generate proper IEEE 754 comparisons in all cases if values are statically known to be of primitive numeric types
|
-Xproper-ieee754-comparisons Generate proper IEEE 754 comparisons in all cases if values are statically known to be of primitive numeric types
|
||||||
-Xread-deserialized-contracts Enable reading of contracts from metadata
|
-Xread-deserialized-contracts Enable reading of contracts from metadata
|
||||||
-Xreport-output-files Report source to output files mapping
|
-Xreport-output-files Report source to output files mapping
|
||||||
|
-Xreport-perf Report detailed performance statistics
|
||||||
-Xskip-metadata-version-check Load classes with bad metadata version anyway (incl. pre-release classes)
|
-Xskip-metadata-version-check Load classes with bad metadata version anyway (incl. pre-release classes)
|
||||||
-Xuse-experimental=<fq.name> Enable usages of COMPILATION-affecting experimental API for marker annotation with the given fully qualified name
|
-Xuse-experimental=<fq.name> Enable usages of COMPILATION-affecting experimental API for marker annotation with the given fully qualified name
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user