Support RENDER_DIAGNOSTICS_FULL_TEXT directive in new test infra
This commit is contained in:
+11
@@ -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)
|
||||
+1
@@ -0,0 +1 @@
|
||||
/enumCapturesProperty.kts:7:1: error: Enum class Bar captures the script class instance. Try to use class or anonymous object instead
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
/enumEntryCapturesProperty.kts:7:1: error: Enum class Bar captures the script class instance. Try to use class or anonymous object instead
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
/interfaceCapturesProperty.kts:8:1: error: Interface A captures the script class instance. Try to use class instead
|
||||
+1
@@ -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
|
||||
Vendored
+1
@@ -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
|
||||
+1
@@ -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
|
||||
+1
@@ -0,0 +1 @@
|
||||
/objectCapturesProperty.kts:8:1: error: Object B captures the script class instance. Try to use class or anonymous object instead
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
/objectCapturesPropertyIndirect.kts:12:1: error: Object B captures the script class instance. Try to use class or anonymous object instead
|
||||
+1
@@ -0,0 +1 @@
|
||||
/objectCapturesPropertyViaExtension1.kts:11:1: error: Object ZipHelper captures the script class instance. Try to use class or anonymous object instead
|
||||
+1
@@ -0,0 +1 @@
|
||||
/objectCapturesPropertyViaExtension2.kts:17:1: error: Object ZipHelper captures the script class instance. Try to use class or anonymous object instead
|
||||
+75
-21
@@ -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")
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user