[FIR-TEST] Add fir diagnostics test based on diagnostics tests from old frontend

This commit is contained in:
Dmitriy Novozhilov
2019-12-11 16:15:13 +03:00
parent e7f8c8e155
commit e9c02a1cca
16 changed files with 3962 additions and 1140 deletions
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir
import com.intellij.openapi.extensions.Extensions
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementFinder
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.ModuleInfo
@@ -15,10 +16,12 @@ import org.jetbrains.kotlin.checkers.BaseDiagnosticsTest
import org.jetbrains.kotlin.checkers.DiagnosticDiffCallbacks
import org.jetbrains.kotlin.checkers.diagnostics.ActualDiagnostic
import org.jetbrains.kotlin.checkers.diagnostics.PositionalTextDiagnostic
import org.jetbrains.kotlin.checkers.diagnostics.SyntaxErrorDiagnostic
import org.jetbrains.kotlin.checkers.diagnostics.TextDiagnostic
import org.jetbrains.kotlin.checkers.utils.CheckerTestUtil
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
import org.jetbrains.kotlin.diagnostics.FirErrors
import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.declarations.FirFile
@@ -32,6 +35,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.resolve.AnalyzingUtils
import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
import java.io.File
@@ -192,7 +196,7 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
// TODO: report JVM signature diagnostics also for implementing modules
val ok = booleanArrayOf(true)
val diagnostics = coneDiagnostics.toActualDiagnostic()
val diagnostics = coneDiagnostics.toActualDiagnostic(ktFile)
val filteredDiagnostics = diagnostics // TODO
actualDiagnostics.addAll(filteredDiagnostics)
@@ -289,7 +293,12 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
return ok[0]
}
private fun Iterable<ConeDiagnostic>.toActualDiagnostic(): Collection<ActualDiagnostic> {
return map { ActualDiagnostic(it.diagnostic, null, true) }
private fun Iterable<ConeDiagnostic>.toActualDiagnostic(root: PsiElement): List<ActualDiagnostic> {
val result = mutableListOf<ActualDiagnostic>()
filter { it.diagnostic.factory != FirErrors.SYNTAX_ERROR }.mapTo(result) { ActualDiagnostic(it.diagnostic, null, true) }
for (errorElement in AnalyzingUtils.getSyntaxErrorRanges(root)) {
result.add(ActualDiagnostic(SyntaxErrorDiagnostic(errorElement), null, true))
}
return result
}
}
@@ -35,7 +35,7 @@ abstract class AbstractFirDiagnosticsTest : AbstractFirBaseDiagnosticsTest() {
)
}
private fun checkDiagnostics(file: File, testFiles: List<TestFile>, firFiles: List<FirFile>) {
protected fun checkDiagnostics(file: File, testFiles: List<TestFile>, firFiles: List<FirFile>) {
val collector = createCollector()
val actualText = StringBuilder()
for (testFile in testFiles) {
@@ -50,7 +50,7 @@ abstract class AbstractFirDiagnosticsTest : AbstractFirBaseDiagnosticsTest() {
KotlinTestUtils.assertEqualsToFile(file, actualText.toString())
}
private fun createCollector(): AbstractDiagnosticCollector {
protected fun createCollector(): AbstractDiagnosticCollector {
return FirDiagnosticsCollector.create()
}
}
@@ -10,7 +10,28 @@ import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveTransformer
import org.jetbrains.kotlin.test.KotlinTestUtils
import java.io.File
abstract class AbstractFirDiagnosticsSmokeTest : AbstractFirBaseDiagnosticsTest() {
abstract class AbstractFirOldFrontendDiagnosticsTest : AbstractFirDiagnosticsTest() {
companion object {
private val DIAGNOSTIC_PATTERN = Regex("(<!>|(<!(.(\".*\")*?)+?!>))")
private fun loadTestDataWithoutDiagnostics(file: File): String {
return KotlinTestUtils.doLoadFile(file).replace(DIAGNOSTIC_PATTERN, "")
}
}
override fun createTestFileFromPath(filePath: String): File {
val newPath = filePath.replace(".kt", ".fir.kt")
return File(newPath).also {
prepareTestDataFile(filePath, it)
}
}
private fun prepareTestDataFile(originalFilePath: String, firTestDataFile: File) {
if (!firTestDataFile.exists()) {
firTestDataFile.writeText(loadTestDataWithoutDiagnostics(File(originalFilePath)))
}
}
override fun runAnalysis(testDataFile: File, testFiles: List<TestFile>, firFiles: List<FirFile>) {
val failure: AssertionError? = try {
doFirResolveTestBench(firFiles, FirTotalResolveTransformer().transformers, gc = false)
@@ -18,10 +39,11 @@ abstract class AbstractFirDiagnosticsSmokeTest : AbstractFirBaseDiagnosticsTest(
} catch (e: AssertionError) {
e
}
val failureFile = File(testDataFile.path.replace(".kt", ".fir.fail"))
val failureFile = File(testDataFile.path.replace(".kt", ".fail"))
if (failure == null) {
checkResultingFirFiles(firFiles, testDataFile)
assertFalse("Test is good but there is expected exception", failureFile.exists())
checkDiagnostics(testDataFile, testFiles, firFiles)
} else {
if (!failureFile.exists()) {
throw failure
@@ -0,0 +1,14 @@
/*
* 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.ConfigurationKind
abstract class AbstractFirOldFrontendDiagnosticsTestWithStdlib : AbstractFirOldFrontendDiagnosticsTest() {
override fun getConfigurationKind(): ConfigurationKind {
return ConfigurationKind.ALL
}
}
@@ -9,14 +9,14 @@ import com.intellij.openapi.extensions.Extensions
import com.intellij.psi.PsiElementFinder
import com.intellij.psi.impl.compiled.ClsClassImpl
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.fir.AbstractFirDiagnosticsSmokeTest
import org.jetbrains.kotlin.fir.AbstractFirOldFrontendDiagnosticsTest
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.test.InTextDirectivesUtils
import org.jetbrains.kotlin.test.KotlinTestUtils
import java.io.File
abstract class AbstractFirLightClassesTest : AbstractFirDiagnosticsSmokeTest() {
abstract class AbstractFirOldFrontendLightClassesTest : AbstractFirOldFrontendDiagnosticsTest() {
override fun checkResultingFirFiles(firFiles: List<FirFile>, testDataFile: File) {
super.checkResultingFirFiles(firFiles, testDataFile)
@@ -50,4 +50,8 @@ abstract class AbstractFirLightClassesTest : AbstractFirDiagnosticsSmokeTest() {
val expectedPath = testDataFile.path.replace(".kt", ".txt")
KotlinTestUtils.assertEqualsToFile(File(expectedPath), stringBuilder.toString())
}
override fun createTestFileFromPath(filePath: String): File {
return File(filePath)
}
}
@@ -19,7 +19,7 @@ import java.util.regex.Pattern;
@TestMetadata("compiler/fir/resolve/testData/lightClasses")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public class FirLightClassesTestGenerated extends AbstractFirLightClassesTest {
public class FirOldFrontendLightClassesTestGenerated extends AbstractFirOldFrontendLightClassesTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
}