FIR: fix MANY_COMPANION_OBJECTS positioning

This commit is contained in:
Mikhail Glukhikh
2021-03-01 12:15:17 +03:00
parent 724ca1d3ee
commit 6fee46316e
8 changed files with 33 additions and 11 deletions
@@ -3,7 +3,7 @@ class A {
}
companion <!MANY_COMPANION_OBJECTS, REDECLARATION!>object<!> {
<!MANY_COMPANION_OBJECTS!>companion<!> <!REDECLARATION!>object<!> {
}
}
@@ -13,7 +13,7 @@ class B {
}
companion <!MANY_COMPANION_OBJECTS!>object B<!> {
<!MANY_COMPANION_OBJECTS!>companion<!> object B {
}
}
@@ -45,6 +45,7 @@ enum class PositioningStrategy(private val strategy: String) {
SELECTOR_BY_QUALIFIED("SELECTOR_BY_QUALIFIED"),
REFERENCE_BY_QUALIFIED("REFERENCE_BY_QUALIFIED"),
PRIVATE_MODIFIER("PRIVATE_MODIFIER"),
COMPANION_OBJECT("COMPANION_OBJECT"),
;
@@ -252,7 +252,7 @@ object DIAGNOSTICS_LIST : DiagnosticList() {
}
val REDECLARATIONS by object : DiagnosticGroup("Redeclarations") {
val MANY_COMPANION_OBJECTS by error<FirSourceElement, PsiElement>()
val MANY_COMPANION_OBJECTS by error<FirSourceElement, KtObjectDeclaration>(PositioningStrategy.COMPANION_OBJECT)
val CONFLICTING_OVERLOADS by error<FirSourceElement, PsiElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) {
parameter<Collection<AbstractFirBasedSymbol<*>>>("conflictingOverloads")
}
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.psi.KtIfExpression
import org.jetbrains.kotlin.psi.KtModifierListOwner
import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.KtObjectDeclaration
import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.KtPropertyAccessor
@@ -181,7 +182,7 @@ object FirErrors {
val NON_FINAL_MEMBER_IN_OBJECT by warning0<FirSourceElement, KtNamedDeclaration>(SourceElementPositioningStrategies.OPEN_MODIFIER)
// Redeclarations
val MANY_COMPANION_OBJECTS by error0<FirSourceElement, PsiElement>()
val MANY_COMPANION_OBJECTS by error0<FirSourceElement, KtObjectDeclaration>(SourceElementPositioningStrategies.COMPANION_OBJECT)
val CONFLICTING_OVERLOADS by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
val REDECLARATION by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>()
val ANY_METHOD_IMPLEMENTED_IN_INTERFACE by error0<FirSourceElement, PsiElement>()
@@ -55,6 +55,18 @@ object LightTreePositioningStrategies {
}
}
val COMPANION_OBJECT: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
override fun mark(
node: LighterASTNode,
startOffset: Int,
endOffset: Int,
tree: FlyweightCapableTreeStructure<LighterASTNode>
): List<TextRange> {
val target = tree.companionKeyword(node) ?: node
return markElement(target, startOffset, endOffset, tree, node)
}
}
val SECONDARY_CONSTRUCTOR_DELEGATION_CALL: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
override fun mark(
node: LighterASTNode,
@@ -405,6 +417,9 @@ fun FirSourceElement.hasVar(): Boolean =
fun FirSourceElement.hasPrimaryConstructor(): Boolean =
treeStructure.primaryConstructor(lighterASTNode) != null
private fun FlyweightCapableTreeStructure<LighterASTNode>.companionKeyword(node: LighterASTNode): LighterASTNode? =
modifierList(node)?.let { findChildByType(it, KtTokens.COMPANION_KEYWORD) }
private fun FlyweightCapableTreeStructure<LighterASTNode>.constructorKeyword(node: LighterASTNode): LighterASTNode? =
findChildByType(node, KtTokens.CONSTRUCTOR_KEYWORD)
@@ -18,6 +18,11 @@ object SourceElementPositioningStrategies {
PositioningStrategies.VAL_OR_VAR_NODE
)
val COMPANION_OBJECT = SourceElementPositioningStrategy(
LightTreePositioningStrategies.COMPANION_OBJECT,
PositioningStrategies.COMPANION_OBJECT
)
val SECONDARY_CONSTRUCTOR_DELEGATION_CALL = SourceElementPositioningStrategy(
LightTreePositioningStrategies.SECONDARY_CONSTRUCTOR_DELEGATION_CALL,
PositioningStrategies.SECONDARY_CONSTRUCTOR_DELEGATION_CALL
@@ -5,7 +5,7 @@ class A {
companion <!REDECLARATION!>object<!> {
val x = 1
}
companion <!MANY_COMPANION_OBJECTS, REDECLARATION!>object<!> {
<!MANY_COMPANION_OBJECTS!>companion<!> <!REDECLARATION!>object<!> {
val x = 1
}
}
@@ -14,10 +14,10 @@ class AA {
companion object {
val x = 1
}
companion <!MANY_COMPANION_OBJECTS!>object A<!> {
<!MANY_COMPANION_OBJECTS!>companion<!> object A {
val x = 1
}
companion <!MANY_COMPANION_OBJECTS!>object AA<!> {
<!MANY_COMPANION_OBJECTS!>companion<!> object AA {
val x = 1
}
}
@@ -2,16 +2,16 @@ class A {
inner class I {
companion <!NESTED_CLASS_NOT_ALLOWED!>object A<!>
companion <!MANY_COMPANION_OBJECTS, NESTED_CLASS_NOT_ALLOWED!>object B<!>
<!MANY_COMPANION_OBJECTS!>companion<!> <!NESTED_CLASS_NOT_ALLOWED!>object B<!>
companion <!MANY_COMPANION_OBJECTS, NESTED_CLASS_NOT_ALLOWED!>object C<!>
<!MANY_COMPANION_OBJECTS!>companion<!> <!NESTED_CLASS_NOT_ALLOWED!>object C<!>
}
}
object O {
companion object A
companion <!MANY_COMPANION_OBJECTS!>object B<!>
<!MANY_COMPANION_OBJECTS!>companion<!> object B
companion <!MANY_COMPANION_OBJECTS!>object C<!>
<!MANY_COMPANION_OBJECTS!>companion<!> object C
}