[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,11 +37,9 @@ 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)
}
} }
} }
} }
@@ -72,16 +72,14 @@ 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 } val printFileName = filteredIrFiles.size > 1 || allModules.size > 1
val printFileName = filteredIrFiles.size > 1 || allModules.size > 1 val modifiedOptions = options.copy(printFileName = printFileName)
val modifiedOptions = options.copy(printFileName = printFileName) for (irFile in filteredIrFiles) {
for (irFile in filteredIrFiles) { builder.append(irFile.dumpKotlinLike(modifiedOptions))
builder.append(irFile.dumpKotlinLike(modifiedOptions))
}
} }
} }
@@ -42,12 +42,9 @@ 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) {
builder.append(irFile.dumpWithSourceLocations(irFile.fileEntry))
for (irFile in irModuleFragment.files) {
builder.append(irFile.dumpWithSourceLocations(irFile.fileEntry))
}
} }
} }
@@ -76,18 +76,15 @@ 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) {
if (testFile?.directives?.contains(EXTERNAL_FILE) == true) continue
for ((testFile, irFile) in testFileToIrFile) { var actualDump = irFile.dumpTreesFromLineNumber(lineNumber = 0, dumpOptions)
if (testFile?.directives?.contains(EXTERNAL_FILE) == true) continue if (actualDump.isEmpty()) {
var actualDump = irFile.dumpTreesFromLineNumber(lineNumber = 0, dumpOptions) actualDump = irFile.dumpTreesFromLineNumber(lineNumber = UNDEFINED_OFFSET, dumpOptions)
if (actualDump.isEmpty()) {
actualDump = irFile.dumpTreesFromLineNumber(lineNumber = UNDEFINED_OFFSET, dumpOptions)
}
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,20 +30,18 @@ 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
IrVerifier(assertions, module.frontendKind == FrontendKinds.FIR).verifyWithAssert(irFile) IrVerifier(assertions, module.frontendKind == FrontendKinds.FIR).verifyWithAssert(irFile)
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" }
}
} }
} }