UAST: tests utils for bottom-top finding UElements moved to AbstractUastTest.kt
This commit is contained in:
committed by
Dmitry Jemerov
parent
f9809d5a73
commit
c5fa7fb217
@@ -6,11 +6,11 @@ import org.jetbrains.kotlin.psi.KtBinaryExpression
|
|||||||
import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry
|
import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry
|
||||||
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
|
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
|
||||||
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
|
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
|
||||||
import org.jetbrains.uast.*
|
import org.jetbrains.uast.*
|
||||||
import org.jetbrains.uast.kotlin.KotlinUastLanguagePlugin
|
import org.jetbrains.uast.kotlin.KotlinUastLanguagePlugin
|
||||||
import org.jetbrains.uast.test.env.findElementByText
|
import org.jetbrains.uast.test.env.findElementByText
|
||||||
|
import org.jetbrains.uast.test.env.findElementByTextFromPsi
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
@@ -131,19 +131,19 @@ class KotlinUastApiTest : AbstractKotlinUastTest() {
|
|||||||
fun testWhenStringLiteral() {
|
fun testWhenStringLiteral() {
|
||||||
doTest("WhenStringLiteral") { _, file ->
|
doTest("WhenStringLiteral") { _, file ->
|
||||||
|
|
||||||
file.findFromPsi<ULiteralExpression>("abc").let { literalExpression ->
|
file.findElementByTextFromPsi<ULiteralExpression>("abc").let { literalExpression ->
|
||||||
val psi = literalExpression.psi!!
|
val psi = literalExpression.psi!!
|
||||||
Assert.assertTrue(psi is KtLiteralStringTemplateEntry)
|
Assert.assertTrue(psi is KtLiteralStringTemplateEntry)
|
||||||
UsefulTestCase.assertInstanceOf(literalExpression.uastParent, USwitchClauseExpressionWithBody::class.java)
|
UsefulTestCase.assertInstanceOf(literalExpression.uastParent, USwitchClauseExpressionWithBody::class.java)
|
||||||
}
|
}
|
||||||
|
|
||||||
file.findFromPsi<ULiteralExpression>("def").let { literalExpression ->
|
file.findElementByTextFromPsi<ULiteralExpression>("def").let { literalExpression ->
|
||||||
val psi = literalExpression.psi!!
|
val psi = literalExpression.psi!!
|
||||||
Assert.assertTrue(psi is KtLiteralStringTemplateEntry)
|
Assert.assertTrue(psi is KtLiteralStringTemplateEntry)
|
||||||
UsefulTestCase.assertInstanceOf(literalExpression.uastParent, USwitchClauseExpressionWithBody::class.java)
|
UsefulTestCase.assertInstanceOf(literalExpression.uastParent, USwitchClauseExpressionWithBody::class.java)
|
||||||
}
|
}
|
||||||
|
|
||||||
file.findFromPsi<ULiteralExpression>("def1").let { literalExpression ->
|
file.findElementByTextFromPsi<ULiteralExpression>("def1").let { literalExpression ->
|
||||||
val psi = literalExpression.psi!!
|
val psi = literalExpression.psi!!
|
||||||
Assert.assertTrue(psi is KtLiteralStringTemplateEntry)
|
Assert.assertTrue(psi is KtLiteralStringTemplateEntry)
|
||||||
UsefulTestCase.assertInstanceOf(literalExpression.uastParent, UBlockExpression::class.java)
|
UsefulTestCase.assertInstanceOf(literalExpression.uastParent, UBlockExpression::class.java)
|
||||||
@@ -157,7 +157,7 @@ class KotlinUastApiTest : AbstractKotlinUastTest() {
|
|||||||
fun testWhenAndDestructing() {
|
fun testWhenAndDestructing() {
|
||||||
doTest("WhenAndDestructing") { _, file ->
|
doTest("WhenAndDestructing") { _, file ->
|
||||||
|
|
||||||
file.findFromPsi<UExpression>("val (bindingContext, statementFilter) = arr").let { e ->
|
file.findElementByTextFromPsi<UExpression>("val (bindingContext, statementFilter) = arr").let { e ->
|
||||||
val uBlockExpression = e.getParentOfType<UBlockExpression>()
|
val uBlockExpression = e.getParentOfType<UBlockExpression>()
|
||||||
Assert.assertNotNull(uBlockExpression)
|
Assert.assertNotNull(uBlockExpression)
|
||||||
val uMethod = uBlockExpression!!.getParentOfType<UMethod>()
|
val uMethod = uBlockExpression!!.getParentOfType<UMethod>()
|
||||||
@@ -167,11 +167,3 @@ class KotlinUastApiTest : AbstractKotlinUastTest() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inline fun <reified T : UElement> UFile.findFromPsi(refText: String): T =
|
|
||||||
(this.psi.findElementAt(this.psi.text.indexOf(refText)) ?: throw AssertionError("requested text '$refText' was not found in ${this.psi.name}"))
|
|
||||||
.parentsWithSelf.dropWhile { !it.text.contains(refText) }.mapNotNull { it.toUElementOfType<T>() }.first().also {
|
|
||||||
if (it.psi != null && it.psi?.text != refText) throw AssertionError("requested text '$refText' found as '${it.psi?.text}' in $it")
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -17,10 +17,14 @@
|
|||||||
package org.jetbrains.uast.test.env
|
package org.jetbrains.uast.test.env
|
||||||
|
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||||
import org.jetbrains.uast.UElement
|
import org.jetbrains.uast.UElement
|
||||||
import org.jetbrains.uast.UFile
|
import org.jetbrains.uast.UFile
|
||||||
|
import org.jetbrains.uast.toUElementOfType
|
||||||
import org.jetbrains.uast.visitor.UastVisitor
|
import org.jetbrains.uast.visitor.UastVisitor
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import kotlin.test.fail
|
||||||
|
|
||||||
abstract class AbstractUastTest : AbstractTestWithCoreEnvironment() {
|
abstract class AbstractUastTest : AbstractTestWithCoreEnvironment() {
|
||||||
protected companion object {
|
protected companion object {
|
||||||
@@ -60,3 +64,11 @@ fun <T> UElement.findElementByText(refText: String, cls: Class<T>): T {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline fun <reified T : Any> UElement.findElementByText(refText: String): T = findElementByText(refText, T::class.java)
|
inline fun <reified T : Any> UElement.findElementByText(refText: String): T = findElementByText(refText, T::class.java)
|
||||||
|
|
||||||
|
inline fun <reified T : UElement> UElement.findElementByTextFromPsi(refText: String): T = (this.psi ?: fail("no psi for $this")).findUElementByTextFromPsi(refText)
|
||||||
|
|
||||||
|
inline fun <reified T : UElement> PsiElement.findUElementByTextFromPsi(refText: String): T =
|
||||||
|
(this.findElementAt(this.text.indexOf(refText)) ?: throw AssertionError("requested text '$refText' was not found in $this"))
|
||||||
|
.parentsWithSelf.dropWhile { !it.text.contains(refText) }.mapNotNull { it.toUElementOfType<T>() }.first().also {
|
||||||
|
if (it.psi != null && it.psi?.text != refText) throw AssertionError("requested text '$refText' found as '${it.psi?.text}' in $it")
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user