diff --git a/plugins/uast-kotlin/tests/AbstractKotlinIdentifiersTest.kt.192 b/plugins/uast-kotlin/tests/AbstractKotlinIdentifiersTest.kt.192 new file mode 100644 index 00000000000..7ad8eaf5956 --- /dev/null +++ b/plugins/uast-kotlin/tests/AbstractKotlinIdentifiersTest.kt.192 @@ -0,0 +1,37 @@ +package org.jetbrains.uast.test.kotlin + +import com.intellij.psi.PsiElement +import org.jetbrains.uast.* +import org.jetbrains.uast.test.common.UElementToParentMap +import org.jetbrains.uast.test.common.kotlin.IdentifiersTestBase +import org.jetbrains.uast.test.common.visitUFileAndGetResult +import org.jetbrains.uast.test.env.assertEqualsToFile +import java.io.File +import kotlin.test.assertNotNull + + +abstract class AbstractKotlinIdentifiersTest : AbstractKotlinUastTest(), IdentifiersTestBase { + + private fun getTestFile(testName: String, ext: String) = + File(File(AbstractKotlinUastTest.TEST_KOTLIN_MODEL_DIR, testName).canonicalPath + '.' + ext) + + override fun getIdentifiersFile(testName: String): File = getTestFile(testName, "identifiers.txt") + + override fun check(testName: String, file: UFile) { + super.check(testName, file) + assertEqualsToFile("refNames", getTestFile(testName, "refNames.txt"), file.asRefNames()) + } +} + +private fun refNameRetriever(psiElement: PsiElement): UElement? = + when (val uElement = psiElement.toUElementOfExpectedTypes(UCallExpression::class.java, UReferenceExpression::class.java)) { + is UReferenceExpression -> uElement.referenceNameElement + is UCallExpression -> uElement.classReference?.referenceNameElement + else -> null + }?.also { + assertNotNull(it.sourcePsi, "referenceNameElement should have physical source, origin = $psiElement") + } + +fun UFile.asRefNames() = object : UElementToParentMap(::refNameRetriever) { + override fun renderSource(element: PsiElement): String = element.javaClass.simpleName +}.visitUFileAndGetResult(this) \ No newline at end of file diff --git a/plugins/uast-kotlin/tests/org/jetbrains/uast/test/common/kotlin/ResolveTestBase.kt.192 b/plugins/uast-kotlin/tests/org/jetbrains/uast/test/common/kotlin/ResolveTestBase.kt.192 new file mode 100644 index 00000000000..96c36267c22 --- /dev/null +++ b/plugins/uast-kotlin/tests/org/jetbrains/uast/test/common/kotlin/ResolveTestBase.kt.192 @@ -0,0 +1,37 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.uast.test.common.kotlin + +import com.intellij.psi.PsiNamedElement +import org.jetbrains.uast.UFile +import org.jetbrains.uast.UResolvable +import org.jetbrains.uast.test.env.kotlin.findElementByText +import org.junit.Assert.assertEquals + +interface ResolveTestBase { + fun check(testName: String, file: UFile) { + val refComment = file.allCommentsInFile.find { it.text.startsWith("// REF:") } ?: throw IllegalArgumentException("No // REF tag in file") + val resultComment = file.allCommentsInFile.find { it.text.startsWith("// RESULT:") } ?: throw IllegalArgumentException("No // RESULT tag in file") + + val refText = refComment.text.substringAfter("REF:") + val parent = refComment.uastParent!! + val matchingElement = parent.findElementByText(refText) + val resolveResult = matchingElement.resolve() ?: throw IllegalArgumentException("Unresolved reference") + val resultText = resolveResult.javaClass.simpleName + (if (resolveResult is PsiNamedElement) ":${resolveResult.name}" else "") + assertEquals(resultComment.text.substringAfter("RESULT:"), resultText) + } +}