[FIR] Add separate diagnostic tests working in light tree mode

Now we have separate raw fir builder based and light tree builder based tests.
Note: one light tree test was ignored due to lack of JavaElementFinder in this mode.
This commit is contained in:
Mikhail Glukhikh
2019-12-18 14:15:23 +03:00
parent 9efb1fc527
commit 1c6da8b9b4
6 changed files with 1208 additions and 11 deletions
@@ -1,3 +1,5 @@
// IGNORE_LIGHT_TREE
// Does not work in light tree mode due to lack of Java element finder there
// FILE: KotlinTypeChecker.java
public interface KotlinTypeChecker {
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.java.FirJavaModuleBasedSession
import org.jetbrains.kotlin.fir.java.FirLibrarySession
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.impl.FirProviderImpl
@@ -35,6 +36,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.AnalyzingUtils
import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
@@ -60,7 +62,7 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
}
}
protected open fun analyzeAndCheckUnhandled(testDataFile: File, files: List<TestFile>) {
open fun analyzeAndCheckUnhandled(testDataFile: File, files: List<TestFile>, useLightTree: Boolean = false) {
val groupedByModule = files.groupBy(TestFile::module)
val modules = createModules(groupedByModule)
@@ -90,21 +92,30 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
val session = configToSession.getValue(testModule)
val firBuilder = RawFirBuilder(session, false)
ktFiles.mapTo(firFiles) {
val firFile = firBuilder.buildFirFile(it)
(session.firProvider as FirProviderImpl).recordFile(firFile)
firFile
}
mapKtFilesToFirFiles(session, ktFiles, firFiles, useLightTree)
}
runAnalysis(testDataFile, files, firFiles)
}
private fun mapKtFilesToFirFiles(session: FirSession, ktFiles: List<KtFile>, firFiles: MutableList<FirFile>, useLightTree: Boolean) {
if (useLightTree) {
val lightTreeBuilder = LightTree2Fir(session, stubMode = false)
ktFiles.mapTo(firFiles) {
val firFile = lightTreeBuilder.buildFirFile(it.text, it.name)
(session.firProvider as FirProviderImpl).recordFile(firFile)
firFile
}
} else {
val firBuilder = RawFirBuilder(session, false)
ktFiles.mapTo(firFiles) {
val firFile = firBuilder.buildFirFile(it)
(session.firProvider as FirProviderImpl).recordFile(firFile)
firFile
}
}
}
protected abstract fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFiles: List<FirFile>)
private fun createModules(
@@ -0,0 +1,24 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.test.InTextDirectivesUtils
import org.jetbrains.kotlin.test.KotlinTestUtils
import java.io.File
abstract class AbstractFirDiagnosticsWithLightTreeTest : AbstractFirDiagnosticsTest(), FirDiagnosticsTestLightTreeHelper {
override fun doTest(filePath: String) {
val file = createTestFileFromPath(filePath)
val expectedText = KotlinTestUtils.doLoadFile(file)
if (InTextDirectivesUtils.isDirectiveDefined(expectedText, "// IGNORE_LIGHT_TREE")) return
super.doTest(filePath)
}
override fun analyzeAndCheck(testDataFile: File, files: List<TestFile>) {
super<FirDiagnosticsTestLightTreeHelper>.analyzeAndCheck(testDataFile, files)
}
}
@@ -0,0 +1,23 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.checkers.BaseDiagnosticsTest
import java.io.File
interface FirDiagnosticsTestLightTreeHelper {
fun analyzeAndCheck(testDataFile: File, files: List<BaseDiagnosticsTest.TestFile>) {
try {
analyzeAndCheckUnhandled(testDataFile, files, useLightTree = true)
} catch (t: AssertionError) {
throw t
} catch (t: Throwable) {
throw t
}
}
fun analyzeAndCheckUnhandled(testDataFile: File, files: List<BaseDiagnosticsTest.TestFile>, useLightTree: Boolean)
}
@@ -531,6 +531,10 @@ fun main(args: Array<String>) {
model("resolve", pattern = KT_WITHOUT_DOTS_IN_NAME, excludeDirs = listOf("stdlib", "cfg", "smartcasts"))
}
testClass<AbstractFirDiagnosticsWithLightTreeTest> {
model("resolve", pattern = KT_WITHOUT_DOTS_IN_NAME, excludeDirs = listOf("stdlib", "cfg", "smartcasts"))
}
testClass<AbstractFirDiagnosticsWithCfgTest> {
model("resolve/cfg", pattern = KT_WITHOUT_DOTS_IN_NAME)
model("resolve/smartcasts", pattern = KT_WITHOUT_DOTS_IN_NAME)