From 693f04cd278ec38edc22bf26fc0447730fbe553b Mon Sep 17 00:00:00 2001 From: Vlad Koshkin Date: Wed, 18 Jun 2025 00:08:40 +0000 Subject: [PATCH] [kotlin] K2: add test for navigation to .settings gradle convention plugin #KTIJ-34533 Fixed Merge-request: IJ-MR-165495 Merged-by: Vlad Koshkin GitOrigin-RevId: f5ca4c087f3491901a97aa273f37b090d6ba7023 --- .../service/resolve/GradlePluginReference.kt | 29 ++- .../gradle/K1GradleNavigationTest.kt | 4 +- ...otlinGradleCompositeBuildFindUsagesTest.kt | 69 ++++++- .../K2GradleHighlightingTest.kt | 4 +- .../K2GradleBuildLogicPluginNavigationTest.kt | 67 +++++++ .../K2GradleNavigationTest.kt | 8 +- .../AbstractKotlinGradleNavigationTest.kt | 178 ++++-------------- .../gradle/KotlinGradleGotoDeclarationTest.kt | 174 +++++++++++++++++ ...ToSettingsPluginFromSettingsGradleKts.test | 8 + ...ngsPluginNotWorkingFromBuildGradleKts.test | 8 + 10 files changed, 385 insertions(+), 164 deletions(-) rename plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/{ => highlighting}/K2GradleHighlightingTest.kt (78%) create mode 100644 plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/navigation/K2GradleBuildLogicPluginNavigationTest.kt rename plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/{ => navigation}/K2GradleNavigationTest.kt (56%) create mode 100644 plugins/kotlin/gradle/gradle-java/tests.shared/test/org/jetbrains/kotlin/gradle/KotlinGradleGotoDeclarationTest.kt create mode 100644 plugins/kotlin/idea/tests/testData/gradle/navigation/composite/testNavigationToSettingsPluginFromSettingsGradleKts.test create mode 100644 plugins/kotlin/idea/tests/testData/gradle/navigation/composite/testNavigationToSettingsPluginNotWorkingFromBuildGradleKts.test diff --git a/plugins/gradle/java/src/service/resolve/GradlePluginReference.kt b/plugins/gradle/java/src/service/resolve/GradlePluginReference.kt index 9dab13925604..bc95b80977ac 100644 --- a/plugins/gradle/java/src/service/resolve/GradlePluginReference.kt +++ b/plugins/gradle/java/src/service/resolve/GradlePluginReference.kt @@ -21,7 +21,7 @@ import org.jetbrains.annotations.ApiStatus.Internal class GradlePluginReference( private val myElement: PsiElement, private val myRange: TextRange, - private val pluginId: String + private val pluginId: String, ) : SingleTargetReference(), PsiCompletableReference { override fun getElement(): PsiElement = myElement @@ -30,7 +30,7 @@ class GradlePluginReference( override fun resolveSingleTarget(): Symbol? { val searchScope = GlobalSearchScope.projectScope(myElement.project) val pluginFile = findPrecompiledGroovyPlugin(searchScope) - ?: findPrecompiledKotlinPlugin(searchScope) + ?: findPrecompiledKotlinPlugin(searchScope, myElement.containingFile.name) ?: return null return GradlePluginSymbol(pluginFile.path, pluginId) } @@ -43,14 +43,15 @@ class GradlePluginReference( * Precompiled script plugins on Kotlin could have a package declaration. If plugin ID ([pluginId]) contains dots, * probably they split file name and packages (directories, containing a file with plugin). */ - private fun findPrecompiledKotlinPlugin(searchScope: GlobalSearchScope): VirtualFile? { + private fun findPrecompiledKotlinPlugin(searchScope: GlobalSearchScope, sourceFileName: String): VirtualFile? { val leftParts = pluginId.split(".").toMutableList() var fileName = "" var lastPart = leftParts.removeLastOrNull() while (lastPart != null) { if (fileName.isEmpty()) { - fileName = "${lastPart}${pluginId.fileExtension}" - } else { + fileName = "${lastPart}${getFileExtension(pluginId, sourceFileName)}" + } + else { fileName = "$lastPart.$fileName" } val file = findPrecompiledPlugin(fileName, searchScope, packageParts = leftParts) @@ -61,14 +62,24 @@ class GradlePluginReference( } return null } - - private val String.fileExtension: String - get() = if (this.endsWith(".settings")) ".settings.gradle.kts" else ".gradle.kts" + + /* + Return build logic plugin file extension according to pluginId and the file you navigating from. + You can navigate to .settings plugin only from 'settings.gradle.kts' or 'custom.settings.gradle.kts'. + */ + private fun getFileExtension(pluginId: String, sourceFileName: String): String = + if (pluginId.endsWith(".settings") + && (sourceFileName == "settings.gradle.kts" || sourceFileName.endsWith(".settings.gradle.kts"))) { + ".settings.gradle.kts" + } + else { + ".gradle.kts" + } private fun findPrecompiledPlugin( fileName: String, searchScope: GlobalSearchScope, - packageParts: List = emptyList() + packageParts: List = emptyList(), ): VirtualFile? { val files = FilenameIndex.getVirtualFilesByName(fileName, searchScope) for (file in files) { diff --git a/plugins/kotlin/gradle/gradle-java/k1/test/org/jetbrains/kotlin/idea/codeInsight/gradle/K1GradleNavigationTest.kt b/plugins/kotlin/gradle/gradle-java/k1/test/org/jetbrains/kotlin/idea/codeInsight/gradle/K1GradleNavigationTest.kt index c8075b16578a..514ad2f33634 100644 --- a/plugins/kotlin/gradle/gradle-java/k1/test/org/jetbrains/kotlin/idea/codeInsight/gradle/K1GradleNavigationTest.kt +++ b/plugins/kotlin/gradle/gradle-java/k1/test/org/jetbrains/kotlin/idea/codeInsight/gradle/K1GradleNavigationTest.kt @@ -1,7 +1,7 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.codeInsight.gradle -import org.jetbrains.kotlin.gradle.AbstractKotlinGradleNavigationTest +import org.jetbrains.kotlin.gradle.KotlinGradleGotoDeclarationTest import org.jetbrains.kotlin.idea.test.AssertKotlinPluginMode import org.jetbrains.kotlin.idea.test.UseK1PluginMode import org.jetbrains.plugins.gradle.testFramework.fixtures.application.GradleProjectTestApplication @@ -9,4 +9,4 @@ import org.jetbrains.plugins.gradle.testFramework.fixtures.application.GradlePro @UseK1PluginMode @GradleProjectTestApplication @AssertKotlinPluginMode -class K1GradleNavigationTest : AbstractKotlinGradleNavigationTest() \ No newline at end of file +class K1GradleNavigationTest : KotlinGradleGotoDeclarationTest() \ No newline at end of file diff --git a/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/KotlinGradleCompositeBuildFindUsagesTest.kt b/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/KotlinGradleCompositeBuildFindUsagesTest.kt index 2eee90cfc1cb..3bf8b49ab6c0 100644 --- a/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/KotlinGradleCompositeBuildFindUsagesTest.kt +++ b/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/KotlinGradleCompositeBuildFindUsagesTest.kt @@ -4,13 +4,16 @@ package org.jetbrains.kotlin.idea.k2.codeInsight.gradle import com.intellij.testFramework.TestDataPath import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.AbstractGradleCodeInsightTest -import org.jetbrains.kotlin.gradle.AbstractKotlinGradleNavigationTest.Companion.GRADLE_COMPOSITE_BUILD_FIXTURE import org.jetbrains.kotlin.idea.base.test.TestRoot import org.jetbrains.kotlin.idea.test.AssertKotlinPluginMode import org.jetbrains.kotlin.idea.test.UseK2PluginMode import org.jetbrains.kotlin.test.TestMetadata +import org.jetbrains.plugins.gradle.frameworkSupport.GradleDsl +import org.jetbrains.plugins.gradle.testFramework.GradleTestFixtureBuilder import org.jetbrains.plugins.gradle.testFramework.annotations.BaseGradleVersionSource import org.jetbrains.plugins.gradle.testFramework.fixtures.application.GradleProjectTestApplication +import org.jetbrains.plugins.gradle.testFramework.util.withBuildFile +import org.jetbrains.plugins.gradle.testFramework.util.withSettingsFile import org.junit.jupiter.params.ParameterizedTest @UseK2PluginMode @@ -26,4 +29,68 @@ class KotlinGradleCompositeBuildFindUsagesTest : AbstractGradleCodeInsightTest() fun testPropertyFromCustomPluginUsageInBuildGradleKts(gradleVersion: GradleVersion) { verifyFindUsages(gradleVersion, GRADLE_COMPOSITE_BUILD_FIXTURE) } + + companion object { + val GRADLE_COMPOSITE_BUILD_FIXTURE: GradleTestFixtureBuilder = + GradleTestFixtureBuilder.create("GradleKotlinFixture") { gradleVersion -> + withSettingsFile(gradleVersion, gradleDsl = GradleDsl.KOTLIN) { + setProjectName("GradleKotlinFixture") + includeBuild("not-build-src") + } + withBuildFile(gradleVersion, gradleDsl = GradleDsl.KOTLIN) { + withPlugin("some-custom-plugin") + } + withFile( + "not-build-src/src/main/kotlin/utils.kt", + """ + import org.gradle.api.Plugin + import org.gradle.api.Project + + class SomeCustomPlugin: Plugin { + override fun apply(target: Project) { + // no-op + } + } + + const val kotlinStdLib = "..." + """.trimIndent() + ) + withSettingsFile(gradleVersion, "not-build-src", gradleDsl = GradleDsl.KOTLIN) { + addCode( + """ + pluginManagement { + repositories { + gradlePluginPortal() + } + } + """.trimIndent() + ) + } + withBuildFile(gradleVersion, "not-build-src", gradleDsl = GradleDsl.KOTLIN) { + withPrefix { + code( + """ + plugins { + id("java-gradle-plugin") + `kotlin-dsl` + } + """.trimIndent() + ) + } + withMavenCentral() + withPostfix { + code( + """ + gradlePlugin { + plugins.register("some-custom-plugin") { + id = "some-custom-plugin" + implementationClass = "SomeCustomPlugin" + } + } + """.trimIndent() + ) + } + } + } + } } diff --git a/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/K2GradleHighlightingTest.kt b/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/highlighting/K2GradleHighlightingTest.kt similarity index 78% rename from plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/K2GradleHighlightingTest.kt rename to plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/highlighting/K2GradleHighlightingTest.kt index 5ef2392ddede..62034ccc0ecc 100644 --- a/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/K2GradleHighlightingTest.kt +++ b/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/highlighting/K2GradleHighlightingTest.kt @@ -1,5 +1,5 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package org.jetbrains.kotlin.idea.k2.codeInsight.gradle +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.idea.k2.codeInsight.gradle.highlighting import org.jetbrains.kotlin.gradle.AbstractKotlinGradleHighlightingTest import org.jetbrains.kotlin.idea.test.AssertKotlinPluginMode diff --git a/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/navigation/K2GradleBuildLogicPluginNavigationTest.kt b/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/navigation/K2GradleBuildLogicPluginNavigationTest.kt new file mode 100644 index 000000000000..1f698b7d613f --- /dev/null +++ b/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/navigation/K2GradleBuildLogicPluginNavigationTest.kt @@ -0,0 +1,67 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.idea.k2.codeInsight.gradle.navigation + +import com.intellij.testFramework.TestDataPath +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.AbstractKotlinGradleNavigationTest +import org.jetbrains.kotlin.idea.base.test.TestRoot +import org.jetbrains.kotlin.idea.test.AssertKotlinPluginMode +import org.jetbrains.kotlin.idea.test.UseK2PluginMode +import org.jetbrains.kotlin.test.TestMetadata +import org.jetbrains.plugins.gradle.frameworkSupport.GradleDsl +import org.jetbrains.plugins.gradle.testFramework.GradleTestFixtureBuilder +import org.jetbrains.plugins.gradle.testFramework.annotations.BaseGradleVersionSource +import org.jetbrains.plugins.gradle.testFramework.fixtures.application.GradleProjectTestApplication +import org.jetbrains.plugins.gradle.testFramework.util.withBuildFile +import org.jetbrains.plugins.gradle.testFramework.util.withSettingsFile +import org.junit.jupiter.params.ParameterizedTest + +@UseK2PluginMode +@GradleProjectTestApplication +@AssertKotlinPluginMode +@TestRoot("idea/tests/testData/") +@TestDataPath("\$CONTENT_ROOT") +@TestMetadata("../../../idea/tests/testData/gradle/navigation/composite") +class K2GradleBuildLogicPluginNavigationTest : AbstractKotlinGradleNavigationTest() { + @ParameterizedTest + @BaseGradleVersionSource + @TestMetadata("testNavigationToSettingsPluginFromSettingsGradleKts.test") + fun testNavigationToSettingsPluginFromSettingsGradleKts(gradleVersion: GradleVersion) { + verifyNavigationFromCaretToExpected(gradleVersion) + } + + @ParameterizedTest + @BaseGradleVersionSource + @TestMetadata("testNavigationToSettingsPluginNotWorkingFromBuildGradleKts.test") + fun testNavigationToSettingsPluginNotWorkingFromBuildLogicGradleKts(gradleVersion: GradleVersion) { + verifyFileShouldStayTheSame(gradleVersion) + } + + override val myFixture = FIXTURE_WITH_SETTINGS_PLUGIN + + companion object { + private val FIXTURE_WITH_SETTINGS_PLUGIN: GradleTestFixtureBuilder = + GradleTestFixtureBuilder.create("GradleKotlinFixture") { gradleVersion -> + withSettingsFile(gradleVersion, gradleDsl = GradleDsl.KOTLIN) { + setProjectName("GradleKotlinFixture") + } + withBuildFile(gradleVersion, gradleDsl = GradleDsl.KOTLIN) { + """ + plugins { + `kotlin-dsl` + } + """.trimIndent() + } + + withSettingsFile(gradleVersion, "custom", gradleDsl = GradleDsl.KOTLIN) {} + withBuildFile(gradleVersion, "custom", gradleDsl = GradleDsl.KOTLIN) { + """ + plugins { + `kotlin-dsl` + } + """.trimIndent() + } + withFile("custom/src/main/kotlin/custom.settings.settings.gradle.kts", "") + } + } +} \ No newline at end of file diff --git a/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/K2GradleNavigationTest.kt b/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/navigation/K2GradleNavigationTest.kt similarity index 56% rename from plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/K2GradleNavigationTest.kt rename to plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/navigation/K2GradleNavigationTest.kt index 4f9383ad93dd..0248f6c045aa 100644 --- a/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/K2GradleNavigationTest.kt +++ b/plugins/kotlin/gradle/gradle-java/k2/test/org/jetbrains/kotlin/idea/k2/codeInsight/gradle/navigation/K2GradleNavigationTest.kt @@ -1,7 +1,7 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package org.jetbrains.kotlin.idea.k2.codeInsight.gradle +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.idea.k2.codeInsight.gradle.navigation -import org.jetbrains.kotlin.gradle.AbstractKotlinGradleNavigationTest +import org.jetbrains.kotlin.gradle.KotlinGradleGotoDeclarationTest import org.jetbrains.kotlin.idea.test.AssertKotlinPluginMode import org.jetbrains.kotlin.idea.test.UseK2PluginMode import org.jetbrains.plugins.gradle.testFramework.fixtures.application.GradleProjectTestApplication @@ -9,4 +9,4 @@ import org.jetbrains.plugins.gradle.testFramework.fixtures.application.GradlePro @UseK2PluginMode @GradleProjectTestApplication @AssertKotlinPluginMode -class K2GradleNavigationTest : AbstractKotlinGradleNavigationTest() \ No newline at end of file +class K2GradleNavigationTest : KotlinGradleGotoDeclarationTest() \ No newline at end of file diff --git a/plugins/kotlin/gradle/gradle-java/tests.shared/test/org/jetbrains/kotlin/gradle/AbstractKotlinGradleNavigationTest.kt b/plugins/kotlin/gradle/gradle-java/tests.shared/test/org/jetbrains/kotlin/gradle/AbstractKotlinGradleNavigationTest.kt index b4efd1175bdd..6e1a76cce235 100644 --- a/plugins/kotlin/gradle/gradle-java/tests.shared/test/org/jetbrains/kotlin/gradle/AbstractKotlinGradleNavigationTest.kt +++ b/plugins/kotlin/gradle/gradle-java/tests.shared/test/org/jetbrains/kotlin/gradle/AbstractKotlinGradleNavigationTest.kt @@ -3,117 +3,35 @@ package org.jetbrains.kotlin.gradle import com.intellij.openapi.actionSystem.IdeActions import com.intellij.openapi.application.runReadAction -import com.intellij.testFramework.TestDataPath import org.gradle.util.GradleVersion import org.jetbrains.kotlin.idea.base.plugin.useK2Plugin import org.jetbrains.kotlin.idea.base.test.IgnoreTests -import org.jetbrains.kotlin.idea.base.test.TestRoot import org.jetbrains.kotlin.test.InTextDirectivesUtils -import org.jetbrains.kotlin.test.TestMetadata import org.jetbrains.plugins.gradle.frameworkSupport.GradleDsl import org.jetbrains.plugins.gradle.settings.GradleSystemSettings import org.jetbrains.plugins.gradle.testFramework.GradleTestFixtureBuilder -import org.jetbrains.plugins.gradle.testFramework.annotations.BaseGradleVersionSource import org.jetbrains.plugins.gradle.testFramework.util.withBuildFile import org.jetbrains.plugins.gradle.testFramework.util.withSettingsFile -import org.junit.jupiter.params.ParameterizedTest +import kotlin.test.assertEquals import kotlin.test.assertTrue private const val EXPECTED_NAVIGATION_DIRECTIVE = "EXPECTED-NAVIGATION-SUBSTRING" -@TestRoot("idea/tests/testData/") -@TestDataPath("\$CONTENT_ROOT") -@TestMetadata("../../../idea/tests/testData/gradle/navigation/") abstract class AbstractKotlinGradleNavigationTest : AbstractGradleCodeInsightTest() { - private val actionName: String get() = IdeActions.ACTION_GOTO_DECLARATION - @ParameterizedTest - @BaseGradleVersionSource - @TestMetadata("projectDependency.test") - fun testProjectDependency(gradleVersion: GradleVersion) { - verifyNavigationFromCaretToExpected(gradleVersion) - } + abstract val myFixture: GradleTestFixtureBuilder - @ParameterizedTest - @BaseGradleVersionSource - @TestMetadata("projectKmpDependency.test") - fun testProjectKmpDependency(gradleVersion: GradleVersion) { - verifyNavigationFromCaretToExpected(gradleVersion) - } - - @ParameterizedTest - @BaseGradleVersionSource - @TestMetadata("projectAccessorSimpleModule.test") - fun testProjectAccessorSimpleModule(gradleVersion: GradleVersion) { - verifyNavigationFromCaretToExpected(gradleVersion) - } - - @ParameterizedTest - @BaseGradleVersionSource - @TestMetadata("projectAccessorSubSubModule.test") - fun testProjectAccessorSubSubModule(gradleVersion: GradleVersion) { - verifyNavigationFromCaretToExpected(gradleVersion) - } - - @ParameterizedTest - @BaseGradleVersionSource - @TestMetadata("projectFullAccessorSubSubModule.test") - fun testProjectFullAccessorSubSubModule(gradleVersion: GradleVersion) { - verifyNavigationFromCaretToExpected(gradleVersion) - } - - @ParameterizedTest - @BaseGradleVersionSource - @TestMetadata("projectAccessorSubModuleInTheMiddle.test") - fun testProjectAccessorSubModuleInTheMiddle(gradleVersion: GradleVersion) { - verifyNavigationFromCaretToExpected(gradleVersion) - } - - @ParameterizedTest - @BaseGradleVersionSource - @TestMetadata("librarySourceDependency.test") - fun testLibrarySourceDependency(gradleVersion: GradleVersion) { - verifyNavigationFromCaretToExpected(gradleVersion) - } - - @ParameterizedTest - @BaseGradleVersionSource - @TestMetadata("pluginPrecompiled/inGroovy.test") - fun testPluginPrecompiledInGroovy(gradleVersion: GradleVersion) { - verifyNavigationFromCaretToExpected(gradleVersion) - } - - @ParameterizedTest - @BaseGradleVersionSource - @TestMetadata("pluginPrecompiled/inKotlin.test") - fun testPluginPrecompiledInKotlin(gradleVersion: GradleVersion) { - verifyNavigationFromCaretToExpected(gradleVersion) - } - - @ParameterizedTest - @BaseGradleVersionSource - @TestMetadata("pluginPrecompiled/inKotlinWithPackage.test") - fun testPluginPrecompiledInKotlinWithPackage(gradleVersion: GradleVersion) { - verifyNavigationFromCaretToExpected(gradleVersion) - } - - @ParameterizedTest - @BaseGradleVersionSource - @TestMetadata("pluginPrecompiled/inKotlinLocatedInJavaDir.test") - fun testPluginPrecompiledInKotlinLocatedInJavaDir(gradleVersion: GradleVersion) { - verifyNavigationFromCaretToExpected(gradleVersion) - } - - private fun verifyNavigationFromCaretToExpected(gradleVersion: GradleVersion) { + protected fun verifyNavigationFromCaretToExpected(gradleVersion: GradleVersion) { val systemSettings = GradleSystemSettings.getInstance() systemSettings.isDownloadSources = true - test(gradleVersion, GRADLE_KMP_KOTLIN_FIXTURE) { + test(gradleVersion, myFixture) { val mainFileContent = mainTestDataFile val mainFile = mainTestDataPsiFile val expectedNavigationText = - InTextDirectivesUtils.findStringWithPrefixes(mainFileContent.content, "// \"$EXPECTED_NAVIGATION_DIRECTIVE\": ") ?: error("$EXPECTED_NAVIGATION_DIRECTIVE is not specified") + InTextDirectivesUtils.findStringWithPrefixes(mainFileContent.content, "// \"$EXPECTED_NAVIGATION_DIRECTIVE\": ") + ?: error("$EXPECTED_NAVIGATION_DIRECTIVE is not specified") codeInsightFixture.configureFromExistingVirtualFile(mainFile.virtualFile) assertTrue(" is not present") { @@ -134,61 +52,33 @@ abstract class AbstractKotlinGradleNavigationTest : AbstractGradleCodeInsightTes } } - companion object { - val GRADLE_COMPOSITE_BUILD_FIXTURE: GradleTestFixtureBuilder = GradleTestFixtureBuilder.create("GradleKotlinFixture") { gradleVersion -> - withSettingsFile(gradleVersion, gradleDsl = GradleDsl.KOTLIN) { - setProjectName("GradleKotlinFixture") - includeBuild("not-build-src") - } - withBuildFile(gradleVersion, gradleDsl = GradleDsl.KOTLIN) { - withPlugin("some-custom-plugin") - } - withFile( - "not-build-src/src/main/kotlin/utils.kt", - """ - import org.gradle.api.Plugin - import org.gradle.api.Project + protected fun verifyFileShouldStayTheSame(gradleVersion: GradleVersion, fixture: GradleTestFixtureBuilder = myFixture) { + val systemSettings = GradleSystemSettings.getInstance() + systemSettings.isDownloadSources = true - class SomeCustomPlugin: Plugin { - override fun apply(target: Project) { - // no-op - } - } + test(gradleVersion, fixture) { + val mainFile = mainTestDataPsiFile - const val kotlinStdLib = "..." - """.trimIndent() - ) - withSettingsFile(gradleVersion, "not-build-src", gradleDsl = GradleDsl.KOTLIN) { - addCode(""" - pluginManagement { - repositories { - gradlePluginPortal() - } - } - """.trimIndent()) + codeInsightFixture.configureFromExistingVirtualFile(mainFile.virtualFile) + + val textBefore = document.text + assertTrue(" is not present") { + val caretOffset = runReadAction { codeInsightFixture.caretOffset } + caretOffset != 0 } - withBuildFile(gradleVersion, "not-build-src", gradleDsl = GradleDsl.KOTLIN) { - withPrefix { - code(""" - plugins { - id("java-gradle-plugin") - `kotlin-dsl` - } - """.trimIndent()) - } - withMavenCentral() - withPostfix { - code(""" - gradlePlugin { - plugins.register("some-custom-plugin") { - id = "some-custom-plugin" - implementationClass = "SomeCustomPlugin" - } - } - """.trimIndent()) - } + codeInsightFixture.performEditorAction(actionName) + + val textAfter = document.text + IgnoreTests.runTestIfNotDisabledByFileDirective( + mainFile.virtualFile.toNioPath(), + if (useK2Plugin == true) IgnoreTests.DIRECTIVES.IGNORE_K2 else IgnoreTests.DIRECTIVES.IGNORE_K1 + ) { + assertEquals(textBefore, textAfter, "Navigation should not work") } } + } + + companion object { val GRADLE_KMP_KOTLIN_FIXTURE: GradleTestFixtureBuilder = GradleTestFixtureBuilder.create("GradleKotlinFixture") { gradleVersion -> withSettingsFile(gradleVersion, gradleDsl = GradleDsl.KOTLIN) { setProjectName("GradleKotlinFixture") @@ -215,8 +105,7 @@ abstract class AbstractKotlinGradleNavigationTest : AbstractGradleCodeInsightTes withMavenCentral() } withFile( - "gradle/libs.versions.toml", - /* language=TOML */ + "gradle/libs.versions.toml",/* language=TOML */ """ [libraries] some_test-library = { module = "org.junit.jupiter:junit-jupiter" } @@ -228,14 +117,12 @@ abstract class AbstractKotlinGradleNavigationTest : AbstractGradleCodeInsightTes """.trimIndent() ) withFile( - "gradle.properties", - """ + "gradle.properties", """ kotlin.code.style=official """.trimIndent() ) withFile( - "buildSrc/src/main/kotlin/MyTask.kt", - """ + "buildSrc/src/main/kotlin/MyTask.kt", """ """.trimIndent() ) @@ -257,8 +144,7 @@ abstract class AbstractKotlinGradleNavigationTest : AbstractGradleCodeInsightTes withMavenCentral() } withFile( - "gradle.properties", - """ + "gradle.properties", """ kotlin.code.style=official """.trimIndent() ) diff --git a/plugins/kotlin/gradle/gradle-java/tests.shared/test/org/jetbrains/kotlin/gradle/KotlinGradleGotoDeclarationTest.kt b/plugins/kotlin/gradle/gradle-java/tests.shared/test/org/jetbrains/kotlin/gradle/KotlinGradleGotoDeclarationTest.kt new file mode 100644 index 000000000000..d03edc68e793 --- /dev/null +++ b/plugins/kotlin/gradle/gradle-java/tests.shared/test/org/jetbrains/kotlin/gradle/KotlinGradleGotoDeclarationTest.kt @@ -0,0 +1,174 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.gradle + +import com.intellij.testFramework.TestDataPath +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.idea.base.test.TestRoot +import org.jetbrains.kotlin.test.TestMetadata +import org.jetbrains.plugins.gradle.frameworkSupport.GradleDsl +import org.jetbrains.plugins.gradle.testFramework.GradleTestFixtureBuilder +import org.jetbrains.plugins.gradle.testFramework.annotations.BaseGradleVersionSource +import org.jetbrains.plugins.gradle.testFramework.util.withBuildFile +import org.jetbrains.plugins.gradle.testFramework.util.withSettingsFile +import org.junit.jupiter.params.ParameterizedTest + +@TestRoot("idea/tests/testData/") +@TestDataPath("\$CONTENT_ROOT") +@TestMetadata("../../../idea/tests/testData/gradle/navigation/") +abstract class KotlinGradleGotoDeclarationTest : AbstractKotlinGradleNavigationTest() { + @ParameterizedTest + @BaseGradleVersionSource + @TestMetadata("projectDependency.test") + fun testProjectDependency(gradleVersion: GradleVersion) { + verifyNavigationFromCaretToExpected(gradleVersion) + } + + @ParameterizedTest + @BaseGradleVersionSource + @TestMetadata("projectKmpDependency.test") + fun testProjectKmpDependency(gradleVersion: GradleVersion) { + verifyNavigationFromCaretToExpected(gradleVersion) + } + + @ParameterizedTest + @BaseGradleVersionSource + @TestMetadata("projectAccessorSimpleModule.test") + fun testProjectAccessorSimpleModule(gradleVersion: GradleVersion) { + verifyNavigationFromCaretToExpected(gradleVersion) + } + + @ParameterizedTest + @BaseGradleVersionSource + @TestMetadata("projectAccessorSubSubModule.test") + fun testProjectAccessorSubSubModule(gradleVersion: GradleVersion) { + verifyNavigationFromCaretToExpected(gradleVersion) + } + + @ParameterizedTest + @BaseGradleVersionSource + @TestMetadata("projectFullAccessorSubSubModule.test") + fun testProjectFullAccessorSubSubModule(gradleVersion: GradleVersion) { + verifyNavigationFromCaretToExpected(gradleVersion) + } + + @ParameterizedTest + @BaseGradleVersionSource + @TestMetadata("projectAccessorSubModuleInTheMiddle.test") + fun testProjectAccessorSubModuleInTheMiddle(gradleVersion: GradleVersion) { + verifyNavigationFromCaretToExpected(gradleVersion) + } + + @ParameterizedTest + @BaseGradleVersionSource + @TestMetadata("librarySourceDependency.test") + fun testLibrarySourceDependency(gradleVersion: GradleVersion) { + verifyNavigationFromCaretToExpected(gradleVersion) + } + + @ParameterizedTest + @BaseGradleVersionSource + @TestMetadata("pluginPrecompiled/inGroovy.test") + fun testPluginPrecompiledInGroovy(gradleVersion: GradleVersion) { + verifyNavigationFromCaretToExpected(gradleVersion) + } + + @ParameterizedTest + @BaseGradleVersionSource + @TestMetadata("pluginPrecompiled/inKotlin.test") + fun testPluginPrecompiledInKotlin(gradleVersion: GradleVersion) { + verifyNavigationFromCaretToExpected(gradleVersion) + } + + @ParameterizedTest + @BaseGradleVersionSource + @TestMetadata("pluginPrecompiled/inKotlinWithPackage.test") + fun testPluginPrecompiledInKotlinWithPackage(gradleVersion: GradleVersion) { + verifyNavigationFromCaretToExpected(gradleVersion) + } + + @ParameterizedTest + @BaseGradleVersionSource + @TestMetadata("pluginPrecompiled/inKotlinLocatedInJavaDir.test") + fun testPluginPrecompiledInKotlinLocatedInJavaDir(gradleVersion: GradleVersion) { + verifyNavigationFromCaretToExpected(gradleVersion) + } + + override val myFixture = GRADLE_KMP_KOTLIN_FIXTURE + + companion object { + val GRADLE_KMP_KOTLIN_FIXTURE: GradleTestFixtureBuilder = GradleTestFixtureBuilder.create("GradleKotlinFixture") { gradleVersion -> + withSettingsFile(gradleVersion, gradleDsl = GradleDsl.KOTLIN) { + setProjectName("GradleKotlinFixture") + include("module1", ":module1:a-module11", ":module1:a-module11:module111") + enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + } + withBuildFile(gradleVersion, gradleDsl = GradleDsl.KOTLIN) { + withKotlinMultiplatformPlugin() + withMavenCentral() + } + withBuildFile(gradleVersion, "buildSrc", gradleDsl = GradleDsl.KOTLIN) { + withKotlinDsl() + } + withBuildFile(gradleVersion, "module1", gradleDsl = GradleDsl.KOTLIN) { + withKotlinMultiplatformPlugin() + withMavenCentral() + } + withBuildFile(gradleVersion, "module1/a-module11", gradleDsl = GradleDsl.KOTLIN) { + withKotlinMultiplatformPlugin() + withMavenCentral() + } + withBuildFile(gradleVersion, "module1/a-module11/module111", gradleDsl = GradleDsl.KOTLIN) { + withKotlinMultiplatformPlugin() + withMavenCentral() + } + withFile( + "gradle/libs.versions.toml", + /* language=TOML */ + """ + [libraries] + some_test-library = { module = "org.junit.jupiter:junit-jupiter" } + [plugins] + kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin"} + [versions] + test_library-version = "1.0" + kotlin = "1.9.24" + """.trimIndent() + ) + withFile( + "gradle.properties", + """ + kotlin.code.style=official + """.trimIndent() + ) + withFile( + "buildSrc/src/main/kotlin/MyTask.kt", + """ + + """.trimIndent() + ) + withDirectory("src/main/kotlin") + } + + val GRADLE_KOTLIN_FIXTURE: GradleTestFixtureBuilder = GradleTestFixtureBuilder.create("GradleKotlinFixture") { gradleVersion -> + withSettingsFile(gradleVersion, gradleDsl = GradleDsl.KOTLIN) { + setProjectName("GradleKotlinFixture") + include(":module1") + enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + } + withBuildFile(gradleVersion, gradleDsl = GradleDsl.KOTLIN) { + withKotlinDsl() + withMavenCentral() + } + withBuildFile(gradleVersion, "module1", gradleDsl = GradleDsl.KOTLIN) { + withKotlinDsl() + withMavenCentral() + } + withFile( + "gradle.properties", + """ + kotlin.code.style=official + """.trimIndent() + ) + } + } +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/gradle/navigation/composite/testNavigationToSettingsPluginFromSettingsGradleKts.test b/plugins/kotlin/idea/tests/testData/gradle/navigation/composite/testNavigationToSettingsPluginFromSettingsGradleKts.test new file mode 100644 index 000000000000..e67426f23a73 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/gradle/navigation/composite/testNavigationToSettingsPluginFromSettingsGradleKts.test @@ -0,0 +1,8 @@ +// FILE: settings.gradle.kts +// "EXPECTED-NAVIGATION-SUBSTRING": "println("custom")" +plugins { + id("custom.settings") +} + +// FILE: custom/src/main/kotlin/custom.settings.settings.gradle.kts +println("custom") diff --git a/plugins/kotlin/idea/tests/testData/gradle/navigation/composite/testNavigationToSettingsPluginNotWorkingFromBuildGradleKts.test b/plugins/kotlin/idea/tests/testData/gradle/navigation/composite/testNavigationToSettingsPluginNotWorkingFromBuildGradleKts.test new file mode 100644 index 000000000000..773b43eadceb --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/gradle/navigation/composite/testNavigationToSettingsPluginNotWorkingFromBuildGradleKts.test @@ -0,0 +1,8 @@ +// FILE: build.gradle.kts +// "EXPECTED-NAVIGATION-SUBSTRING": "println("custom")" +plugins { + id("custom.settings") +} + +// FILE: custom/src/main/kotlin/custom.settings.settings.gradle.kts +println("custom") \ No newline at end of file