[FIR] Introduce & use VISIBILITY_MODIFIER positioning strategy
This commit is contained in:
+1
-2
@@ -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.checkers.declaration.FirBasicDeclarationChecker
|
||||||
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.getChild
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
@@ -56,7 +55,7 @@ object RedundantVisibilityModifierChecker : FirBasicDeclarationChecker() {
|
|||||||
&& declaration.setter?.visibility == Visibilities.Public
|
&& declaration.setter?.visibility == Visibilities.Public
|
||||||
) return
|
) 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 {
|
private fun FirDeclaration.implicitVisibility(context: CheckerContext): Visibility {
|
||||||
|
|||||||
+1
-1
@@ -154,7 +154,7 @@ object FirErrors {
|
|||||||
val WRONG_IMPLIES_CONDITION by error0<FirSourceElement, PsiElement>()
|
val WRONG_IMPLIES_CONDITION by error0<FirSourceElement, PsiElement>()
|
||||||
|
|
||||||
// Extended checkers group
|
// Extended checkers group
|
||||||
val REDUNDANT_VISIBILITY_MODIFIER by warning0<FirSourceElement, PsiElement>()
|
val REDUNDANT_VISIBILITY_MODIFIER by warning0<FirSourceElement, KtModifierListOwner>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER)
|
||||||
val REDUNDANT_MODALITY_MODIFIER by warning0<FirSourceElement, PsiElement>()
|
val REDUNDANT_MODALITY_MODIFIER by warning0<FirSourceElement, PsiElement>()
|
||||||
val REDUNDANT_RETURN_UNIT_TYPE by warning0<FirSourceElement, PsiTypeElement>()
|
val REDUNDANT_RETURN_UNIT_TYPE by warning0<FirSourceElement, PsiTypeElement>()
|
||||||
val REDUNDANT_EXPLICIT_TYPE by warning0<FirSourceElement, PsiElement>()
|
val REDUNDANT_EXPLICIT_TYPE by warning0<FirSourceElement, PsiElement>()
|
||||||
|
|||||||
+19
@@ -143,6 +143,22 @@ object LightTreePositioningStrategies {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val VISIBILITY_MODIFIER: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
|
||||||
|
override fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure<LighterASTNode>): List<TextRange> {
|
||||||
|
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() {
|
val OPERATOR: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
|
||||||
override fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure<LighterASTNode>): List<TextRange> {
|
override fun mark(node: LighterASTNode, tree: FlyweightCapableTreeStructure<LighterASTNode>): List<TextRange> {
|
||||||
return markElement(tree.operationReference(node) ?: node, tree)
|
return markElement(tree.operationReference(node) ?: node, tree)
|
||||||
@@ -180,6 +196,9 @@ private fun FlyweightCapableTreeStructure<LighterASTNode>.objectKeyword(node: Li
|
|||||||
private fun FlyweightCapableTreeStructure<LighterASTNode>.valOrVarKeyword(node: LighterASTNode): LighterASTNode? =
|
private fun FlyweightCapableTreeStructure<LighterASTNode>.valOrVarKeyword(node: LighterASTNode): LighterASTNode? =
|
||||||
findChildByType(node, VAL_VAR_TOKEN_SET)
|
findChildByType(node, VAL_VAR_TOKEN_SET)
|
||||||
|
|
||||||
|
private fun FlyweightCapableTreeStructure<LighterASTNode>.visibilityModifier(node: LighterASTNode): LighterASTNode? =
|
||||||
|
findChildByType(node, KtTokens.VISIBILITY_MODIFIERS)
|
||||||
|
|
||||||
private fun FlyweightCapableTreeStructure<LighterASTNode>.accessorNamePlaceholder(node: LighterASTNode): LighterASTNode =
|
private fun FlyweightCapableTreeStructure<LighterASTNode>.accessorNamePlaceholder(node: LighterASTNode): LighterASTNode =
|
||||||
findChildByType(node, KtTokens.GET_KEYWORD) ?: findChildByType(node, KtTokens.SET_KEYWORD)!!
|
findChildByType(node, KtTokens.GET_KEYWORD) ?: findChildByType(node, KtTokens.SET_KEYWORD)!!
|
||||||
|
|
||||||
|
|||||||
+5
@@ -33,6 +33,11 @@ object SourceElementPositioningStrategies {
|
|||||||
PositioningStrategies.DECLARATION_SIGNATURE
|
PositioningStrategies.DECLARATION_SIGNATURE
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val VISIBILITY_MODIFIER = SourceElementPositioningStrategy(
|
||||||
|
LightTreePositioningStrategies.VISIBILITY_MODIFIER,
|
||||||
|
PositioningStrategies.VISIBILITY_MODIFIER
|
||||||
|
)
|
||||||
|
|
||||||
val OPERATOR = SourceElementPositioningStrategy(
|
val OPERATOR = SourceElementPositioningStrategy(
|
||||||
LightTreePositioningStrategies.OPERATOR,
|
LightTreePositioningStrategies.OPERATOR,
|
||||||
PositioningStrategies.OPERATOR
|
PositioningStrategies.OPERATOR
|
||||||
|
|||||||
@@ -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.diagnostics.Errors.NO_ACTUAL_FOR_EXPECT
|
||||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens.VISIBILITY_MODIFIERS
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.*
|
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||||
import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver.Compatibility.Incompatible
|
import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver.Compatibility.Incompatible
|
||||||
@@ -405,12 +406,10 @@ object PositioningStrategies {
|
|||||||
@JvmField
|
@JvmField
|
||||||
val VISIBILITY_MODIFIER: PositioningStrategy<KtModifierListOwner> = object : PositioningStrategy<KtModifierListOwner>() {
|
val VISIBILITY_MODIFIER: PositioningStrategy<KtModifierListOwner> = object : PositioningStrategy<KtModifierListOwner>() {
|
||||||
override fun mark(element: KtModifierListOwner): List<TextRange> {
|
override fun mark(element: KtModifierListOwner): List<TextRange> {
|
||||||
val visibilityTokens =
|
|
||||||
listOf(KtTokens.PRIVATE_KEYWORD, KtTokens.PROTECTED_KEYWORD, KtTokens.PUBLIC_KEYWORD, KtTokens.INTERNAL_KEYWORD)
|
|
||||||
val modifierList = element.modifierList
|
val modifierList = element.modifierList
|
||||||
|
|
||||||
val result = visibilityTokens.mapNotNull { modifierList?.getModifier(it)?.textRange }
|
val result = VISIBILITY_MODIFIERS.types.mapNotNull { modifierList?.getModifier(it as KtModifierKeywordToken)?.textRange }
|
||||||
if (!result.isEmpty()) return result
|
if (result.isNotEmpty()) return result
|
||||||
|
|
||||||
// Try to resolve situation when there's no visibility modifiers written before element
|
// Try to resolve situation when there's no visibility modifiers written before element
|
||||||
if (element is PsiNameIdentifierOwner) {
|
if (element is PsiNameIdentifierOwner) {
|
||||||
|
|||||||
Reference in New Issue
Block a user