Use different transformers per module in FIR diagnostics tests

Before this commit, we used same transformers for all modules,
which provoked using same ScopeSession for all modules.
Now we re-create transformers for any new module.
This fixes some problems with incorrect caching in ScopeSession.

NB: this provokes ambiguities in some old FE tests,
mostly they're correct (same as old FE).
This commit is contained in:
Mikhail Glukhikh
2019-12-19 16:24:45 +03:00
parent c4e6f8a640
commit fe8d68ecc7
7 changed files with 32 additions and 26 deletions
@@ -84,7 +84,7 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
FirJavaModuleBasedSession(info, sessionProvider, scope)
}
val firFiles = mutableListOf<FirFile>()
val firFilesPerSession = mutableMapOf<FirSession, List<FirFile>>()
// TODO: make module/session/transformer handling like in AbstractFirMultiModuleTest (IDE)
for ((testModule, testFilesInModule) in groupedByModule) {
@@ -92,10 +92,12 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
val session = configToSession.getValue(testModule)
val firFiles = mutableListOf<FirFile>()
mapKtFilesToFirFiles(session, ktFiles, firFiles, useLightTree)
firFilesPerSession[session] = firFiles
}
runAnalysis(testDataFile, files, firFiles)
runAnalysis(testDataFile, files, firFilesPerSession)
}
private fun mapKtFilesToFirFiles(session: FirSession, ktFiles: List<KtFile>, firFiles: MutableList<FirFile>, useLightTree: Boolean) {
@@ -116,7 +118,7 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
}
}
protected abstract fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFiles: List<FirFile>)
protected abstract fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFilesPerSession: Map<FirSession, List<FirFile>>)
private fun createModules(
groupedByModule: Map<TestModule?, List<TestFile>>
@@ -8,22 +8,22 @@ package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.AbstractDiagnosticCollector
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.FirDiagnosticsCollector
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.ParallelDiagnosticsCollector
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.registerAllComponents
import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveTransformer
import org.jetbrains.kotlin.test.ConfigurationKind
import org.jetbrains.kotlin.test.KotlinTestUtils
import java.io.File
abstract class AbstractFirDiagnosticsTest : AbstractFirBaseDiagnosticsTest() {
override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFiles: List<FirFile>) {
doFirResolveTestBench(
firFiles,
FirTotalResolveTransformer().transformers,
gc = false
)
checkDiagnostics(testDataFile, testFiles, firFiles)
checkFir(testDataFile, firFiles)
override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFilesPerSession: Map<FirSession, List<FirFile>>) {
for ((_, firFiles) in firFilesPerSession) {
doFirResolveTestBench(
firFiles,
FirTotalResolveTransformer().transformers,
gc = false
)
}
val allFirFiles = firFilesPerSession.values.flatten()
checkDiagnostics(testDataFile, testFiles, allFirFiles)
checkFir(testDataFile, allFirFiles)
}
fun checkFir(testDataFile: File, firFiles: List<FirFile>) {
@@ -39,9 +39,10 @@ abstract class AbstractFirDiagnosticsWithCfgTest : AbstractFirDiagnosticsTest()
return ConfigurationKind.ALL
}
override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFiles: List<FirFile>) {
super.runAnalysis(testDataFile, testFiles, firFiles)
checkCfg(testDataFile, firFiles)
override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFilesPerSession: Map<FirSession, List<FirFile>>) {
super.runAnalysis(testDataFile, testFiles, firFilesPerSession)
val allFirFiles = firFilesPerSession.values.flatten()
checkCfg(testDataFile, allFirFiles)
}
fun checkCfg(testDataFile: File, firFiles: List<FirFile>) {
@@ -24,21 +24,24 @@ abstract class AbstractFirOldFrontendDiagnosticsTest : AbstractFirDiagnosticsTes
}
}
override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFiles: List<FirFile>) {
override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFilesPerSession: Map<FirSession, List<FirFile>>) {
val failure: AssertionError? = try {
doFirResolveTestBench(firFiles, FirTotalResolveTransformer().transformers, gc = false)
for ((_, firFiles) in firFilesPerSession) {
doFirResolveTestBench(firFiles, FirTotalResolveTransformer().transformers, gc = false)
}
null
} catch (e: AssertionError) {
e
}
val failureFile = File(testDataFile.path.replace(".kt", ".fail"))
if (failure == null) {
checkResultingFirFiles(firFiles, testDataFile)
val allFirFiles = firFilesPerSession.values.flatten()
checkResultingFirFiles(allFirFiles, testDataFile)
assertFalse("Test is good but there is expected exception", failureFile.exists())
checkDiagnostics(testDataFile, testFiles, firFiles)
checkDiagnostics(testDataFile, testFiles, allFirFiles)
val needDump = testFiles.any { it.directives.containsKey("FIR_DUMP") }
if (needDump) {
checkFir(testDataFile, firFiles)
checkFir(testDataFile, allFirFiles)
}
} else {
if (!failureFile.exists()) {
@@ -29,6 +29,6 @@ import p.*
fun <Y, Z> test(b: B<Y, Z>?) {
if (b is C<Y, Z>) {
b?.foo(null)
b?.<!AMBIGUITY!>foo<!>(null)
}
}
@@ -30,8 +30,8 @@ import p.*
fun test(b: B?, c: C) {
b?.foo(1, 1)
c.foo(1, 1)
c.<!AMBIGUITY!>foo<!>(1, 1)
if (b is C) {
b?.foo(1, 1)
b?.<!AMBIGUITY!>foo<!>(1, 1)
}
}
@@ -38,6 +38,6 @@ import p.*
fun test(b: B?) {
if (b is C) {
b?.foo(null, null)
b?.<!AMBIGUITY!>foo<!>(null, null)
}
}