[K2] Support reporting of SUPERTYPE_INITIALIZED_IN_EXPECTED_CLASS
...on regular classes and enum entries. ^KT-59979 Fixed
This commit is contained in:
committed by
Space Team
parent
32a87836c2
commit
a05b37c652
+30
@@ -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 }
|
||||
}
|
||||
|
||||
+15
@@ -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
|
||||
|
||||
+5
@@ -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,
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user