Support RENDER_DIAGNOSTICS_FULL_TEXT directive in new test infra

This commit is contained in:
Ivan Kylchik
2022-02-03 18:24:32 +03:00
parent 20d0a531df
commit 001ecaa9b2
12 changed files with 96 additions and 21 deletions
@@ -0,0 +1,11 @@
/exceptionFromInterpreter_ir.kt:7:26: error: An exception occur while evaluating const value initializer:
Exception java.lang.ArithmeticException: / by zero
at ExceptionFromInterpreter_irKt.<clinit>(exceptionFromInterpreter_ir.kt:7)
/exceptionFromInterpreter_ir.kt:8:39: error: An exception occur while evaluating const value initializer:
Exception java.lang.IllegalArgumentException: marginPrefix must be non-blank string.
at ExceptionFromInterpreter_irKt.<clinit>(exceptionFromInterpreter_ir.kt:8)
/exceptionFromInterpreter_ir.kt:12:4: error: An exception occur while evaluating const value initializer:
Exception java.lang.ArithmeticException: / by zero
at ExceptionFromInterpreter_irKt.<clinit>(exceptionFromInterpreter_ir.kt:12)
@@ -0,0 +1 @@
/enumCapturesProperty.kts:7:1: error: Enum class Bar captures the script class instance. Try to use class or anonymous object instead
@@ -0,0 +1 @@
/enumEntryCapturesProperty.kts:7:1: error: Enum class Bar captures the script class instance. Try to use class or anonymous object instead
@@ -0,0 +1 @@
/interfaceCapturesProperty.kts:8:1: error: Interface A captures the script class instance. Try to use class instead
@@ -0,0 +1 @@
/nestedAndOuterClassesCaptureProperty.kts:9:5: error: Nested class User captures the script class instance. Try to use explicit inner modifier for both nested User and outer Outer
@@ -0,0 +1 @@
/nestedClassCapturesProperty.kts:8:5: error: Nested class User captures the script class instance. Try to use explicit inner modifier for both nested User and outer Outer
@@ -0,0 +1 @@
/nestedToObjectClassCapturesProperty.kts:8:5: error: Nested class User captures the script class instance. Try to use explicit inner modifier for both nested User and outer Outer
@@ -0,0 +1 @@
/objectCapturesProperty.kts:8:1: error: Object B captures the script class instance. Try to use class or anonymous object instead
@@ -0,0 +1 @@
/objectCapturesPropertyIndirect.kts:12:1: error: Object B captures the script class instance. Try to use class or anonymous object instead
@@ -0,0 +1 @@
/objectCapturesPropertyViaExtension1.kts:11:1: error: Object ZipHelper captures the script class instance. Try to use class or anonymous object instead
@@ -0,0 +1 @@
/objectCapturesPropertyViaExtension2.kts:17:1: error: Object ZipHelper captures the script class instance. Try to use class or anonymous object instead
@@ -5,9 +5,16 @@
package org.jetbrains.kotlin.test.backend.handlers
import com.intellij.openapi.util.io.FileUtil
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils
import org.jetbrains.kotlin.diagnostics.KtDiagnostic
import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils
import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector
import org.jetbrains.kotlin.fir.psi
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.toMetaInfos
@@ -19,32 +26,16 @@ import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.assertions
import org.jetbrains.kotlin.test.services.dependencyProvider
import org.jetbrains.kotlin.test.services.globalMetadataInfoHandler
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
import java.io.File
class JvmBackendDiagnosticsHandler(testServices: TestServices) : JvmBinaryArtifactHandler(testServices) {
private val reporter = ClassicDiagnosticReporter(testServices)
override fun processModule(module: TestModule, info: BinaryArtifacts.Jvm) {
val testFileToKtFileMap = getKtFiles(module)
val ktFileToTestFileMap = testFileToKtFileMap.entries.associate { it.value to it.key }
val generationState = info.classFileFactory.generationState
val diagnostics = generationState.collectedExtraJvmDiagnostics.all()
val configuration = reporter.createConfiguration(module)
val withNewInferenceModeEnabled = testServices.withNewInferenceModeEnabled()
for (diagnostic in diagnostics) {
val ktFile = diagnostic.psiFile as? KtFile ?: continue
val testFile = ktFileToTestFileMap[ktFile] ?: continue
reporter.reportDiagnostic(diagnostic, module, testFile, configuration, withNewInferenceModeEnabled)
}
val ktDiagnosticReporter = generationState.diagnosticReporter as BaseDiagnosticsCollector
val globalMetadataInfoHandler = testServices.globalMetadataInfoHandler
for ((testFile, ktFile) in testFileToKtFileMap.entries) {
val ktDiagnostics = ktDiagnosticReporter.diagnosticsByFilePath[ktFile.virtualFilePath] ?: continue
ktDiagnostics.forEach {
val metaInfos =
it.toMetaInfos(testFile, globalMetadataInfoHandler, false, false)
globalMetadataInfoHandler.addMetadataInfosForFile(testFile, metaInfos)
}
}
reportDiagnostics(module, info)
reportKtDiagnostics(module, info)
checkFullDiagnosticRender(module, info)
}
private fun getKtFiles(module: TestModule): Map<TestFile, KtFile> {
@@ -57,4 +48,67 @@ class JvmBackendDiagnosticsHandler(testServices: TestServices) : JvmBinaryArtifa
}
override fun processAfterAllModules(someAssertionWasFailed: Boolean) {}
private fun getLineAndColumnRange(diagnostic: KtDiagnostic): PsiDiagnosticUtils.LineAndColumnRange {
val file = diagnostic.psiElement.containingFile
val textRanges = diagnostic.textRanges
return DiagnosticUtils.getLineAndColumnRange(file, textRanges)
}
private fun reportDiagnostics(module: TestModule, info: BinaryArtifacts.Jvm) {
val testFileToKtFileMap = getKtFiles(module)
val ktFileToTestFileMap = testFileToKtFileMap.entries.associate { it.value to it.key }
val generationState = info.classFileFactory.generationState
val configuration = reporter.createConfiguration(module)
val withNewInferenceModeEnabled = testServices.withNewInferenceModeEnabled()
val diagnostics = generationState.collectedExtraJvmDiagnostics.all()
for (diagnostic in diagnostics) {
val ktFile = diagnostic.psiFile as? KtFile ?: continue
val testFile = ktFileToTestFileMap[ktFile] ?: continue
reporter.reportDiagnostic(diagnostic, module, testFile, configuration, withNewInferenceModeEnabled)
}
}
private fun reportKtDiagnostics(module: TestModule, info: BinaryArtifacts.Jvm) {
val testFileToKtFileMap = getKtFiles(module)
val generationState = info.classFileFactory.generationState
val ktDiagnosticReporter = generationState.diagnosticReporter as BaseDiagnosticsCollector
val globalMetadataInfoHandler = testServices.globalMetadataInfoHandler
for ((testFile, ktFile) in testFileToKtFileMap.entries) {
val ktDiagnostics = ktDiagnosticReporter.diagnosticsByFilePath[ktFile.virtualFilePath] ?: continue
ktDiagnostics.forEach {
val metaInfos =
it.toMetaInfos(testFile, globalMetadataInfoHandler, false, false)
globalMetadataInfoHandler.addMetadataInfosForFile(testFile, metaInfos)
}
}
}
private fun checkFullDiagnosticRender(module: TestModule, info: BinaryArtifacts.Jvm) {
if (DiagnosticsDirectives.RENDER_DIAGNOSTICS_FULL_TEXT !in module.directives) return
val testFileToKtFileMap = getKtFiles(module)
val generationState = info.classFileFactory.generationState
val ktDiagnosticReporter = generationState.diagnosticReporter as BaseDiagnosticsCollector
val reportedDiagnostics = mutableListOf<String>()
for (ktFile in testFileToKtFileMap.values) {
val ktDiagnostics = ktDiagnosticReporter.diagnosticsByFilePath[ktFile.virtualFilePath] ?: continue
ktDiagnostics.forEach {
val severity = AnalyzerWithCompilerReport.convertSeverity(it.severity).toString().toLowerCaseAsciiOnly()
val message = KtDefaultJvmErrorMessages.MAP[it.factory]?.render(it)
val position = getLineAndColumnRange(it).start
reportedDiagnostics += "/${ktFile.name}:${position.line}:${position.column}: $severity: $message"
}
}
if (reportedDiagnostics.isNotEmpty()) {
testServices.assertions.assertEqualsToFile(
File(FileUtil.getNameWithoutExtension(testFileToKtFileMap.keys.first().originalFile.absolutePath) + ".diag.txt"),
reportedDiagnostics.joinToString(separator = "\n\n")
)
}
}
}