Skip to content

Commit 0abbd89

Browse files
Kotlin: drop PsiTreeUtil from KDoc-section parsing for build portability
The KDoc-section parser located the parsed KDoc via `com.intellij.psi.util.PsiTreeUtil.findChildOfType`. Like the `ProcessCanceledException` reference fixed in the previous commit, this `com.intellij` utility class is not present on every build's compiler classpath: the reduced/relocated embeddable classpath used by the internal extractor build strips it, so the build failed with `unresolved reference 'PsiTreeUtil'`. The standalone language-test builds (2.3.20, 2.4.0) bundle the full classpath and so did not catch it. Replace the utility call with a small hand-written depth-first search over the core `com.intellij.psi.PsiElement` navigation API (`firstChild`/`nextSibling`), which is always available (it is already used by the PSI comment extractor). The search has the same semantics as `findChildOfType`: it returns the first KDoc descendant in pre-order, so the parsed sections are unchanged. No expected-output changes: the KDoc lookup mechanism is behaviour-equivalent. Verified the standalone extractor still builds for 1.8.0, 1.9.20-Beta and 2.4.0. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 97199fd commit 0abbd89

1 file changed

Lines changed: 22 additions & 6 deletions

File tree

java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_0-Beta/CommentExtractorLighterAST.kt

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,27 @@ class CommentExtractorLighterAST(
5252
}
5353
}
5454

55+
// Depth-first search for the first KDoc descendant of `element`. We navigate
56+
// the PSI tree by hand rather than using `com.intellij.psi.util.PsiTreeUtil`,
57+
// because that utility class is not present on every supported compiler's
58+
// embeddable classpath (the reduced classpath used by some builds strips it),
59+
// whereas the core `PsiElement` navigation API is always available.
60+
private fun findKDocDescendant(
61+
element: com.intellij.psi.PsiElement
62+
): org.jetbrains.kotlin.kdoc.psi.api.KDoc? {
63+
if (element is org.jetbrains.kotlin.kdoc.psi.api.KDoc) {
64+
return element
65+
}
66+
var child = element.firstChild
67+
while (child != null) {
68+
findKDocDescendant(child)?.let {
69+
return it
70+
}
71+
child = child.nextSibling
72+
}
73+
return null
74+
}
75+
5576
private fun parseKDocSections(
5677
commentText: String
5778
): List<org.jetbrains.kotlin.kdoc.psi.impl.KDocSection>? {
@@ -60,12 +81,7 @@ class CommentExtractorLighterAST(
6081
// A KDoc is only recognised as a doc comment when it precedes a
6182
// declaration, so we append a throwaway declaration before parsing.
6283
val ktFile = factory.createFile("$commentText\nval __codeql_kdoc__ = 0")
63-
val kdoc =
64-
com.intellij.psi.util.PsiTreeUtil.findChildOfType(
65-
ktFile,
66-
org.jetbrains.kotlin.kdoc.psi.api.KDoc::class.java
67-
)
68-
kdoc?.getAllSections()
84+
findKDocDescendant(ktFile)?.getAllSections()
6985
} catch (e: Exception) {
7086
// Never swallow IntelliJ's ProcessCanceledException: it is a control-flow
7187
// exception that must propagate for cancellation to work. We match it by

0 commit comments

Comments
 (0)