From a1326d3ef52d1a838b195c50005cd4a231ace01c Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 6 Feb 2020 12:35:47 +0300 Subject: [PATCH] !RENDER_DIAGNOSTICS_FULL_TEXT directive Compares diagnostics rendered as text with corresponding .diag.txt file --- .../cli/common/messages/MessageRenderer.java | 18 +++++++ .../testsWithJvmBackend/inlineCycle.diag.txt | 6 +++ .../testsWithJvmBackend/inlineCycle.kt | 2 + .../checkers/AbstractDiagnosticsTest.kt | 45 ++++++++++++++++- .../kotlin/checkers/BaseDiagnosticsTest.kt | 50 ++++++++++--------- .../generators/tests/GenerateCompilerTests.kt | 6 +-- 6 files changed, 99 insertions(+), 28 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.diag.txt diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/MessageRenderer.java b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/MessageRenderer.java index 3a6fe302202..aae3f819f38 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/MessageRenderer.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/MessageRenderer.java @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.cli.common.messages; +import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.utils.fileUtils.FileUtilsKt; @@ -69,6 +70,23 @@ public interface MessageRenderer { } }; + MessageRenderer SYSTEM_INDEPENDENT_RELATIVE_PATHS = new PlainTextMessageRenderer() { + private final File cwd = new File(".").getAbsoluteFile(); + + @Nullable + @Override + protected String getPath(@NotNull CompilerMessageLocation location) { + return FileUtil.toSystemIndependentName( + FileUtilsKt.descendantRelativeTo(new File(location.getPath()), cwd).getPath() + ); + } + + @Override + public String getName() { + return "SystemIndependentRelativePath"; + } + }; + MessageRenderer GRADLE_STYLE = new GradleStyleMessageRenderer(); String renderPreamble(); diff --git a/compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.diag.txt b/compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.diag.txt new file mode 100644 index 00000000000..d91dde86ce7 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.diag.txt @@ -0,0 +1,6 @@ +/inlineCycle.kt:8:5: error: the 'inlineFun2' invocation is a part of inline cycle + inlineFun2(p) + ^ +/inlineCycle.kt:13:5: error: the 'inlineFun1' invocation is a part of inline cycle + inlineFun1(p) + ^ diff --git a/compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.kt b/compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.kt index 6a2eea8d006..00e19237fab 100644 --- a/compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.kt +++ b/compiler/testData/diagnostics/testsWithJvmBackend/inlineCycle.kt @@ -1,3 +1,5 @@ +// !RENDER_DIAGNOSTICS_FULL_TEXT + inline fun inlineFun1(p: () -> Unit) { p() inlineFun2(p) diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.kt index 7b5968fd050..f413153b94a 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.TestsCompilerError import org.jetbrains.kotlin.analyzer.AnalysisResult import org.jetbrains.kotlin.analyzer.common.CommonResolverForModuleFactory import org.jetbrains.kotlin.builtins.jvm.JvmBuiltIns +import org.jetbrains.kotlin.cli.common.messages.* import org.jetbrains.kotlin.cli.jvm.compiler.NoScopeRecordCliBindingTrace import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM import org.jetbrains.kotlin.config.* @@ -61,7 +62,9 @@ import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator.RECURSIVE import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator.RECURSIVE_ALL import org.jetbrains.kotlin.utils.keysToMap import org.junit.Assert +import java.io.ByteArrayOutputStream import java.io.File +import java.io.PrintStream import java.util.* import java.util.function.Predicate import java.util.regex.Pattern @@ -169,6 +172,15 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() { // main checks var ok = true + val diagnosticsFullTextByteArrayStream = ByteArrayOutputStream() + val diagnosticsFullTextPrintStream = PrintStream(diagnosticsFullTextByteArrayStream) + var shouldCheckDiagnosticsFullText = false + val diagnosticsFullTextCollector = + GroupingMessageCollector( + PrintingMessageCollector(diagnosticsFullTextPrintStream, MessageRenderer.SYSTEM_INDEPENDENT_RELATIVE_PATHS, true), + false + ) + val actualText = StringBuilder() for (testFile in files) { val module = testFile.module @@ -183,14 +195,20 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() { } val moduleDescriptor = modules[module]!! + val moduleBindingContext = moduleBindings[module]!! ok = ok and testFile.getActualText( - moduleBindings[module]!!, + moduleBindingContext, implementingModulesBindings, actualText, shouldSkipJvmSignatureDiagnostics(groupedByModule) || isCommonModule, languageVersionSettingsByModule[module]!!, moduleDescriptor ) + + if (testFile.renderDiagnosticsFullText) { + shouldCheckDiagnosticsFullText = true + AnalyzerWithCompilerReport.reportDiagnostics(moduleBindingContext.diagnostics, diagnosticsFullTextCollector) + } } var exceptionFromDynamicCallDescriptorsValidation: Throwable? = null @@ -201,6 +219,15 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() { exceptionFromDynamicCallDescriptorsValidation = e } + if (shouldCheckDiagnosticsFullText) { + diagnosticsFullTextCollector.flush() + diagnosticsFullTextPrintStream.flush() + KotlinTestUtils.assertEqualsToFile( + File(FileUtil.getNameWithoutExtension(testDataFile.absolutePath) + ".diag.txt"), + String(diagnosticsFullTextByteArrayStream.toByteArray()) + ) + } + KotlinTestUtils.assertEqualsToFile(getExpectedDiagnosticsFile(testDataFile), actualText.cleanupInferenceDiagnostics()) { s -> s.replace("COROUTINES_PACKAGE", coroutinesPackage) } @@ -218,6 +245,22 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() { checkOriginalAndFirTestdataIdentity(testDataFile) } + private class DiagnosticsFullTextMessageCollector : MessageCollector { + + + override fun clear() { + TODO("Not yet implemented") + } + + override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageLocation?) { + TODO("Not yet implemented") + } + + override fun hasErrors(): Boolean { + TODO("Not yet implemented") + } + } + private fun checkOriginalAndFirTestdataIdentity(testDataFile: File) { val firTestDataFile = File(testDataFile.absolutePath.replace(".kt", ".fir.kt")) if (!firTestDataFile.exists()) return diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/BaseDiagnosticsTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/BaseDiagnosticsTest.kt index a2d01dfcca2..efcd2b6be10 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/BaseDiagnosticsTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/BaseDiagnosticsTest.kt @@ -157,6 +157,7 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava> = setOf( Errors.UNRESOLVED_REFERENCE, Errors.UNRESOLVED_REFERENCE_WRONG_RECEIVER, @@ -406,6 +406,8 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava|") fun parseDiagnosticFilterDirective( @@ -435,12 +437,12 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava) { +fun main() { System.setProperty("java.awt.headless", "true") val excludedFirTestdataPattern = "^(.+)\\.fir\\.kts?\$" @@ -127,11 +127,11 @@ fun main(args: Array) { } testClass { - model("diagnostics/testsWithJvmBackend") + model("diagnostics/testsWithJvmBackend", targetBackend = TargetBackend.JVM) } testClass { - model("diagnostics/testsWithJvmBackend") + model("diagnostics/testsWithJvmBackend", targetBackend = TargetBackend.JVM_IR) } testClass {