[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.
This commit is contained in:
Alexander Korepanov
2023-09-19 12:27:05 +02:00
parent 758484a01f
commit a7458f18a9
3 changed files with 51 additions and 50 deletions
@@ -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<String>()
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"
}
@@ -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<String>()
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"
}
}
@@ -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) {}