From b1c9d4b0463d1048d36cbeca9e8a3fd68f203057 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 24 Nov 2020 17:07:33 +0300 Subject: [PATCH] [FIR] Introduce & use VISIBILITY_MODIFIER positioning strategy --- .../RedundantVisibilityModifierChecker.kt | 3 +-- .../fir/analysis/diagnostics/FirErrors.kt | 2 +- .../LightTreePositioningStrategies.kt | 19 +++++++++++++++++++ .../SourceElementPositioningStrategies.kt | 5 +++++ .../diagnostics/PositioningStrategies.kt | 7 +++---- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantVisibilityModifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantVisibilityModifierChecker.kt index 272a0eeff28..d9551921c51 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantVisibilityModifierChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantVisibilityModifierChecker.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors -import org.jetbrains.kotlin.fir.analysis.getChild import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens @@ -56,7 +55,7 @@ object RedundantVisibilityModifierChecker : FirBasicDeclarationChecker() { && declaration.setter?.visibility == Visibilities.Public ) return - reporter.report(declaration.source?.getChild(KtTokens.VISIBILITY_MODIFIERS), FirErrors.REDUNDANT_VISIBILITY_MODIFIER) + reporter.report(declaration.source, FirErrors.REDUNDANT_VISIBILITY_MODIFIER) } private fun FirDeclaration.implicitVisibility(context: CheckerContext): Visibility { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index ab2cfa3e2c0..536e4bd3711 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -154,7 +154,7 @@ object FirErrors { val WRONG_IMPLIES_CONDITION by error0() // Extended checkers group - val REDUNDANT_VISIBILITY_MODIFIER by warning0() + val REDUNDANT_VISIBILITY_MODIFIER by warning0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val REDUNDANT_MODALITY_MODIFIER by warning0() val REDUNDANT_RETURN_UNIT_TYPE by warning0() val REDUNDANT_EXPLICIT_TYPE by warning0() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt index c54e0704f2f..43f112837f7 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt @@ -143,6 +143,22 @@ object LightTreePositioningStrategies { } } + val VISIBILITY_MODIFIER: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { + override fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure): List { + tree.visibilityModifier(node)?.let { return markElement(it, tree) } + tree.nameIdentifier(node)?.let { return markElement(it, tree) } + return when (node.tokenType) { + KtNodeTypes.OBJECT_DECLARATION -> { + markElement(tree.objectKeyword(node)!!, tree) + } + KtNodeTypes.PROPERTY_ACCESSOR -> { + markElement(tree.accessorNamePlaceholder(node), tree) + } + else -> markElement(node, tree) + } + } + } + val OPERATOR: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { override fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure): List { return markElement(tree.operationReference(node) ?: node, tree) @@ -180,6 +196,9 @@ private fun FlyweightCapableTreeStructure.objectKeyword(node: Li private fun FlyweightCapableTreeStructure.valOrVarKeyword(node: LighterASTNode): LighterASTNode? = findChildByType(node, VAL_VAR_TOKEN_SET) +private fun FlyweightCapableTreeStructure.visibilityModifier(node: LighterASTNode): LighterASTNode? = + findChildByType(node, KtTokens.VISIBILITY_MODIFIERS) + private fun FlyweightCapableTreeStructure.accessorNamePlaceholder(node: LighterASTNode): LighterASTNode = findChildByType(node, KtTokens.GET_KEYWORD) ?: findChildByType(node, KtTokens.SET_KEYWORD)!! diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt index b17ce744feb..f5efd5b8b60 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt @@ -33,6 +33,11 @@ object SourceElementPositioningStrategies { PositioningStrategies.DECLARATION_SIGNATURE ) + val VISIBILITY_MODIFIER = SourceElementPositioningStrategy( + LightTreePositioningStrategies.VISIBILITY_MODIFIER, + PositioningStrategies.VISIBILITY_MODIFIER + ) + val OPERATOR = SourceElementPositioningStrategy( LightTreePositioningStrategies.OPERATOR, PositioningStrategies.OPERATOR diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt index 545bd85c01b..721d31e708a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.diagnostics.Errors.ACTUAL_WITHOUT_EXPECT import org.jetbrains.kotlin.diagnostics.Errors.NO_ACTUAL_FOR_EXPECT import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.lexer.KtTokens.VISIBILITY_MODIFIERS import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver.Compatibility.Incompatible @@ -405,12 +406,10 @@ object PositioningStrategies { @JvmField val VISIBILITY_MODIFIER: PositioningStrategy = object : PositioningStrategy() { override fun mark(element: KtModifierListOwner): List { - val visibilityTokens = - listOf(KtTokens.PRIVATE_KEYWORD, KtTokens.PROTECTED_KEYWORD, KtTokens.PUBLIC_KEYWORD, KtTokens.INTERNAL_KEYWORD) val modifierList = element.modifierList - val result = visibilityTokens.mapNotNull { modifierList?.getModifier(it)?.textRange } - if (!result.isEmpty()) return result + val result = VISIBILITY_MODIFIERS.types.mapNotNull { modifierList?.getModifier(it as KtModifierKeywordToken)?.textRange } + if (result.isNotEmpty()) return result // Try to resolve situation when there's no visibility modifiers written before element if (element is PsiNameIdentifierOwner) {