From f42f2fa743c2379928c95d82f5e4bdf0c1953a21 Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Thu, 28 Jan 2021 16:26:39 +0300 Subject: [PATCH] JS DCE: disable logging by default Based on Vladislav Saifulin's PR #4031 --- .../jetbrains/kotlin/cli/js/dce/K2JSDce.kt | 23 ++++++++++++------- .../kotlin/js/dce/DeadCodeElimination.kt | 10 +++++--- .../kotlin/js/dce/ReachabilityTracker.kt | 17 +++++++------- .../kotlin/js/test/AbstractDceTest.kt | 2 +- .../jetbrains/kotlin/js/test/BasicBoxTest.kt | 2 +- 5 files changed, 33 insertions(+), 21 deletions(-) diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/dce/K2JSDce.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/dce/K2JSDce.kt index b43423987a2..bec311e0b37 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/dce/K2JSDce.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/dce/K2JSDce.kt @@ -76,16 +76,23 @@ class K2JSDce : CLITool() { messageCollector.report(severity, message) } - val dceResult = DeadCodeElimination.run(files, includedDeclarations, logConsumer) + val dceResult = DeadCodeElimination.run( + files, + includedDeclarations, + arguments.printReachabilityInfo, + logConsumer + ) if (dceResult.status == DeadCodeEliminationStatus.FAILED) return ExitCode.COMPILATION_ERROR - val reachabilitySeverity = if (arguments.printReachabilityInfo) CompilerMessageSeverity.INFO else CompilerMessageSeverity.LOGGING - messageCollector.report(reachabilitySeverity, "") - for (node in dceResult.reachableNodes.extractReachableRoots(dceResult.context!!)) { - printTree( - node, { messageCollector.report(reachabilitySeverity, it) }, - printNestedMembers = false, showLocations = true - ) + if (arguments.printReachabilityInfo) { + val reachabilitySeverity = CompilerMessageSeverity.INFO + messageCollector.report(reachabilitySeverity, "") + for (node in dceResult.reachableNodes.extractReachableRoots(dceResult.context!!)) { + printTree( + node, { messageCollector.report(reachabilitySeverity, it) }, + printNestedMembers = false, showLocations = true + ) + } } return ExitCode.OK diff --git a/js/js.dce/src/org/jetbrains/kotlin/js/dce/DeadCodeElimination.kt b/js/js.dce/src/org/jetbrains/kotlin/js/dce/DeadCodeElimination.kt index c47c0509760..789c5f2e815 100644 --- a/js/js.dce/src/org/jetbrains/kotlin/js/dce/DeadCodeElimination.kt +++ b/js/js.dce/src/org/jetbrains/kotlin/js/dce/DeadCodeElimination.kt @@ -38,7 +38,10 @@ import org.jetbrains.kotlin.js.util.TextOutputImpl import java.io.File import java.io.InputStreamReader -class DeadCodeElimination(private val logConsumer: (DCELogLevel, String) -> Unit) { +class DeadCodeElimination( + private val printReachabilityInfo: Boolean, + private val logConsumer: (DCELogLevel, String) -> Unit +) { val moduleMapping = mutableMapOf() private val reachableNames = mutableSetOf() @@ -61,7 +64,7 @@ class DeadCodeElimination(private val logConsumer: (DCELogLevel, String) -> Unit analyzer.moduleMapping += moduleMapping root.accept(analyzer) - val usageFinder = ReachabilityTracker(context, analyzer.analysisResult, logConsumer) + val usageFinder = ReachabilityTracker(context, analyzer.analysisResult, logConsumer.takeIf { printReachabilityInfo }) root.accept(usageFinder) for (reachableName in reachableNames) { @@ -78,10 +81,11 @@ class DeadCodeElimination(private val logConsumer: (DCELogLevel, String) -> Unit fun run( inputFiles: Collection, rootReachableNames: Set, + printReachabilityInfo: Boolean, logConsumer: (DCELogLevel, String) -> Unit ): DeadCodeEliminationResult { val program = JsProgram() - val dce = DeadCodeElimination(logConsumer) + val dce = DeadCodeElimination(printReachabilityInfo, logConsumer) var hasErrors = false val blocks = inputFiles.map { file -> diff --git a/js/js.dce/src/org/jetbrains/kotlin/js/dce/ReachabilityTracker.kt b/js/js.dce/src/org/jetbrains/kotlin/js/dce/ReachabilityTracker.kt index c432638e86b..ddee4a7bc7f 100644 --- a/js/js.dce/src/org/jetbrains/kotlin/js/dce/ReachabilityTracker.kt +++ b/js/js.dce/src/org/jetbrains/kotlin/js/dce/ReachabilityTracker.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.js.inline.util.collectLocalVariables class ReachabilityTracker( private val context: Context, private val analysisResult: AnalysisResult, - private val logConsumer: (DCELogLevel, String) -> Unit + private val logConsumer: ((DCELogLevel, String) -> Unit)? ) : RecursiveJsVisitor() { companion object { private val CALL_FUNCTIONS = setOf("call", "apply") @@ -237,14 +237,15 @@ class ReachabilityTracker( currentNodeWithLocation = old } - private fun report(message: String) { - logConsumer(DCELogLevel.INFO, " ".repeat(depth) + message) - } - private fun reportAndNest(message: String, dueTo: JsNode?, action: () -> Unit) { - val location = dueTo?.extractLocation() - val fullMessage = if (location != null) "$message (due to ${location.asString()})" else message - report(fullMessage) + if (logConsumer != null) { + val indent = " ".repeat(depth) + val fullMessage = when (val location = dueTo?.extractLocation()) { + null -> "$indent$message" + else -> "$indent$message (due to ${location.asString()})" + } + logConsumer.invoke(DCELogLevel.INFO, fullMessage) + } nested(action) } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/AbstractDceTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/AbstractDceTest.kt index a0f9321e00e..1152f055fd3 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/AbstractDceTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/AbstractDceTest.kt @@ -28,7 +28,7 @@ abstract class AbstractDceTest : TestCase() { val fileContents = file.readText() val inputFile = InputFile(InputResource.file(filePath), null, File(pathToOutputDir, file.relativeTo(File(pathToTestDir)).path).path, "main") - val dceResult = DeadCodeElimination.run(setOf(inputFile), extractDeclarations(REQUEST_REACHABLE_PATTERN, fileContents)) { _, _ -> } + val dceResult = DeadCodeElimination.run(setOf(inputFile), extractDeclarations(REQUEST_REACHABLE_PATTERN, fileContents), true) { _, _ -> } val reachableNodeStrings = dceResult.reachableNodes.map { it.toString().removePrefix(".") }.toSet() for (assertedDeclaration in extractDeclarations(ASSERT_REACHABLE_PATTERN, fileContents)) { diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt index 85e82f97a6c..1e2c48b43d9 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt @@ -928,7 +928,7 @@ abstract class BasicBoxTest( "kotlin-test.kotlin.test.DefaultAsserter" ) val allFilesToMinify = filesToMinify.values + kotlinJsInputFile + kotlinTestJsInputFile - val dceResult = DeadCodeElimination.run(allFilesToMinify, additionalReachableNodes) { _, _ -> } + val dceResult = DeadCodeElimination.run(allFilesToMinify, additionalReachableNodes, true) { _, _ -> } val reachableNodes = dceResult.reachableNodes minificationThresholdChecker(reachableNodes.count { it.reachable })