[FIR-TEST] Add fir diagnostics test based on diagnostics tests from old frontend
This commit is contained in:
+12
-3
@@ -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()
|
||||
}
|
||||
}
|
||||
+24
-2
@@ -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
|
||||
+14
@@ -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
|
||||
}
|
||||
}
|
||||
+486
-486
File diff suppressed because it is too large
Load Diff
+2754
File diff suppressed because it is too large
Load Diff
+6
-2
@@ -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)
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user