diff --git a/build.gradle.kts b/build.gradle.kts index 2915138222c..496b29f3668 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -364,6 +364,7 @@ extra["tasksWithWarnings"] = listOf( ":kotlin-stdlib-jdk7:compileTestKotlin", ":kotlin-stdlib-jdk8:compileTestKotlin", ":plugins:uast-kotlin-base:compileKotlin", + ":plugins:uast-kotlin-base:compileTestKotlin", ":plugins:uast-kotlin:compileKotlin", ":plugins:uast-kotlin:compileTestKotlin", ":plugins:uast-kotlin-fir:compileKotlin", diff --git a/plugins/uast-kotlin-base/build.gradle.kts b/plugins/uast-kotlin-base/build.gradle.kts index 80fe861a875..c607735fa6f 100644 --- a/plugins/uast-kotlin-base/build.gradle.kts +++ b/plugins/uast-kotlin-base/build.gradle.kts @@ -11,8 +11,16 @@ dependencies { // BEWARE: UAST should not depend on IJ platform so that it can work in Android Lint CLI mode (where IDE is not available) compileOnly(intellijCoreDep()) { includeJars("intellij-core", "asm-all", rootProject = rootProject) } compileOnly(intellijPluginDep("java")) { includeJars("java-api", "java-impl") } + + testImplementation(commonDep("junit:junit")) + testCompileOnly(intellijPluginDep("java")) { includeJars("java-api", "java-impl") } + testImplementation(projectTests(":compiler:tests-common")) + testCompileOnly(intellijDep("ideaIC")) } sourceSets { "main" { projectDefault() } + "test" { projectDefault() } } + +testsJar () diff --git a/plugins/uast-kotlin/tests/org/jetbrains/uast/test/common/kotlin/IndentedPrintingVisitor.kt b/plugins/uast-kotlin-base/tests/org/jetbrains/uast/test/common/kotlin/IndentedPrintingVisitor.kt similarity index 83% rename from plugins/uast-kotlin/tests/org/jetbrains/uast/test/common/kotlin/IndentedPrintingVisitor.kt rename to plugins/uast-kotlin-base/tests/org/jetbrains/uast/test/common/kotlin/IndentedPrintingVisitor.kt index aa7f38a03b1..ec15539c0ca 100644 --- a/plugins/uast-kotlin/tests/org/jetbrains/uast/test/common/kotlin/IndentedPrintingVisitor.kt +++ b/plugins/uast-kotlin-base/tests/org/jetbrains/uast/test/common/kotlin/IndentedPrintingVisitor.kt @@ -1,12 +1,11 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.uast.test.common.kotlin import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor -import com.intellij.psi.PsiFile import org.jetbrains.uast.UFile import kotlin.reflect.KClass @@ -36,9 +35,9 @@ abstract class IndentedPrintingVisitor(val shouldIndent: (PsiElement) -> Boolean val result: String get() = builder.toString() -} -fun IndentedPrintingVisitor.visitUFileAndGetResult(uFile: UFile): String { - (uFile.sourcePsi as PsiFile).accept(this) - return result -} \ No newline at end of file + fun visitUFileAndGetResult(uFile: UFile): String { + uFile.sourcePsi.accept(this) + return result + } +} diff --git a/plugins/uast-kotlin-base/tests/org/jetbrains/uast/test/common/kotlin/identifiersTestUtils.kt b/plugins/uast-kotlin-base/tests/org/jetbrains/uast/test/common/kotlin/identifiersTestUtils.kt new file mode 100644 index 00000000000..f226eda2621 --- /dev/null +++ b/plugins/uast-kotlin-base/tests/org/jetbrains/uast/test/common/kotlin/identifiersTestUtils.kt @@ -0,0 +1,78 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.uast.test.common.kotlin + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.psi.KtBlockExpression +import org.jetbrains.uast.* +import org.jetbrains.uast.visitor.AbstractUastVisitor +import org.jetbrains.uast.test.common.UElementToParentMap +import org.jetbrains.uast.test.common.visitUFileAndGetResult +import org.junit.ComparisonFailure +import kotlin.test.assertNotNull +import kotlin.test.fail + +fun UFile.asIdentifiersWithParents() = object : IndentedPrintingVisitor(KtBlockExpression::class) { + override fun render(element: PsiElement): CharSequence? = element.toUElementOfType()?.let { uIdentifier -> + StringBuilder().apply { + append(uIdentifier.sourcePsiElement!!.text) + append(" -> ") + append(uIdentifier.uastParent?.asLogString()) + } + } +}.visitUFileAndGetResult(this) + +fun UFile.testIdentifiersParents() { + accept(object : AbstractUastVisitor() { + override fun visitElement(node: UElement): Boolean { + val uIdentifier = when (node) { + is UAnchorOwner -> node.uastAnchor ?: return false + is UBinaryExpression -> node.operatorIdentifier ?: return false + else -> return false + } + + assertParents(node, uIdentifier) + val identifierSourcePsi = uIdentifier.sourcePsi ?: return false + val operatorIdentifierFromSource = identifierSourcePsi.toUElementOfType() + ?: fail("$identifierSourcePsi of ${identifierSourcePsi.javaClass} should be convertible to UIdentifier") + assertParents(node, operatorIdentifierFromSource) + + return false + } + }) +} + +private fun Sequence.log() = this.joinToString { it.asLogString() } + +private fun assertParents(node: UElement, uastAnchor: UIdentifier?) { + // skipping such elements because they are ambiguous (properties and getters for instance) + if (node.sourcePsi.toUElement() != node) return + if (uastAnchor == null) + throw AssertionError("no uast anchor for node = $node") + val nodeParents = node.withContainingElements.log() + val anchorParentParents = uastAnchor.uastParent?.withContainingElements?.log() ?: "" + // dropping node itself because we allow children to share identifiers with parents (primary constructor for instance) + val parentsSuffix = node.withContainingElements.drop(1).log() + if (!anchorParentParents.endsWith(parentsSuffix)) + throw ComparisonFailure( + "wrong parents for '${uastAnchor.sourcePsi?.text}' owner: $node[${node.sourcePsi}[${node.sourcePsi?.text}]]", + nodeParents, + anchorParentParents + ) +} + +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) diff --git a/plugins/uast-kotlin-fir/build.gradle.kts b/plugins/uast-kotlin-fir/build.gradle.kts index 6d8bf7e8b3f..602003963fd 100644 --- a/plugins/uast-kotlin-fir/build.gradle.kts +++ b/plugins/uast-kotlin-fir/build.gradle.kts @@ -25,15 +25,17 @@ dependencies { implementation(project(":idea:idea-frontend-api")) implementation(project(":idea:idea-frontend-fir")) - testImplementation(toolsJar()) testImplementation(commonDep("junit:junit")) testCompileOnly(intellijPluginDep("java")) { includeJars("java-api", "java-impl") } testImplementation(projectTests(":compiler:tests-common")) testImplementation(projectTests(":idea:idea-test-framework")) testImplementation(projectTests(":idea")) testImplementation(projectTests(":idea:idea-fir")) + testImplementation(projectTests(":plugins:uast-kotlin-base")) // To compare various aspects (e.g., render, log, type, value, etc.) against legacy UAST Kotlin testImplementation(projectTests(":plugins:uast-kotlin")) + + testRuntimeOnly(toolsJar()) } sourceSets { diff --git a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirLegacyUastRenderLogTestBase.kt b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirLegacyUastRenderLogTestBase.kt similarity index 94% rename from plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirLegacyUastRenderLogTestBase.kt rename to plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirLegacyUastRenderLogTestBase.kt index bad2f5eb8ef..67648a12666 100644 --- a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirLegacyUastRenderLogTestBase.kt +++ b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirLegacyUastRenderLogTestBase.kt @@ -3,7 +3,7 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.uast.common.kotlin +package org.jetbrains.uast.test.common.kotlin import java.io.File diff --git a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastCommentLogTestBase.kt b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastCommentLogTestBase.kt similarity index 95% rename from plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastCommentLogTestBase.kt rename to plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastCommentLogTestBase.kt index cd8ca268cdb..d6982ce2af0 100644 --- a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastCommentLogTestBase.kt +++ b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastCommentLogTestBase.kt @@ -3,13 +3,13 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.uast.common.kotlin +package org.jetbrains.uast.test.common.kotlin import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.uast.UComment import org.jetbrains.uast.UFile import org.jetbrains.uast.asRecursiveLogString -import org.jetbrains.uast.common.kotlin.FirUastTestSuffix.TXT +import org.jetbrains.uast.test.common.kotlin.FirUastTestSuffix.TXT import org.jetbrains.uast.kotlin.internal.KotlinUElementWithComments import java.io.File diff --git a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastFileComparisonTestBase.kt b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastFileComparisonTestBase.kt similarity index 97% rename from plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastFileComparisonTestBase.kt rename to plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastFileComparisonTestBase.kt index 7c89663eaee..fa436e2ec5e 100644 --- a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastFileComparisonTestBase.kt +++ b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastFileComparisonTestBase.kt @@ -3,7 +3,7 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.uast.common.kotlin +package org.jetbrains.uast.test.common.kotlin import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.test.KtAssert diff --git a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastPluginSelection.kt b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastPluginSelection.kt similarity index 73% rename from plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastPluginSelection.kt rename to plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastPluginSelection.kt index c179459d672..cd8cb03a2ee 100644 --- a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastPluginSelection.kt +++ b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastPluginSelection.kt @@ -3,10 +3,10 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.uast.common.kotlin +package org.jetbrains.uast.test.common.kotlin -import org.jetbrains.uast.common.kotlin.FirUastTestSuffix.FE10_SUFFIX -import org.jetbrains.uast.common.kotlin.FirUastTestSuffix.FIR_SUFFIX +import org.jetbrains.uast.test.common.kotlin.FirUastTestSuffix.FE10_SUFFIX +import org.jetbrains.uast.test.common.kotlin.FirUastTestSuffix.FIR_SUFFIX interface FirUastPluginSelection { // Whether this is FIR UAST plugin or FE 1.0 UAST plugin diff --git a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastRenderLogTestBase.kt b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastRenderLogTestBase.kt similarity index 94% rename from plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastRenderLogTestBase.kt rename to plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastRenderLogTestBase.kt index b5077bc8da4..0591d863e46 100644 --- a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastRenderLogTestBase.kt +++ b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastRenderLogTestBase.kt @@ -3,12 +3,12 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.uast.common.kotlin +package org.jetbrains.uast.test.common.kotlin import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.uast.UFile import org.jetbrains.uast.asRecursiveLogString -import org.jetbrains.uast.common.kotlin.FirUastTestSuffix.TXT +import org.jetbrains.uast.test.common.kotlin.FirUastTestSuffix.TXT import java.io.File interface FirUastRenderLogTestBase : FirUastPluginSelection, FirUastFileComparisonTestBase { diff --git a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastTestSuffix.kt b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastTestSuffix.kt similarity index 88% rename from plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastTestSuffix.kt rename to plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastTestSuffix.kt index 90408cb613a..f85a26969cd 100644 --- a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/common/kotlin/FirUastTestSuffix.kt +++ b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/common/kotlin/FirUastTestSuffix.kt @@ -3,7 +3,7 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.uast.common.kotlin +package org.jetbrains.uast.test.common.kotlin object FirUastTestSuffix { internal const val FE10_SUFFIX = ".fe10" diff --git a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/env/kotlin/AbstractFirUastTest.kt b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/env/kotlin/AbstractFirUastTest.kt index ec11e2301cd..b3e4fd3c253 100644 --- a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/env/kotlin/AbstractFirUastTest.kt +++ b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/env/kotlin/AbstractFirUastTest.kt @@ -18,11 +18,11 @@ import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.uast.UFile import org.jetbrains.uast.UastFacade import org.jetbrains.uast.UastLanguagePlugin -import org.jetbrains.uast.common.kotlin.FirUastPluginSelection import org.jetbrains.uast.kotlin.BaseKotlinUastResolveProviderService import org.jetbrains.uast.kotlin.FirKotlinUastResolveProviderService import org.jetbrains.uast.kotlin.firKotlinUastPlugin import org.jetbrains.uast.kotlin.internal.FirCliKotlinUastResolveProviderService +import org.jetbrains.uast.test.common.kotlin.FirUastPluginSelection import java.io.File abstract class AbstractFirUastTest : KotlinLightCodeInsightFixtureTestCase(), FirUastPluginSelection { diff --git a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFE1LegacyUastDeclarationTest.kt b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFE1LegacyUastDeclarationTest.kt index 2afccf1e503..1bcedc22cf5 100644 --- a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFE1LegacyUastDeclarationTest.kt +++ b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFE1LegacyUastDeclarationTest.kt @@ -5,6 +5,6 @@ package org.jetbrains.uast.test.kotlin -import org.jetbrains.uast.common.kotlin.FirLegacyUastRenderLogTestBase +import org.jetbrains.uast.test.common.kotlin.FirLegacyUastRenderLogTestBase abstract class AbstractFE1LegacyUastDeclarationTest : AbstractFE1UastDeclarationTest(), FirLegacyUastRenderLogTestBase diff --git a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFE1UastCommentsTest.kt b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFE1UastCommentsTest.kt index 74aa4b63b83..5da5bf3d39c 100644 --- a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFE1UastCommentsTest.kt +++ b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFE1UastCommentsTest.kt @@ -6,7 +6,7 @@ package org.jetbrains.uast.test.kotlin import org.jetbrains.uast.UFile -import org.jetbrains.uast.common.kotlin.FirUastCommentLogTestBase +import org.jetbrains.uast.test.common.kotlin.FirUastCommentLogTestBase import java.io.File abstract class AbstractFE1UastCommentsTest : AbstractKotlinUastTest(), FirUastCommentLogTestBase { diff --git a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFE1UastDeclarationTest.kt b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFE1UastDeclarationTest.kt index 8aab397da1d..a179f5fb6cc 100644 --- a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFE1UastDeclarationTest.kt +++ b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFE1UastDeclarationTest.kt @@ -6,7 +6,7 @@ package org.jetbrains.uast.test.kotlin import org.jetbrains.uast.UFile -import org.jetbrains.uast.common.kotlin.FirUastRenderLogTestBase +import org.jetbrains.uast.test.common.kotlin.FirUastRenderLogTestBase import java.io.File abstract class AbstractFE1UastDeclarationTest : AbstractKotlinUastTest(), FirUastRenderLogTestBase { diff --git a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFirLegacyUastDeclarationTest.kt b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFirLegacyUastDeclarationTest.kt index 49df4683c24..c9e30fe2523 100644 --- a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFirLegacyUastDeclarationTest.kt +++ b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFirLegacyUastDeclarationTest.kt @@ -5,6 +5,6 @@ package org.jetbrains.uast.test.kotlin -import org.jetbrains.uast.common.kotlin.FirLegacyUastRenderLogTestBase +import org.jetbrains.uast.test.common.kotlin.FirLegacyUastRenderLogTestBase abstract class AbstractFirLegacyUastDeclarationTest : AbstractFirUastDeclarationTest(), FirLegacyUastRenderLogTestBase diff --git a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFirUastCommentsTest.kt b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFirUastCommentsTest.kt index 98e716862e0..f50aeb3525b 100644 --- a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFirUastCommentsTest.kt +++ b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFirUastCommentsTest.kt @@ -6,7 +6,7 @@ package org.jetbrains.uast.test.kotlin import org.jetbrains.uast.UFile -import org.jetbrains.uast.common.kotlin.FirUastCommentLogTestBase +import org.jetbrains.uast.test.common.kotlin.FirUastCommentLogTestBase import org.jetbrains.uast.test.env.kotlin.AbstractFirUastTest abstract class AbstractFirUastCommentsTest : AbstractFirUastTest(), FirUastCommentLogTestBase { diff --git a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFirUastDeclarationTest.kt b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFirUastDeclarationTest.kt index 66f4e84abc8..3bc8a5ab120 100644 --- a/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFirUastDeclarationTest.kt +++ b/plugins/uast-kotlin-fir/tests/org/jetbrains/uast/test/kotlin/AbstractFirUastDeclarationTest.kt @@ -6,7 +6,7 @@ package org.jetbrains.uast.test.kotlin import org.jetbrains.uast.UFile -import org.jetbrains.uast.common.kotlin.FirUastRenderLogTestBase +import org.jetbrains.uast.test.common.kotlin.FirUastRenderLogTestBase import org.jetbrains.uast.test.env.kotlin.AbstractFirUastTest abstract class AbstractFirUastDeclarationTest : AbstractFirUastTest(), FirUastRenderLogTestBase { diff --git a/plugins/uast-kotlin/build.gradle.kts b/plugins/uast-kotlin/build.gradle.kts index 9e6f67cb3ac..674f364e807 100644 --- a/plugins/uast-kotlin/build.gradle.kts +++ b/plugins/uast-kotlin/build.gradle.kts @@ -44,6 +44,7 @@ dependencies { testCompile(project(":compiler:util")) testCompile(project(":compiler:cli")) testCompile(projectTests(":idea:idea-test-framework")) + testCompile(projectTests(":plugins:uast-kotlin-base")) testCompile(project(":idea:idea-native")) { isTransitive = false } testCompile(project(":idea:idea-gradle-native")) { isTransitive = false } diff --git a/plugins/uast-kotlin/tests/AbstractKotlinIdentifiersTest.kt b/plugins/uast-kotlin/tests/AbstractKotlinIdentifiersTest.kt index 7c34fe83fac..700a883b983 100644 --- a/plugins/uast-kotlin/tests/AbstractKotlinIdentifiersTest.kt +++ b/plugins/uast-kotlin/tests/AbstractKotlinIdentifiersTest.kt @@ -1,14 +1,14 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ 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.UFile import org.jetbrains.uast.test.common.kotlin.IdentifiersTestBase -import org.jetbrains.uast.test.common.visitUFileAndGetResult +import org.jetbrains.uast.test.common.kotlin.asRefNames import org.jetbrains.uast.test.env.kotlin.assertEqualsToFile import java.io.File -import kotlin.test.assertNotNull - abstract class AbstractKotlinIdentifiersTest : AbstractKotlinUastTest(), IdentifiersTestBase { @@ -22,16 +22,3 @@ abstract class AbstractKotlinIdentifiersTest : AbstractKotlinUastTest(), Identif 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) diff --git a/plugins/uast-kotlin/tests/AbstractKotlinResolveEverythingTest.kt b/plugins/uast-kotlin/tests/AbstractKotlinResolveEverythingTest.kt index dc4d1b1aabd..8f3b757eae4 100644 --- a/plugins/uast-kotlin/tests/AbstractKotlinResolveEverythingTest.kt +++ b/plugins/uast-kotlin/tests/AbstractKotlinResolveEverythingTest.kt @@ -11,17 +11,14 @@ import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.uast.* import org.jetbrains.uast.test.common.kotlin.IndentedPrintingVisitor -import org.jetbrains.uast.test.common.kotlin.visitUFileAndGetResult import org.jetbrains.uast.test.env.kotlin.assertEqualsToFile import java.io.File - abstract class AbstractKotlinResolveEverythingTest : AbstractKotlinUastTest() { private fun getTestFile(testName: String, ext: String) = File(File(TEST_KOTLIN_MODEL_DIR, testName).canonicalPath + '.' + ext) - private fun UFile.resolvableWithTargets() = object : IndentedPrintingVisitor(KtBlockExpression::class) { override fun render(element: PsiElement) = UastFacade.convertToAlternatives(element, arrayOf(UReferenceExpression::class.java, UCallExpression::class.java)) @@ -57,4 +54,4 @@ abstract class AbstractKotlinResolveEverythingTest : AbstractKotlinUastTest() { override fun check(testName: String, file: UFile) { assertEqualsToFile("resolved", getTestFile(testName, "resolved.txt"), file.resolvableWithTargets()) } -} \ No newline at end of file +} diff --git a/plugins/uast-kotlin/tests/org/jetbrains/uast/test/common/kotlin/IdentifiersTestBase.kt b/plugins/uast-kotlin/tests/org/jetbrains/uast/test/common/kotlin/IdentifiersTestBase.kt index 21d6d7f7311..52159aab81c 100644 --- a/plugins/uast-kotlin/tests/org/jetbrains/uast/test/common/kotlin/IdentifiersTestBase.kt +++ b/plugins/uast-kotlin/tests/org/jetbrains/uast/test/common/kotlin/IdentifiersTestBase.kt @@ -5,67 +5,13 @@ package org.jetbrains.uast.test.common.kotlin -import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.psi.KtBlockExpression -import org.jetbrains.uast.* +import org.jetbrains.uast.UFile import org.jetbrains.uast.test.env.kotlin.assertEqualsToFile -import org.jetbrains.uast.visitor.AbstractUastVisitor -import org.junit.ComparisonFailure import java.io.File -import kotlin.test.fail interface IdentifiersTestBase { fun getIdentifiersFile(testName: String): File - private fun UFile.asIdentifiersWithParents() = object : IndentedPrintingVisitor(KtBlockExpression::class) { - override fun render(element: PsiElement): CharSequence? = element.toUElementOfType()?.let { uIdentifier -> - StringBuilder().apply { - append(uIdentifier.sourcePsiElement!!.text) - append(" -> ") - append(uIdentifier.uastParent?.asLogString()) - } - } - }.visitUFileAndGetResult(this) - - private fun UFile.testIdentifiersParents() { - accept(object : AbstractUastVisitor() { - override fun visitElement(node: UElement): Boolean { - val uIdentifier = when (node) { - is UAnchorOwner -> node.uastAnchor ?: return false - is UBinaryExpression -> node.operatorIdentifier ?: return false - else -> return false - } - - assertParents(node, uIdentifier) - val identifierSourcePsi = uIdentifier.sourcePsi ?: return false - val operatorIdentifierFromSource = identifierSourcePsi.toUElementOfType() - ?: fail("$identifierSourcePsi of ${identifierSourcePsi.javaClass} should be convertable to UIdentifier") - assertParents(node, operatorIdentifierFromSource) - - return false - } - }) - } - - fun assertParents(node: UElement, uastAnchor: UIdentifier?) { - //skipping such elements because they are ambiguous (properties and getters for instance) - if (node.sourcePsi.toUElement() != node) return - if (uastAnchor == null) - throw AssertionError("no uast anchor for node = $node") - val nodeParents = node.withContainingElements.log() - val anchorParentParents = uastAnchor.uastParent?.withContainingElements?.log() ?: "" - // dropping node itself because we allow children to share identifiers with parents (primary constructor for instance) - val parentsSuffix = node.withContainingElements.drop(1).log() - if (!anchorParentParents.endsWith(parentsSuffix)) - throw ComparisonFailure( - "wrong parents for '${uastAnchor.sourcePsi?.text}' owner: $node[${node.sourcePsi}[${node.sourcePsi?.text}]]", - nodeParents, - anchorParentParents - ) - } - - private fun Sequence.log() = this.joinToString { it.asLogString() } - fun check(testName: String, file: UFile) { val valuesFile = getIdentifiersFile(testName)