[FIR-PLUGIN] Add additional checker to prototype plugin

This commit is contained in:
Dmitriy Novozhilov
2020-05-12 11:13:42 +03:00
parent f764baad82
commit 799253256c
7 changed files with 98 additions and 0 deletions
@@ -7,6 +7,7 @@ dependencies {
compile(project(":compiler:fir:cones")) compile(project(":compiler:fir:cones"))
compile(project(":compiler:fir:tree")) compile(project(":compiler:fir:tree"))
compile(project(":compiler:fir:resolve")) compile(project(":compiler:fir:resolve"))
compile(project(":compiler:fir:checkers"))
compile(project(":compiler:frontend")) compile(project(":compiler:frontend"))
compileOnly(project(":kotlin-reflect-api")) compileOnly(project(":kotlin-reflect-api"))
@@ -0,0 +1,22 @@
/*
* Copyright 2010-2020 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.plugin
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirMemberDeclarationChecker
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
import org.jetbrains.kotlin.fir.declarations.FirPluginKey
import org.jetbrains.kotlin.fir.plugin.checkers.DummyNameChecker
class AllOpenAdditionalCheckers(session: FirSession) : FirAdditionalCheckersExtension(session) {
override val key: FirPluginKey
get() = AllOpenPluginKey
override val declarationCheckers: DeclarationCheckers = object : DeclarationCheckers() {
override val memberDeclarationCheckers: List<FirMemberDeclarationChecker> = listOf(DummyNameChecker)
}
}
@@ -11,5 +11,6 @@ class FirAllOpenComponentRegistrar : FirExtensionRegistrar() {
override fun ExtensionRegistrarContext.configurePlugin() { override fun ExtensionRegistrarContext.configurePlugin() {
+::AllOpenStatusTransformer +::AllOpenStatusTransformer
+::AllOpenClassGenerator +::AllOpenClassGenerator
+::AllOpenAdditionalCheckers
} }
} }
@@ -0,0 +1,22 @@
/*
* Copyright 2010-2020 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.plugin.checkers
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirMemberDeclarationChecker
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
object DummyNameChecker : FirMemberDeclarationChecker() {
override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration !is FirSimpleFunction) return
if (declaration.name.asString() == "dummy") {
declaration.source?.let { reporter.report(FirErrors.SYNTAX_ERROR.on(it)) }
}
}
}
@@ -0,0 +1,13 @@
<!SYNTAX_ERROR!>fun dummy(x: Int) {
}<!>
class A {
<!SYNTAX_ERROR!>fun dummy() {
}<!>
}
class B {
val dummy: Int = 1
}
@@ -0,0 +1,21 @@
FILE: simple.kt
public final fun dummy(x: R|kotlin/Int|): R|kotlin/Unit| {
}
public final class A : R|kotlin/Any| {
public constructor(): R|A| {
super<R|kotlin/Any|>()
}
public final fun dummy(): R|kotlin/Unit| {
}
}
public final class B : R|kotlin/Any| {
public constructor(): R|B| {
super<R|kotlin/Any|>()
}
public final val dummy: R|kotlin/Int| = Int(1)
public get(): R|kotlin/Int|
}
@@ -28,6 +28,24 @@ public class FirAllOpenDiagnosticTestGenerated extends AbstractFirAllOpenDiagnos
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("plugins/fir/fir-plugin-prototype/testData"), Pattern.compile("^(.+)\\.kt$"), null, true); KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("plugins/fir/fir-plugin-prototype/testData"), Pattern.compile("^(.+)\\.kt$"), null, true);
} }
@TestMetadata("plugins/fir/fir-plugin-prototype/testData/checkers")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class Checkers extends AbstractFirAllOpenDiagnosticTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
}
public void testAllFilesPresentInCheckers() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("plugins/fir/fir-plugin-prototype/testData/checkers"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
runTest("plugins/fir/fir-plugin-prototype/testData/checkers/simple.kt");
}
}
@TestMetadata("plugins/fir/fir-plugin-prototype/testData/classGen") @TestMetadata("plugins/fir/fir-plugin-prototype/testData/classGen")
@TestDataPath("$PROJECT_ROOT") @TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class) @RunWith(JUnit3RunnerWithInners.class)