[K2] Support reporting of SUPERTYPE_INITIALIZED_IN_EXPECTED_CLASS

...on regular classes and enum entries.

^KT-59979 Fixed
This commit is contained in:
Roman Efremov
2023-10-11 13:06:05 +02:00
committed by Space Team
parent 32a87836c2
commit a05b37c652
13 changed files with 96 additions and 9 deletions
@@ -1233,6 +1233,29 @@ object LightTreePositioningStrategies {
return markElement(nodeToMark, startOffset, endOffset, tree, node)
}
}
val SUPERTYPE_INITIALIZED_IN_EXPECTED_CLASS_DIAGNOSTIC: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
override fun mark(
node: LighterASTNode,
startOffset: Int,
endOffset: Int,
tree: FlyweightCapableTreeStructure<LighterASTNode>
): List<TextRange> {
val nodeToMark = when (node.tokenType) {
KtNodeTypes.ENUM_ENTRY -> {
tree.findChildByType(node, KtNodeTypes.INITIALIZER_LIST) ?: node
}
KtNodeTypes.TYPE_REFERENCE -> {
val valueArgList = node.getParentIfTypeIs(KtNodeTypes.CONSTRUCTOR_CALLEE, tree)
?.getParentIfTypeIs(KtNodeTypes.SUPER_TYPE_CALL_ENTRY, tree)
?.let { tree.findChildByType(it, KtNodeTypes.VALUE_ARGUMENT_LIST) }
valueArgList ?: node
}
else -> node
}
return markElement(nodeToMark, startOffset, endOffset, tree, node)
}
}
}
fun KtSourceElement.hasValOrVar(): Boolean =
@@ -1657,3 +1680,10 @@ private fun FlyweightCapableTreeStructure<LighterASTNode>.lastChild(node: Lighte
getChildren(node, childrenRef)
return childrenRef.get().lastOrNull { it != null }
}
private fun LighterASTNode.getParentIfTypeIs(
tokenType: IElementType,
tree: FlyweightCapableTreeStructure<LighterASTNode>,
): LighterASTNode? {
return tree.getParent(this)?.takeIf { it.tokenType == tokenType }
}
@@ -1046,6 +1046,21 @@ object PositioningStrategies {
}
}
@JvmField
val SUPERTYPE_INITIALIZED_IN_EXPECTED_CLASS_DIAGNOSTIC = object : PositioningStrategy<KtElement>() {
override fun mark(element: KtElement): List<TextRange> {
val elementToMark = when (element) {
is KtEnumEntry -> element.initializerList ?: element
is KtTypeReference -> {
val superTypeCallEntry = (element.parent as? KtConstructorCalleeExpression)?.parent as? KtSuperTypeCallEntry
superTypeCallEntry?.valueArgumentList ?: element
}
else -> element
}
return markElement(elementToMark)
}
}
/**
* @param locateReferencedName whether to remove any nested parentheses while locating the reference element. This is useful for
* diagnostics on super and unresolved references. For example, with the following, only the part inside the parentheses should be
@@ -394,4 +394,9 @@ object SourceElementPositioningStrategies {
LightTreePositioningStrategies.TYPEALIAS_TYPE_REFERENCE,
PositioningStrategies.TYPEALIAS_TYPE_REFERENCE,
)
val SUPERTYPE_INITIALIZED_IN_EXPECTED_CLASS_DIAGNOSTIC = SourceElementPositioningStrategy(
LightTreePositioningStrategies.SUPERTYPE_INITIALIZED_IN_EXPECTED_CLASS_DIAGNOSTIC,
PositioningStrategies.SUPERTYPE_INITIALIZED_IN_EXPECTED_CLASS_DIAGNOSTIC,
)
}