[FIR] Add prototype of diagnostic collector
This commit is contained in:
@@ -25,6 +25,7 @@ dependencies {
|
|||||||
|
|
||||||
testCompileOnly(project(":kotlin-reflect-api"))
|
testCompileOnly(project(":kotlin-reflect-api"))
|
||||||
testRuntime(project(":kotlin-reflect"))
|
testRuntime(project(":kotlin-reflect"))
|
||||||
|
implementation(kotlin("reflect"))
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
|
|||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* 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.resolve.diagnostics
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
|
||||||
|
class ConeDiagnosticFactory {
|
||||||
|
lateinit var name: String
|
||||||
|
|
||||||
|
fun on(source: FirSourceElement): ConeDiagnostic = ConeDiagnostic(this, source)
|
||||||
|
}
|
||||||
|
|
||||||
|
class ConeDiagnostic(
|
||||||
|
val factory: ConeDiagnosticFactory,
|
||||||
|
val source: FirSourceElement
|
||||||
|
)
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* 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.resolve.diagnostics
|
||||||
|
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
object ConeDiagnostics {
|
||||||
|
val INFIX_MODIFIER_REQUIRED = ConeDiagnosticFactory()
|
||||||
|
val INAPPLICABLE_INFIX_MODIFIER = ConeDiagnosticFactory()
|
||||||
|
|
||||||
|
init {
|
||||||
|
ConeDiagnostics::class.members.filterIsInstance<KProperty<*>>().forEach { property ->
|
||||||
|
val factory = property.getter.call(this) as? ConeDiagnosticFactory
|
||||||
|
factory?.name = property.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* 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.resolve.diagnostics
|
||||||
|
|
||||||
|
abstract class DiagnosticReporter {
|
||||||
|
abstract fun report(diagnostic: ConeDiagnostic)
|
||||||
|
}
|
||||||
|
|
||||||
|
class SimpleDiagnosticReporter : DiagnosticReporter() {
|
||||||
|
val diagnostics: MutableList<ConeDiagnostic> = mutableListOf()
|
||||||
|
|
||||||
|
override fun report(diagnostic: ConeDiagnostic) {
|
||||||
|
diagnostics += diagnostic
|
||||||
|
}
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* 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.resolve.diagnostics.checkers.call
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter
|
||||||
|
|
||||||
|
abstract class FirCallChecker {
|
||||||
|
abstract fun check(functionCall: FirFunctionCall, reporter: DiagnosticReporter)
|
||||||
|
}
|
||||||
+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.resolve.diagnostics.checkers.declaration
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||||
|
|
||||||
|
object DeclarationCheckers {
|
||||||
|
val DECLARATIONS: List<FirDeclarationChecker<FirDeclaration>> = listOf()
|
||||||
|
val MEMBER_DECLARATIONS: List<FirDeclarationChecker<FirMemberDeclaration>> = DECLARATIONS + listOf(FirInfixFunctionDeclarationChecker)
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* 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.resolve.diagnostics.checkers.declaration
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter
|
||||||
|
|
||||||
|
abstract class FirDeclarationChecker<in D : FirDeclaration> {
|
||||||
|
abstract fun check(declaration: D, reporter: DiagnosticReporter)
|
||||||
|
}
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* 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.resolve.diagnostics.checkers.declaration
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.isInfix
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDiagnostics
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter
|
||||||
|
|
||||||
|
object FirInfixFunctionDeclarationChecker : FirDeclarationChecker<FirMemberDeclaration>() {
|
||||||
|
override fun check(declaration: FirMemberDeclaration, reporter: DiagnosticReporter) {
|
||||||
|
if (declaration is FirSimpleFunction && declaration.isInfix) {
|
||||||
|
if (declaration.valueParameters.size != 1 || declaration.receiverTypeRef == null) {
|
||||||
|
reporter.report(declaration.source)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (declaration.isInfix) {
|
||||||
|
reporter.report(declaration.source)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun DiagnosticReporter.report(source: FirSourceElement?) {
|
||||||
|
source?.let { report(ConeDiagnostics.INAPPLICABLE_INFIX_MODIFIER.on(it)) }
|
||||||
|
}
|
||||||
|
}
|
||||||
+61
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* 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.resolve.diagnostics.collectors
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
||||||
|
|
||||||
|
abstract class AbstractDiagnosticCollectorComponent(private val collector: AbstractDiagnosticCollector) : FirVisitorVoid() {
|
||||||
|
override fun visitElement(element: FirElement) {}
|
||||||
|
|
||||||
|
protected fun runCheck(block: (DiagnosticReporter) -> Unit) {
|
||||||
|
collector.runCheck(block)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class AbstractDiagnosticCollector {
|
||||||
|
fun collectDiagnostics(firFile: FirFile): Iterable<ConeDiagnostic> {
|
||||||
|
if (!componentsInitialized) {
|
||||||
|
throw IllegalStateException("Components are not initialized")
|
||||||
|
}
|
||||||
|
initializeCollector()
|
||||||
|
firFile.accept(visitor)
|
||||||
|
return getCollectedDiagnostics()
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract fun initializeCollector()
|
||||||
|
protected abstract fun getCollectedDiagnostics(): Iterable<ConeDiagnostic>
|
||||||
|
internal abstract fun runCheck(block: (DiagnosticReporter) -> Unit)
|
||||||
|
|
||||||
|
private val components: MutableList<AbstractDiagnosticCollectorComponent> = mutableListOf()
|
||||||
|
private var componentsInitialized = false
|
||||||
|
private val visitor = Visitor()
|
||||||
|
|
||||||
|
fun initializeComponents(vararg components: AbstractDiagnosticCollectorComponent) {
|
||||||
|
if (componentsInitialized) {
|
||||||
|
throw IllegalStateException()
|
||||||
|
}
|
||||||
|
this.components += components
|
||||||
|
componentsInitialized = true
|
||||||
|
}
|
||||||
|
|
||||||
|
private inner class Visitor : FirVisitorVoid() {
|
||||||
|
private fun <T : FirElement> T.runComponents() {
|
||||||
|
components.forEach {
|
||||||
|
this.accept(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitElement(element: FirElement) {
|
||||||
|
element.runComponents()
|
||||||
|
element.acceptChildren(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+76
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* 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.resolve.diagnostics.collectors
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.SimpleDiagnosticReporter
|
||||||
|
import java.util.*
|
||||||
|
import java.util.concurrent.Executors
|
||||||
|
import java.util.concurrent.Future
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger
|
||||||
|
|
||||||
|
class ParallelDiagnosticsCollector(private val numberOfThreads: Int) : AbstractDiagnosticCollector() {
|
||||||
|
init {
|
||||||
|
require(numberOfThreads >= 1) {
|
||||||
|
"Number of threads should be at least 1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private var reporters = initializeReporters()
|
||||||
|
private val collectorLocalIndex = ThreadLocal<Int>()
|
||||||
|
private val collectorIndexCounter = AtomicInteger()
|
||||||
|
private val futures = LinkedList<Future<*>>()
|
||||||
|
|
||||||
|
private val pool = Executors.newFixedThreadPool(numberOfThreads) { runnable ->
|
||||||
|
Thread {
|
||||||
|
collectorLocalIndex.set(collectorIndexCounter.getAndIncrement())
|
||||||
|
runnable.run()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initializeReporters(): List<SimpleDiagnosticReporter> {
|
||||||
|
return (1..numberOfThreads).map { SimpleDiagnosticReporter() }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun initializeCollector() {
|
||||||
|
reporters = initializeReporters()
|
||||||
|
futures.clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getCollectedDiagnostics(): Iterable<ConeDiagnostic> {
|
||||||
|
futures.forEach { it.get() }
|
||||||
|
return Iterable {
|
||||||
|
object : Iterator<ConeDiagnostic> {
|
||||||
|
private val globalIterator = reporters.iterator()
|
||||||
|
private var localIterator = globalIterator.next().diagnostics.iterator()
|
||||||
|
|
||||||
|
private fun update() {
|
||||||
|
while (!localIterator.hasNext() && globalIterator.hasNext()) {
|
||||||
|
localIterator = globalIterator.next().diagnostics.iterator()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hasNext(): Boolean {
|
||||||
|
update()
|
||||||
|
return localIterator.hasNext()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun next(): ConeDiagnostic {
|
||||||
|
update()
|
||||||
|
return localIterator.next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun runCheck(block: (DiagnosticReporter) -> Unit) {
|
||||||
|
futures += pool.submit {
|
||||||
|
val reporter = reporters[collectorLocalIndex.get()]
|
||||||
|
block(reporter)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* 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.resolve.diagnostics.collectors
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.SimpleDiagnosticReporter
|
||||||
|
|
||||||
|
class SimpleDiagnosticsCollector : AbstractDiagnosticCollector() {
|
||||||
|
private var reporter = SimpleDiagnosticReporter()
|
||||||
|
|
||||||
|
override fun initializeCollector() {
|
||||||
|
reporter = SimpleDiagnosticReporter()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getCollectedDiagnostics(): Iterable<ConeDiagnostic> {
|
||||||
|
return reporter.diagnostics
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun runCheck(block: (DiagnosticReporter) -> Unit) {
|
||||||
|
block(reporter)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* 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.resolve.diagnostics.collectors.components
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.checkers.declaration.DeclarationCheckers
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.checkers.declaration.FirDeclarationChecker
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.AbstractDiagnosticCollector
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.AbstractDiagnosticCollectorComponent
|
||||||
|
|
||||||
|
class DeclarationCheckersDiagnosticComponent(collector: AbstractDiagnosticCollector) : AbstractDiagnosticCollectorComponent(collector) {
|
||||||
|
override fun visitProperty(property: FirProperty) {
|
||||||
|
runCheck { DeclarationCheckers.MEMBER_DECLARATIONS.check(property, it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitRegularClass(regularClass: FirRegularClass) {
|
||||||
|
runCheck { DeclarationCheckers.MEMBER_DECLARATIONS.check(regularClass, it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitSimpleFunction(simpleFunction: FirSimpleFunction) {
|
||||||
|
runCheck { DeclarationCheckers.MEMBER_DECLARATIONS.check(simpleFunction, it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitTypeAlias(typeAlias: FirTypeAlias) {
|
||||||
|
runCheck { DeclarationCheckers.MEMBER_DECLARATIONS.check(typeAlias, it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun <D : FirDeclaration> List<FirDeclarationChecker<D>>.check(declaration: D, reporter: DiagnosticReporter) {
|
||||||
|
for (checker in this) {
|
||||||
|
checker.check(declaration, reporter)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
<INAPPLICABLE_INFIX_MODIFIER>: infix fun Int.foo(x: Int, y: Int) {}
|
||||||
|
|
||||||
|
<INAPPLICABLE_INFIX_MODIFIER>: infix fun Int.bar() {}
|
||||||
|
|
||||||
|
<INAPPLICABLE_INFIX_MODIFIER>: infix fun baz(x: Int, y: Int) {}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
infix fun Int.good(x: Int) {}
|
||||||
|
|
||||||
|
infix fun Int.foo(x: Int, y: Int) {}
|
||||||
|
|
||||||
|
infix fun Int.bar() {}
|
||||||
|
|
||||||
|
infix fun baz(x: Int, y: Int) {}
|
||||||
|
|
||||||
|
infix class A
|
||||||
|
|
||||||
|
infix typealias B = A
|
||||||
|
|
||||||
|
infix val x = 1
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
FILE: infixFunctions.kt
|
||||||
|
public final infix fun R|kotlin/Int|.good(x: R|kotlin/Int|): R|kotlin/Unit| {
|
||||||
|
}
|
||||||
|
public final infix fun R|kotlin/Int|.foo(x: R|kotlin/Int|, y: R|kotlin/Int|): R|kotlin/Unit| {
|
||||||
|
}
|
||||||
|
public final infix fun R|kotlin/Int|.bar(): R|kotlin/Unit| {
|
||||||
|
}
|
||||||
|
public final infix fun baz(x: R|kotlin/Int|, y: R|kotlin/Int|): R|kotlin/Unit| {
|
||||||
|
}
|
||||||
|
public final class A : R|kotlin/Any| {
|
||||||
|
public constructor(): R|A| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final typealias B = R|A|
|
||||||
|
public final val x: R|kotlin/Int| = Int(1)
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
+44
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* 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.fir.declarations.FirFile
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.*
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.ParallelDiagnosticsCollector
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.SimpleDiagnosticsCollector
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.components.DeclarationCheckersDiagnosticComponent
|
||||||
|
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
abstract class AbstractFirResolveWithDiagnosticsTestCase : AbstractFirResolveTestCase() {
|
||||||
|
override fun doTest(path: String) {
|
||||||
|
val firFiles = processInputFile(path)
|
||||||
|
checkFir(path, firFiles)
|
||||||
|
checkDiagnostics(path, firFiles)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun checkDiagnostics(path: String, firFiles: List<FirFile>) {
|
||||||
|
// val collector = SimpleDiagnosticsCollector()
|
||||||
|
val collector = ParallelDiagnosticsCollector(4)
|
||||||
|
collector.initializeComponents(DeclarationCheckersDiagnosticComponent(collector))
|
||||||
|
val diagnostics = mutableListOf<ConeDiagnostic>()
|
||||||
|
for (file in firFiles) {
|
||||||
|
diagnostics += collector.collectDiagnostics(file)
|
||||||
|
}
|
||||||
|
val expectedPath = path.replace(".kt", ".diagnostics.txt")
|
||||||
|
val expectedFile = File(expectedPath)
|
||||||
|
if (diagnostics.isEmpty()) {
|
||||||
|
assertFalse("There is no diagnostics but expected file exists", expectedFile.exists())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val actual = diagnostics.joinToString("\n\n") {
|
||||||
|
val text = (it.source as FirPsiSourceElement).psi.text
|
||||||
|
"<${it.factory.name}>: $text"
|
||||||
|
}
|
||||||
|
KotlinTestUtils.assertEqualsToFile(expectedFile, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -25,7 +25,7 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testAllFilesPresentInResolve() throws Exception {
|
public void testAllFilesPresentInResolve() throws Exception {
|
||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/fir/resolve/testData/resolve"), Pattern.compile("^([^.]+)\\.kt$"), true, "stdlib", "cfg", "smartcasts");
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/fir/resolve/testData/resolve"), Pattern.compile("^([^.]+)\\.kt$"), true, "stdlib", "cfg", "smartcasts", "diagnostics");
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("cast.kt")
|
@TestMetadata("cast.kt")
|
||||||
|
|||||||
Generated
+35
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* 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 com.intellij.testFramework.TestDataPath;
|
||||||
|
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
|
||||||
|
import org.jetbrains.kotlin.test.KotlinTestUtils;
|
||||||
|
import org.jetbrains.kotlin.test.TestMetadata;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
|
||||||
|
@SuppressWarnings("all")
|
||||||
|
@TestMetadata("compiler/fir/resolve/testData/resolve/diagnostics")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public class FirResolveWithDiagnosticsTestCaseGenerated extends AbstractFirResolveWithDiagnosticsTestCase {
|
||||||
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
|
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAllFilesPresentInDiagnostics() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/fir/resolve/testData/resolve/diagnostics"), Pattern.compile("^([^.]+)\\.kt$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("infixFunctions.kt")
|
||||||
|
public void testInfixFunctions() throws Exception {
|
||||||
|
runTest("compiler/fir/resolve/testData/resolve/diagnostics/infixFunctions.kt");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -513,7 +513,7 @@ fun main(args: Array<String>) {
|
|||||||
|
|
||||||
testGroup("compiler/fir/resolve/tests", "compiler/fir/resolve/testData") {
|
testGroup("compiler/fir/resolve/tests", "compiler/fir/resolve/testData") {
|
||||||
testClass<AbstractFirResolveTestCase> {
|
testClass<AbstractFirResolveTestCase> {
|
||||||
model("resolve", pattern = KT_WITHOUT_DOTS_IN_NAME, excludeDirs = listOf("stdlib", "cfg", "smartcasts"))
|
model("resolve", pattern = KT_WITHOUT_DOTS_IN_NAME, excludeDirs = listOf("stdlib", "cfg", "smartcasts", "diagnostics"))
|
||||||
}
|
}
|
||||||
|
|
||||||
testClass<AbstractFirCfgBuildingTest> {
|
testClass<AbstractFirCfgBuildingTest> {
|
||||||
@@ -528,6 +528,10 @@ fun main(args: Array<String>) {
|
|||||||
testClass<AbstractFirCfgBuildingWithStdlibTest> {
|
testClass<AbstractFirCfgBuildingWithStdlibTest> {
|
||||||
model("resolve/stdlib/contracts", pattern = KT_WITHOUT_DOTS_IN_NAME)
|
model("resolve/stdlib/contracts", pattern = KT_WITHOUT_DOTS_IN_NAME)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testClass<AbstractFirResolveWithDiagnosticsTestCase> {
|
||||||
|
model("resolve/diagnostics", pattern = KT_WITHOUT_DOTS_IN_NAME)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
testGroup("compiler/fir/resolve/tests", "compiler/testData") {
|
testGroup("compiler/fir/resolve/tests", "compiler/testData") {
|
||||||
|
|||||||
Reference in New Issue
Block a user