From 1827165716220693c6478c01c83ccd73cff6c291 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Mon, 10 Jan 2022 11:42:11 +0300 Subject: [PATCH] Support rendering messages text in diagnostic tests --- .../test/directives/DiagnosticsDirectives.kt | 4 ++ .../handlers/DiagnosticMessagesTextHandler.kt | 59 +++++++++++++++++++ .../test/runners/AbstractDiagnosticTest.kt | 6 +- 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/handlers/DiagnosticMessagesTextHandler.kt diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/DiagnosticsDirectives.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/DiagnosticsDirectives.kt index 800f031770f..4bade6fbc02 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/DiagnosticsDirectives.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/DiagnosticsDirectives.kt @@ -84,4 +84,8 @@ object DiagnosticsDirectives : SimpleDirectivesContainer() { Value determines which context slice should be checked """.trimIndent() ) + + val RENDER_DIAGNOSTICS_FULL_TEXT by directive( + description = "Render diagnostic texts to .diag.txt" + ) } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/handlers/DiagnosticMessagesTextHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/handlers/DiagnosticMessagesTextHandler.kt new file mode 100644 index 00000000000..8fa0a773c3f --- /dev/null +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/handlers/DiagnosticMessagesTextHandler.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.test.frontend.classic.handlers + +import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport +import org.jetbrains.kotlin.cli.common.messages.GroupingMessageCollector +import org.jetbrains.kotlin.cli.common.messages.MessageRenderer +import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector +import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives +import org.jetbrains.kotlin.test.directives.model.DirectivesContainer +import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendOutputArtifact +import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.moduleStructure +import org.jetbrains.kotlin.test.utils.MultiModuleInfoDumper +import org.jetbrains.kotlin.test.utils.withExtension +import java.io.ByteArrayOutputStream +import java.io.PrintStream + +class DiagnosticMessagesTextHandler( + testServices: TestServices +) : ClassicFrontendAnalysisHandler(testServices) { + + override val directiveContainers: List + get() = listOf(DiagnosticsDirectives) + + private val dumper: MultiModuleInfoDumper = MultiModuleInfoDumper(moduleHeaderTemplate = "// -- Module: <%s> --") + + override fun processAfterAllModules(someAssertionWasFailed: Boolean) { + if (dumper.isEmpty()) return + val resultDump = dumper.generateResultingDump() + val testDataFile = testServices.moduleStructure.originalTestDataFiles.first() + val expectedFile = testDataFile.withExtension(".diag.txt") + assertions.assertEqualsToFile(expectedFile, resultDump) + } + + @OptIn(ExperimentalStdlibApi::class) + override fun processModule(module: TestModule, info: ClassicFrontendOutputArtifact) { + if (DiagnosticsDirectives.RENDER_DIAGNOSTICS_FULL_TEXT !in module.directives) return + + val diagnosticsFullTextByteArrayStream = ByteArrayOutputStream() + val diagnosticsFullTextPrintStream = PrintStream(diagnosticsFullTextByteArrayStream) + val diagnosticsFullTextCollector = + GroupingMessageCollector( + PrintingMessageCollector(diagnosticsFullTextPrintStream, MessageRenderer.SYSTEM_INDEPENDENT_RELATIVE_PATHS, true), + false + ) + + AnalyzerWithCompilerReport.reportDiagnostics(info.analysisResult.bindingContext.diagnostics, diagnosticsFullTextCollector) + + diagnosticsFullTextCollector.flush() + diagnosticsFullTextPrintStream.flush() + dumper.builderForModule(module).appendLine(String(diagnosticsFullTextByteArrayStream.toByteArray())) + } + +} diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractDiagnosticTest.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractDiagnosticTest.kt index 7bc78ff54b8..569e7bcb2d9 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractDiagnosticTest.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractDiagnosticTest.kt @@ -6,19 +6,18 @@ package org.jetbrains.kotlin.test.runners import org.jetbrains.kotlin.config.ExplicitApiMode -import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.test.TestJdkKind import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.classicFrontendHandlersStep import org.jetbrains.kotlin.test.builders.classicFrontendStep +import org.jetbrains.kotlin.test.directives.ConfigurationDirectives.WITH_STDLIB import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives.CHECK_COMPILE_TIME_VALUES import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives.DIAGNOSTICS import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives.REPORT_JVM_DIAGNOSTICS_ON_FRONTEND import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.JDK_KIND import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.USE_PSI_CLASS_FILES_READING import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.WITH_REFLECT -import org.jetbrains.kotlin.test.directives.ConfigurationDirectives.WITH_STDLIB import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.EXPLICIT_API_MODE import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.LANGUAGE import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.OPT_IN @@ -78,7 +77,8 @@ abstract class AbstractDiagnosticTest : AbstractKotlinCompilerTest() { useHandlers( ::DeclarationsDumpHandler, ::ClassicDiagnosticsHandler, - ::ConstantValuesHandler + ::ConstantValuesHandler, + ::DiagnosticMessagesTextHandler ) }