[FIR] Implement FirNativeIdentifierChecker

* INVALID_CHARACTERS_NATIVE
This commit is contained in:
Ivan Kochurkin
2022-07-03 22:33:02 +03:00
parent a44d5bf52f
commit 0af43757e3
8 changed files with 131 additions and 27 deletions
@@ -855,6 +855,14 @@ object LightTreePositioningStrategies {
if (node.tokenType == KtNodeTypes.LABEL_QUALIFIER) {
return super.mark(node, startOffset, endOffset - 1, tree)
}
if (node.tokenType == KtNodeTypes.PACKAGE_DIRECTIVE) {
val referenceExpression = tree.findLastDescendant(node) {
it.tokenType == KtNodeTypes.REFERENCE_EXPRESSION
}
if (referenceExpression != null) {
return markElement(referenceExpression, startOffset, endOffset, tree, node)
}
}
return DEFAULT.mark(node, startOffset, endOffset, tree)
}
}
@@ -1449,8 +1457,28 @@ fun FlyweightCapableTreeStructure<LighterASTNode>.findFirstDescendant(
): LighterASTNode? {
val childrenRef = Ref<Array<LighterASTNode?>>()
getChildren(node, childrenRef)
return childrenRef.get()?.firstOrNull { it != null && predicate(it) }
?: childrenRef.get()?.firstNotNullOfOrNull { child -> child?.let { findFirstDescendant(it, predicate) } }
val nodes = childrenRef.get()
return nodes?.firstOrNull { it != null && predicate(it) }
?: nodes?.firstNotNullOfOrNull { child -> child?.let { findFirstDescendant(it, predicate) } }
}
fun FlyweightCapableTreeStructure<LighterASTNode>.findLastDescendant(
node: LighterASTNode,
predicate: (LighterASTNode) -> Boolean
): LighterASTNode? {
val childrenRef = Ref<Array<LighterASTNode?>>()
getChildren(node, childrenRef)
val nodes = childrenRef.get()
return nodes?.lastOrNull { it != null && predicate(it) }
?: run {
for (child in nodes.reversed()) {
val result = child?.let { findLastDescendant(it, predicate) }
if (result != null) {
return result
}
}
return null
}
}
fun FlyweightCapableTreeStructure<LighterASTNode>.collectDescendantsOfType(
@@ -847,6 +847,11 @@ object PositioningStrategies {
}
} else if (element is KtLabelReferenceExpression) {
return super.mark(element.getReferencedNameElement())
} else if (element is KtPackageDirective) {
val nameIdentifier = element.nameIdentifier
if (nameIdentifier != null) {
return super.mark(nameIdentifier)
}
}
return DEFAULT.mark(element)