FIR checker: refactor FirSyntaxChecker

Introduce a new checkPsiOrLightTree so the structure is more symmetric.
In addition, now implementation of `checkLightTree` has access to
`FirLightSourceElement` rather tha a generic `FirSourceElement`
This commit is contained in:
Tianyu Geng
2021-09-24 11:43:02 -07:00
committed by TeamCityServer
parent 34071f285a
commit 809d518fcf
11 changed files with 33 additions and 29 deletions
@@ -27,7 +27,7 @@ object RedundantModalityModifierSyntaxChecker : FirDeclarationSyntaxChecker<FirD
override fun isApplicable(element: FirDeclaration, source: FirSourceElement): Boolean = override fun isApplicable(element: FirDeclaration, source: FirSourceElement): Boolean =
source.kind !is FirFakeSourceElementKind && element is FirMemberDeclaration source.kind !is FirFakeSourceElementKind && element is FirMemberDeclaration
override fun checkLightTree( override fun checkPsiOrLightTree(
element: FirDeclaration, element: FirDeclaration,
source: FirSourceElement, source: FirSourceElement,
context: CheckerContext, context: CheckerContext,
@@ -33,7 +33,7 @@ import org.jetbrains.kotlin.psi.KtDeclaration
object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<FirDeclaration, KtDeclaration>() { object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<FirDeclaration, KtDeclaration>() {
override fun checkLightTree( override fun checkPsiOrLightTree(
element: FirDeclaration, element: FirDeclaration,
source: FirSourceElement, source: FirSourceElement,
context: CheckerContext, context: CheckerContext,
@@ -5,8 +5,8 @@
package org.jetbrains.kotlin.fir.analysis.checkers.syntax package org.jetbrains.kotlin.fir.analysis.checkers.syntax
import org.jetbrains.kotlin.fir.FirLightSourceElement
import org.jetbrains.kotlin.fir.FirPsiSourceElement import org.jetbrains.kotlin.fir.FirPsiSourceElement
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
@@ -34,7 +34,7 @@ object FirAnonymousFunctionSyntaxChecker : FirDeclarationSyntaxChecker<FirAnonym
override fun checkLightTree( override fun checkLightTree(
element: FirAnonymousFunction, element: FirAnonymousFunction,
source: FirSourceElement, source: FirLightSourceElement,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
) { ) {
@@ -23,7 +23,7 @@ object FirCommaInWhenConditionChecker : FirExpressionSyntaxChecker<FirWhenExpres
return element.subject == null return element.subject == null
} }
override fun checkLightTree( override fun checkPsiOrLightTree(
element: FirWhenExpression, element: FirWhenExpression,
source: FirSourceElement, source: FirSourceElement,
context: CheckerContext, context: CheckerContext,
@@ -35,7 +35,7 @@ object FirConfusingWhenBranchSyntaxChecker : FirExpressionSyntaxChecker<FirWhenE
override fun checkLightTree( override fun checkLightTree(
element: FirWhenExpression, element: FirWhenExpression,
source: FirSourceElement, source: FirLightSourceElement,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
) { ) {
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.analysis.checkers.syntax package org.jetbrains.kotlin.fir.analysis.checkers.syntax
import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.fir.FirLightSourceElement
import org.jetbrains.kotlin.fir.FirPsiSourceElement import org.jetbrains.kotlin.fir.FirPsiSourceElement
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
@@ -39,7 +40,7 @@ object FirDelegationInInterfaceSyntaxChecker : FirDeclarationSyntaxChecker<FirRe
override fun checkLightTree( override fun checkLightTree(
element: FirRegularClass, element: FirRegularClass,
source: FirSourceElement, source: FirLightSourceElement,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
) { ) {
@@ -9,9 +9,7 @@ import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.config.AnalysisFlags import org.jetbrains.kotlin.config.AnalysisFlags
import org.jetbrains.kotlin.config.ExplicitApiMode import org.jetbrains.kotlin.config.ExplicitApiMode
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirRealSourceElementKind
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.isLocalMember import org.jetbrains.kotlin.fir.analysis.checkers.declaration.isLocalMember
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
@@ -23,7 +21,6 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor
import org.jetbrains.kotlin.fir.declarations.utils.effectiveVisibility import org.jetbrains.kotlin.fir.declarations.utils.effectiveVisibility
import org.jetbrains.kotlin.fir.declarations.utils.isData import org.jetbrains.kotlin.fir.declarations.utils.isData
import org.jetbrains.kotlin.fir.declarations.utils.isOverride import org.jetbrains.kotlin.fir.declarations.utils.isOverride
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.resolve.transformers.publishedApiEffectiveVisibility import org.jetbrains.kotlin.fir.resolve.transformers.publishedApiEffectiveVisibility
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
@@ -32,7 +29,12 @@ object FirExplicitApiDeclarationChecker : FirDeclarationSyntaxChecker<FirDeclara
private val codeFragmentTypes = private val codeFragmentTypes =
setOf(KtNodeTypes.BLOCK_CODE_FRAGMENT, KtNodeTypes.EXPRESSION_CODE_FRAGMENT, KtNodeTypes.TYPE_CODE_FRAGMENT) setOf(KtNodeTypes.BLOCK_CODE_FRAGMENT, KtNodeTypes.EXPRESSION_CODE_FRAGMENT, KtNodeTypes.TYPE_CODE_FRAGMENT)
override fun checkLightTree(element: FirDeclaration, source: FirSourceElement, context: CheckerContext, reporter: DiagnosticReporter) { override fun checkPsiOrLightTree(
element: FirDeclaration,
source: FirSourceElement,
context: CheckerContext,
reporter: DiagnosticReporter
) {
if ((source.kind !is FirRealSourceElementKind && source.kind != FirFakeSourceElementKind.PropertyFromParameter) || if ((source.kind !is FirRealSourceElementKind && source.kind != FirFakeSourceElementKind.PropertyFromParameter) ||
element !is FirMemberDeclaration element !is FirMemberDeclaration
) { ) {
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.analysis.checkers.syntax package org.jetbrains.kotlin.fir.analysis.checkers.syntax
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
import org.jetbrains.kotlin.fir.FirLightSourceElement
import org.jetbrains.kotlin.fir.FirPsiSourceElement import org.jetbrains.kotlin.fir.FirPsiSourceElement
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
@@ -39,7 +40,7 @@ object FirFunctionTypeParametersSyntaxChecker : FirDeclarationSyntaxChecker<FirS
override fun checkLightTree( override fun checkLightTree(
element: FirSimpleFunction, element: FirSimpleFunction,
source: FirSourceElement, source: FirLightSourceElement,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
) { ) {
@@ -6,16 +6,13 @@
package org.jetbrains.kotlin.fir.analysis.checkers.syntax package org.jetbrains.kotlin.fir.analysis.checkers.syntax
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirPsiSourceElement
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.diagnostics.typeParametersList import org.jetbrains.kotlin.fir.analysis.diagnostics.typeParametersList
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
@@ -41,7 +38,7 @@ object FirLocalVariableTypeParametersSyntaxChecker : FirDeclarationSyntaxChecker
override fun checkLightTree( override fun checkLightTree(
element: FirProperty, element: FirProperty,
source: FirSourceElement, source: FirLightSourceElement,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
) { ) {
@@ -18,7 +18,10 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
/** /**
* Checker that heavily relies on source tree. So it should have different implementation for each tree variant * Checker that heavily relies on source tree. So it may have different implementation for each tree variant. Subclass should either
*
* - implement `checkPsiOrLightTree` in an AST-agnostic manner, or
* - implement both `checkPsi` and `checkLightTree` if it's difficult to handle PSI and LT tree in a unified way.
*/ */
interface FirSyntaxChecker<in D : FirElement, P : PsiElement> { interface FirSyntaxChecker<in D : FirElement, P : PsiElement> {
@@ -34,18 +37,18 @@ interface FirSyntaxChecker<in D : FirElement, P : PsiElement> {
fun isApplicable(element: D, source: FirSourceElement): Boolean = true fun isApplicable(element: D, source: FirSourceElement): Boolean = true
/**
* By default psi tree should be equivalent to light tree and can be processed the same way
*/
fun checkPsi(element: D, source: FirPsiSourceElement, psi: P, context: CheckerContext, reporter: DiagnosticReporter) { fun checkPsi(element: D, source: FirPsiSourceElement, psi: P, context: CheckerContext, reporter: DiagnosticReporter) {
checkLightTree(element, source, context, reporter) checkPsiOrLightTree(element, source, context, reporter)
} }
/* fun checkLightTree(element: D, source: FirLightSourceElement, context: CheckerContext, reporter: DiagnosticReporter) {
accepts FirSourceElement instead of FirLightSourceElement because now they have the same interface checkPsiOrLightTree(element, source, context, reporter)
and it allows to reuse LT check for psi tree }
/**
* By default psi tree should be equivalent to light tree and can be processed the same way.
*/ */
fun checkLightTree(element: D, source: FirSourceElement, context: CheckerContext, reporter: DiagnosticReporter) fun checkPsiOrLightTree(element: D, source: FirSourceElement, context: CheckerContext, reporter: DiagnosticReporter) {}
} }
abstract class FirDeclarationSyntaxChecker<in D : FirDeclaration, P : PsiElement> : abstract class FirDeclarationSyntaxChecker<in D : FirDeclaration, P : PsiElement> :
@@ -35,7 +35,7 @@ object FirTypeParameterSyntaxChecker : FirDeclarationSyntaxChecker<FirTypeParame
} }
} }
override fun checkLightTree( override fun checkPsiOrLightTree(
element: FirTypeParameter, element: FirTypeParameter,
source: FirSourceElement, source: FirSourceElement,
context: CheckerContext, context: CheckerContext,