From a7458f18a9f4d609c54a269766f503b8a4998a84 Mon Sep 17 00:00:00 2001 From: Alexander Korepanov Date: Tue, 19 Sep 2023 12:27:05 +0200 Subject: [PATCH] [Common tests] Support RENDER_ALL_DIAGNOSTICS_FULL_TEXT in JS BE tests Move the checkFullDiagnosticRender() function from the JvmBackendDiagnosticsHandler class so it can be reused in the JsBackendDiagnosticsHandler class. --- .../test/backend/handlers/HandlerUtils.kt | 51 ++++++++++++++++++- .../handlers/JvmBackendDiagnosticsHandler.kt | 48 ----------------- .../handlers/JsBackendDiagnosticsHandler.kt | 2 + 3 files changed, 51 insertions(+), 50 deletions(-) diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/HandlerUtils.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/HandlerUtils.kt index a94f3476d94..a5d73db0b70 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/HandlerUtils.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/HandlerUtils.kt @@ -5,17 +5,28 @@ package org.jetbrains.kotlin.test.backend.handlers +import com.intellij.openapi.util.io.FileUtil +import org.jetbrains.kotlin.cli.common.fir.SequentialPositionFinder +import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport +import org.jetbrains.kotlin.codeMetaInfo.model.DiagnosticCodeMetaInfo +import org.jetbrains.kotlin.diagnostics.DiagnosticUtils +import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector +import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages import org.jetbrains.kotlin.ir.declarations.IrModuleFragment +import org.jetbrains.kotlin.resolve.jvm.diagnostics.KtDefaultJvmErrorMessages import org.jetbrains.kotlin.test.FirParser import org.jetbrains.kotlin.test.backend.ir.IrBackendInput +import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives import org.jetbrains.kotlin.test.directives.model.singleOrZeroValue +import org.jetbrains.kotlin.test.frontend.fir.handlers.FirDiagnosticCodeMetaInfo import org.jetbrains.kotlin.test.frontend.fir.handlers.toMetaInfos import org.jetbrains.kotlin.test.model.BinaryArtifactHandler import org.jetbrains.kotlin.test.model.TestModule -import org.jetbrains.kotlin.test.services.dependencyProvider -import org.jetbrains.kotlin.test.services.globalMetadataInfoHandler +import org.jetbrains.kotlin.test.services.* +import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly +import java.io.File inline fun IrBackendInput.processAllIrModuleFragments( module: TestModule, @@ -50,3 +61,39 @@ fun BinaryArtifactHandler<*>.reportKtDiagnostics(module: TestModule, ktDiagnosti processModule(module) } + +fun BinaryArtifactHandler<*>.checkFullDiagnosticRender(module: TestModule) { + if (DiagnosticsDirectives.RENDER_ALL_DIAGNOSTICS_FULL_TEXT !in module.directives) return + + val reportedDiagnostics = mutableListOf() + for (testFile in module.files) { + val finder = + SequentialPositionFinder(testServices.sourceFileProvider.getContentOfSourceFile(testFile).byteInputStream().reader()) + for (metaInfo in testServices.globalMetadataInfoHandler.getReportedMetaInfosForFile(testFile).sortedBy { it.start }) { + when (metaInfo) { + is DiagnosticCodeMetaInfo -> metaInfo.diagnostic.let { + val message = DefaultErrorMessages.render(it) + val position = DiagnosticUtils.getLineAndColumnRange(it.psiFile, it.textRanges).start + reportedDiagnostics += + renderDiagnosticMessage(it.psiFile.name, it.severity, message, position.line, position.column) + } + is FirDiagnosticCodeMetaInfo -> metaInfo.diagnostic.let { + val message = KtDefaultJvmErrorMessages.MAP[it.factory]?.render(it) + val position = finder.findNextPosition(DiagnosticUtils.firstRange(it.textRanges).startOffset, false) + reportedDiagnostics += + renderDiagnosticMessage(testFile.relativePath, it.severity, message, position.line, position.column) + } + } + } + } + + testServices.assertions.assertEqualsToFile( + File(FileUtil.getNameWithoutExtension(module.files.first().originalFile.absolutePath) + ".diag.txt"), + reportedDiagnostics.joinToString(separator = "\n\n", postfix = "\n") + ) +} + +private fun renderDiagnosticMessage(fileName: String, severity: Severity, message: String?, line: Int, column: Int): String { + val severityString = AnalyzerWithCompilerReport.convertSeverity(severity).toString().toLowerCaseAsciiOnly() + return "/${fileName}:$line:$column: $severityString: $message" +} diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/JvmBackendDiagnosticsHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/JvmBackendDiagnosticsHandler.kt index fe0a888090b..f0f7a401f9c 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/JvmBackendDiagnosticsHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/JvmBackendDiagnosticsHandler.kt @@ -5,26 +5,14 @@ package org.jetbrains.kotlin.test.backend.handlers -import com.intellij.openapi.util.io.FileUtil -import org.jetbrains.kotlin.cli.common.fir.SequentialPositionFinder -import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport -import org.jetbrains.kotlin.codeMetaInfo.model.DiagnosticCodeMetaInfo -import org.jetbrains.kotlin.diagnostics.DiagnosticUtils -import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector -import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.resolve.jvm.diagnostics.KtDefaultJvmErrorMessages -import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives import org.jetbrains.kotlin.test.frontend.classic.handlers.ClassicDiagnosticReporter import org.jetbrains.kotlin.test.frontend.classic.handlers.withNewInferenceModeEnabled -import org.jetbrains.kotlin.test.frontend.fir.handlers.FirDiagnosticCodeMetaInfo import org.jetbrains.kotlin.test.model.BinaryArtifacts import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.* -import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly import org.junit.jupiter.api.fail -import java.io.File class JvmBackendDiagnosticsHandler(testServices: TestServices) : JvmBinaryArtifactHandler(testServices) { private val reporter = ClassicDiagnosticReporter(testServices) @@ -54,40 +42,4 @@ class JvmBackendDiagnosticsHandler(testServices: TestServices) : JvmBinaryArtifa val ktDiagnosticReporter = info.classFileFactory.generationState.diagnosticReporter as BaseDiagnosticsCollector reportKtDiagnostics(module, ktDiagnosticReporter) } - - private fun checkFullDiagnosticRender(module: TestModule) { - if (DiagnosticsDirectives.RENDER_ALL_DIAGNOSTICS_FULL_TEXT !in module.directives) return - - val reportedDiagnostics = mutableListOf() - for (testFile in module.files) { - val finder = - SequentialPositionFinder(testServices.sourceFileProvider.getContentOfSourceFile(testFile).byteInputStream().reader()) - for (metaInfo in testServices.globalMetadataInfoHandler.getReportedMetaInfosForFile(testFile).sortedBy { it.start }) { - when (metaInfo) { - is DiagnosticCodeMetaInfo -> metaInfo.diagnostic.let { - val message = DefaultErrorMessages.render(it) - val position = DiagnosticUtils.getLineAndColumnRange(it.psiFile, it.textRanges).start - reportedDiagnostics += - renderDiagnosticMessage(it.psiFile.name, it.severity, message, position.line, position.column) - } - is FirDiagnosticCodeMetaInfo -> metaInfo.diagnostic.let { - val message = KtDefaultJvmErrorMessages.MAP[it.factory]?.render(it) - val position = finder.findNextPosition(DiagnosticUtils.firstRange(it.textRanges).startOffset, false) - reportedDiagnostics += - renderDiagnosticMessage(testFile.relativePath, it.severity, message, position.line, position.column) - } - } - } - } - - testServices.assertions.assertEqualsToFile( - File(FileUtil.getNameWithoutExtension(module.files.first().originalFile.absolutePath) + ".diag.txt"), - reportedDiagnostics.joinToString(separator = "\n\n", postfix = "\n") - ) - } - - private fun renderDiagnosticMessage(fileName: String, severity: Severity, message: String?, line: Int, column: Int): String { - val severityString = AnalyzerWithCompilerReport.convertSeverity(severity).toString().toLowerCaseAsciiOnly() - return "/${fileName}:$line:$column: $severityString: $message" - } } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/handlers/JsBackendDiagnosticsHandler.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/handlers/JsBackendDiagnosticsHandler.kt index de35b6071a0..b5cd9fbadc4 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/handlers/JsBackendDiagnosticsHandler.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/handlers/JsBackendDiagnosticsHandler.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.js.test.handlers import org.jetbrains.kotlin.test.backend.handlers.KlibArtifactHandler +import org.jetbrains.kotlin.test.backend.handlers.checkFullDiagnosticRender import org.jetbrains.kotlin.test.backend.handlers.reportKtDiagnostics import org.jetbrains.kotlin.test.model.BinaryArtifacts import org.jetbrains.kotlin.test.model.TestModule @@ -14,6 +15,7 @@ import org.jetbrains.kotlin.test.services.* class JsBackendDiagnosticsHandler(testServices: TestServices) : KlibArtifactHandler(testServices) { override fun processModule(module: TestModule, info: BinaryArtifacts.KLib) { reportKtDiagnostics(module, info.reporter) + checkFullDiagnosticRender(module) } override fun processAfterAllModules(someAssertionWasFailed: Boolean) {}