[Test] Inline processAllIrModuleFragments utility

After previous changes IR output artifact contains only one IrModuleFragment
This commit is contained in:
Dmitriy Novozhilov
2023-11-21 14:29:12 +02:00
committed by Space Team
parent 06af6adf4f
commit 48c3313e67
7 changed files with 35 additions and 58 deletions
@@ -14,9 +14,7 @@ import org.jetbrains.kotlin.diagnostics.Severity
import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector
import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages
import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.test.FirParser 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.DiagnosticsDirectives
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives
import org.jetbrains.kotlin.test.directives.model.singleOrZeroValue import org.jetbrains.kotlin.test.directives.model.singleOrZeroValue
@@ -28,14 +26,6 @@ import org.jetbrains.kotlin.test.services.*
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
import java.io.File import java.io.File
// TODO: inline this function
inline fun IrBackendInput.processAllIrModuleFragments(
module: TestModule,
processor: (irModuleFragment: IrModuleFragment, moduleName: String) -> Unit
) {
processor(irModuleFragment, module.name)
}
fun BinaryArtifactHandler<*>.reportKtDiagnostics(module: TestModule, ktDiagnosticReporter: BaseDiagnosticsCollector) { fun BinaryArtifactHandler<*>.reportKtDiagnostics(module: TestModule, ktDiagnosticReporter: BaseDiagnosticsCollector) {
val globalMetadataInfoHandler = testServices.globalMetadataInfoHandler val globalMetadataInfoHandler = testServices.globalMetadataInfoHandler
val firParser = module.directives.singleOrZeroValue(FirDiagnosticsDirectives.FIR_PARSER) val firParser = module.directives.singleOrZeroValue(FirDiagnosticsDirectives.FIR_PARSER)
@@ -26,10 +26,8 @@ class IrInlineBodiesHandler(testServices: TestServices) : AbstractIrHandler(test
@OptIn(ObsoleteDescriptorBasedAPI::class) @OptIn(ObsoleteDescriptorBasedAPI::class)
override fun processModule(module: TestModule, info: IrBackendInput) { override fun processModule(module: TestModule, info: IrBackendInput) {
info.processAllIrModuleFragments(module) { irModule, _ -> info.irModuleFragment.acceptChildrenVoid(InlineFunctionsCollector())
irModule.acceptChildrenVoid(InlineFunctionsCollector()) info.irModuleFragment.acceptChildrenVoid(InlineCallBodiesCheck(firEnabled = module.frontendKind == FrontendKinds.FIR))
irModule.acceptChildrenVoid(InlineCallBodiesCheck(firEnabled = module.frontendKind == FrontendKinds.FIR))
}
assertions.assertTrue((info as IrBackendInput.JvmIrBackendInput).backendInput.symbolTable.descriptorExtension.allUnboundSymbols.isEmpty()) assertions.assertTrue((info as IrBackendInput.JvmIrBackendInput).backendInput.symbolTable.descriptorExtension.allUnboundSymbols.isEmpty())
} }
@@ -37,14 +37,12 @@ open class IrInterpreterBackendHandler(testServices: TestServices) : AbstractIrH
override fun processAfterAllModules(someAssertionWasFailed: Boolean) {} override fun processAfterAllModules(someAssertionWasFailed: Boolean) {}
override fun processModule(module: TestModule, info: IrBackendInput) { override fun processModule(module: TestModule, info: IrBackendInput) {
info.processAllIrModuleFragments(module) { moduleFragment, _ -> val evaluator = Evaluator(IrInterpreter(info.irModuleFragment.irBuiltins), globalMetadataInfoHandler)
val evaluator = Evaluator(IrInterpreter(moduleFragment.irBuiltins), globalMetadataInfoHandler) for ((irFile, testFile) in matchIrFileWithTestFile(info.irModuleFragment, module)) {
for ((irFile, testFile) in matchIrFileWithTestFile(moduleFragment, module)) {
evaluator.evaluate(irFile, testFile) evaluator.evaluate(irFile, testFile)
} }
} }
} }
}
private class Evaluator(private val interpreter: IrInterpreter, private val globalMetadataInfoHandler: GlobalMetadataInfoHandler) { private class Evaluator(private val interpreter: IrInterpreter, private val globalMetadataInfoHandler: GlobalMetadataInfoHandler) {
fun evaluate(irFile: IrFile, testFile: TestFile) { fun evaluate(irFile: IrFile, testFile: TestFile) {
@@ -72,9 +72,8 @@ internal fun dumpModuleKotlinLike(
multiModuleInfoDumper: MultiModuleInfoDumper, multiModuleInfoDumper: MultiModuleInfoDumper,
options: KotlinLikeDumpOptions, options: KotlinLikeDumpOptions,
) { ) {
info.processAllIrModuleFragments(module) { irModuleFragment, moduleName -> val irFiles = info.irModuleFragment.files
val irFiles = irModuleFragment.files val builder = multiModuleInfoDumper.builderForModule(module.name)
val builder = multiModuleInfoDumper.builderForModule(moduleName)
val filteredIrFiles = irFiles.groupWithTestFiles(module).filterNot { (testFile, _) -> val filteredIrFiles = irFiles.groupWithTestFiles(module).filterNot { (testFile, _) ->
testFile?.let { EXTERNAL_FILE in it.directives || it.isAdditional } ?: false testFile?.let { EXTERNAL_FILE in it.directives || it.isAdditional } ?: false
}.map { it.second } }.map { it.second }
@@ -84,4 +83,3 @@ internal fun dumpModuleKotlinLike(
builder.append(irFile.dumpKotlinLike(modifiedOptions)) builder.append(irFile.dumpKotlinLike(modifiedOptions))
} }
} }
}
@@ -42,14 +42,11 @@ class IrSourceRangesDumpHandler(
override fun processModule(module: TestModule, info: IrBackendInput) { override fun processModule(module: TestModule, info: IrBackendInput) {
if (CodegenTestDirectives.DUMP_SOURCE_RANGES_IR !in module.directives) return if (CodegenTestDirectives.DUMP_SOURCE_RANGES_IR !in module.directives) return
info.processAllIrModuleFragments(module) { irModuleFragment, moduleName -> val builder = baseDumper.builderForModule(module.name)
val builder = baseDumper.builderForModule(moduleName) for (irFile in info.irModuleFragment.files) {
for (irFile in irModuleFragment.files) {
builder.append(irFile.dumpWithSourceLocations(irFile.fileEntry)) builder.append(irFile.dumpWithSourceLocations(irFile.fileEntry))
} }
} }
}
private fun IrElement.dumpWithSourceLocations(fileEntry: IrFileEntry): String = private fun IrElement.dumpWithSourceLocations(fileEntry: IrFileEntry): String =
StringBuilder().also { StringBuilder().also {
@@ -76,10 +76,8 @@ class IrTextDumpHandler(
printTypeAbbreviations = false, printTypeAbbreviations = false,
) )
info.processAllIrModuleFragments(module) { irModuleFragment, moduleName -> val builder = baseDumper.builderForModule(module.name)
val builder = baseDumper.builderForModule(moduleName) val testFileToIrFile = info.irModuleFragment.files.groupWithTestFiles(module)
val testFileToIrFile = irModuleFragment.files.groupWithTestFiles(module)
for ((testFile, irFile) in testFileToIrFile) { for ((testFile, irFile) in testFileToIrFile) {
if (testFile?.directives?.contains(EXTERNAL_FILE) == true) continue if (testFile?.directives?.contains(EXTERNAL_FILE) == true) continue
var actualDump = irFile.dumpTreesFromLineNumber(lineNumber = 0, dumpOptions) var actualDump = irFile.dumpTreesFromLineNumber(lineNumber = 0, dumpOptions)
@@ -88,7 +86,6 @@ class IrTextDumpHandler(
} }
builder.append(actualDump) builder.append(actualDump)
} }
}
compareDumpsOfExternalClasses(module, info) compareDumpsOfExternalClasses(module, info)
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.test.backend.handlers package org.jetbrains.kotlin.test.backend.handlers
import org.jetbrains.kotlin.ir.IrVerifier import org.jetbrains.kotlin.ir.IrVerifier
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.util.DumpIrTreeOptions import org.jetbrains.kotlin.ir.util.DumpIrTreeOptions
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
import org.jetbrains.kotlin.ir.util.dumpTreesFromLineNumber import org.jetbrains.kotlin.ir.util.dumpTreesFromLineNumber
@@ -29,8 +30,7 @@ class IrTreeVerifierHandler(
override fun processModule(module: TestModule, info: IrBackendInput) { override fun processModule(module: TestModule, info: IrBackendInput) {
if (CodegenTestDirectives.DUMP_IR !in module.directives) return if (CodegenTestDirectives.DUMP_IR !in module.directives) return
info.processAllIrModuleFragments(module) { irModuleFragment, _ -> val irFiles = info.irModuleFragment.files
val irFiles = irModuleFragment.files
val testFileToIrFile = irFiles.groupWithTestFiles(module) val testFileToIrFile = irFiles.groupWithTestFiles(module)
for ((testFile, irFile) in testFileToIrFile) { for ((testFile, irFile) in testFileToIrFile) {
if (testFile?.directives?.contains(EXTERNAL_FILE) == true) continue if (testFile?.directives?.contains(EXTERNAL_FILE) == true) continue
@@ -39,12 +39,11 @@ class IrTreeVerifierHandler(
val actualDump = irFile.dumpTreesFromLineNumber(lineNumber = 0, DumpIrTreeOptions(normalizeNames = true)) val actualDump = irFile.dumpTreesFromLineNumber(lineNumber = 0, DumpIrTreeOptions(normalizeNames = true))
val irFileCopy = irFile.deepCopyWithSymbols() val irFileCopy = irFile.deepCopyWithSymbols<IrFile>()
val dumpOfCopy = irFileCopy.dumpTreesFromLineNumber(lineNumber = 0, DumpIrTreeOptions(normalizeNames = true)) val dumpOfCopy = irFileCopy.dumpTreesFromLineNumber(lineNumber = 0, DumpIrTreeOptions(normalizeNames = true))
assertions.assertEquals(actualDump, dumpOfCopy) { "IR dump mismatch after deep copy with symbols" } assertions.assertEquals(actualDump, dumpOfCopy) { "IR dump mismatch after deep copy with symbols" }
} }
} }
}
override fun processAfterAllModules(someAssertionWasFailed: Boolean) {} override fun processAfterAllModules(someAssertionWasFailed: Boolean) {}
} }