Move PsiElement.getElementTextWithContext to psi module with small adjustments

* replace existing function (the new one makes it more clear which element was printed)
* prints position for element
* handles invalid psi element
This commit is contained in:
Ilya Kirillov
2023-06-30 17:15:56 +02:00
committed by Space Team
parent 4b3bff3344
commit c5014d4765
9 changed files with 56 additions and 64 deletions
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.analysis.utils.errors
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiInvalidElementAccessException
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.utils.printer.getElementTextInContext
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.utils.exceptions.ExceptionAttachmentBuilder
@@ -20,7 +20,7 @@ public fun ExceptionAttachmentBuilder.withPsiEntry(name: String, psi: PsiElement
withEntry(name, psi) { psiElement ->
when {
!psiElement.isValid -> "INVALID PSI ${PsiInvalidElementAccessException.findOutInvalidationReason(psiElement)}"
psiElement is KtElement -> psiElement.getElementTextInContext()
psiElement is KtElement -> psiElement.getElementTextWithContext()
else -> psiElement.text
}
}
@@ -6,11 +6,7 @@
package org.jetbrains.kotlin.analysis.utils.printer
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementVisitor
import com.intellij.psi.impl.source.tree.LeafPsiElement
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.parents
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
@@ -26,25 +22,3 @@ public inline fun <reified T : PsiElement> PsiElement.parentsOfType(withSelf: Bo
parentsOfType(T::class.java, withSelf)
public fun KtElement.getElementTextInContext(): String {
@Suppress("LocalVariableName") val ELEMENT_TAG = "ELEMENT"
val context = parentOfType<KtImportDirective>()
?: parentOfType<KtPackageDirective>()
?: PsiTreeUtil.getParentOfType(this, KtDeclarationWithBody::class.java, KtClassOrObject::class.java, KtScript::class.java)
?: getNonStrictParentOfType<KtProperty>()
?: containingKtFile
val builder = StringBuilder()
context.accept(object : PsiElementVisitor() {
override fun visitElement(element: PsiElement) {
if (element === this@getElementTextInContext) builder.append("<$ELEMENT_TAG>")
if (element is LeafPsiElement) {
builder.append(element.text)
} else {
element.acceptChildren(this)
}
if (element === this@getElementTextInContext) builder.append("</$ELEMENT_TAG>")
}
})
return builder.toString().trimIndent().trim()
}