[FIR] Only mark declaration name with ACTUAL_WITHOUT_EXPECT

#KT-58827 Fixed
This commit is contained in:
Kirill Rakhman
2023-06-21 17:13:00 +02:00
committed by Space Team
parent 3e6175fe30
commit c95a9ff55e
31 changed files with 130 additions and 105 deletions
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.diagnostics
import com.intellij.lang.LighterASTNode
import com.intellij.openapi.util.Ref
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement
import com.intellij.psi.tree.IElementType
import com.intellij.psi.tree.TokenSet
import com.intellij.util.diff.FlyweightCapableTreeStructure
@@ -18,7 +17,6 @@ import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.psi.KtParameter.VAL_VAR_TOKEN_SET
import org.jetbrains.kotlin.psi.psiUtil.allChildren
import org.jetbrains.kotlin.psi.stubs.elements.KtConstantExpressionElementType
import org.jetbrains.kotlin.psi.stubs.elements.KtStringTemplateExpressionElementType
import org.jetbrains.kotlin.psi.stubs.elements.KtTokenSets
@@ -189,7 +187,7 @@ object LightTreePositioningStrategies {
}
}
val DECLARATION_NAME: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
private open class BaseDeclarationNameStrategy : LightTreePositioningStrategy() {
override fun mark(
node: LighterASTNode,
startOffset: Int,
@@ -198,15 +196,7 @@ object LightTreePositioningStrategies {
): List<TextRange> {
val nameIdentifier = tree.nameIdentifier(node)
if (nameIdentifier != null) {
if (node.tokenType == KtNodeTypes.CLASS || node.tokenType == KtNodeTypes.OBJECT_DECLARATION) {
val startElement =
tree.modifierList(node)?.let { modifierList -> tree.findChildByType(modifierList, KtTokens.ENUM_KEYWORD) }
?: tree.findChildByType(node, TokenSet.create(KtTokens.CLASS_KEYWORD, KtTokens.OBJECT_KEYWORD))
?: node
return markRange(startElement, nameIdentifier, startOffset, endOffset, tree, node)
}
return markElement(nameIdentifier, startOffset, endOffset, tree, node)
return markNameIdentifier(nameIdentifier, startOffset, endOffset, tree, node)
}
if (node.tokenType == KtNodeTypes.FUN) {
return DECLARATION_SIGNATURE.mark(node, startOffset, endOffset, tree)
@@ -214,6 +204,36 @@ object LightTreePositioningStrategies {
return DEFAULT.mark(node, startOffset, endOffset, tree)
}
protected open fun markNameIdentifier(
nameIdentifier: LighterASTNode,
startOffset: Int,
endOffset: Int,
tree: FlyweightCapableTreeStructure<LighterASTNode>,
node: LighterASTNode,
): List<TextRange> {
return markElement(nameIdentifier, startOffset, endOffset, tree, node)
}
}
val DECLARATION_NAME: LightTreePositioningStrategy = object : BaseDeclarationNameStrategy() {
override fun markNameIdentifier(
nameIdentifier: LighterASTNode,
startOffset: Int,
endOffset: Int,
tree: FlyweightCapableTreeStructure<LighterASTNode>,
node: LighterASTNode,
): List<TextRange> {
if (node.tokenType == KtNodeTypes.CLASS || node.tokenType == KtNodeTypes.OBJECT_DECLARATION) {
val startElement =
tree.modifierList(node)?.let { modifierList -> tree.findChildByType(modifierList, KtTokens.ENUM_KEYWORD) }
?: tree.findChildByType(node, TokenSet.create(KtTokens.CLASS_KEYWORD, KtTokens.OBJECT_KEYWORD))
?: node
return markRange(startElement, nameIdentifier, startOffset, endOffset, tree, node)
}
return markElement(nameIdentifier, startOffset, endOffset, tree, node)
}
override fun isValid(node: LighterASTNode, tree: FlyweightCapableTreeStructure<LighterASTNode>): Boolean {
//in FE 1.0 this is part of DeclarationHeader abstract strategy
if (node.tokenType != KtNodeTypes.OBJECT_DECLARATION
@@ -229,6 +249,8 @@ object LightTreePositioningStrategies {
}
}
val DECLARATION_NAME_ONLY: LightTreePositioningStrategy = BaseDeclarationNameStrategy()
val ACTUAL_DECLARATION_NAME: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
override fun mark(
node: LighterASTNode,
@@ -161,6 +161,20 @@ object PositioningStrategies {
}
}
@JvmField
val DECLARATION_NAME_ONLY: PositioningStrategy<KtNamedDeclaration> = object : DeclarationHeader<KtNamedDeclaration>() {
override fun mark(element: KtNamedDeclaration): List<TextRange> {
val nameIdentifier = element.nameIdentifier
if (nameIdentifier != null) {
return markElement(nameIdentifier)
}
if (element is KtNamedFunction) {
return DECLARATION_SIGNATURE.mark(element)
}
return DEFAULT.mark(element)
}
}
@JvmField
val DECLARATION_SIGNATURE: PositioningStrategy<KtDeclaration> = object : DeclarationHeader<KtDeclaration>() {
override fun mark(element: KtDeclaration): List<TextRange> {
@@ -43,6 +43,11 @@ object SourceElementPositioningStrategies {
PositioningStrategies.DECLARATION_NAME
)
val DECLARATION_NAME_ONLY = SourceElementPositioningStrategy(
LightTreePositioningStrategies.DECLARATION_NAME_ONLY,
PositioningStrategies.DECLARATION_NAME_ONLY
)
val DECLARATION_SIGNATURE = SourceElementPositioningStrategy(
LightTreePositioningStrategies.DECLARATION_SIGNATURE,
PositioningStrategies.DECLARATION_SIGNATURE