From f7f585c8ae7b521d6e060ef9fdd558f562e86bde Mon Sep 17 00:00:00 2001 From: Nikita Biriukov Date: Thu, 15 Jan 2026 18:01:47 +0700 Subject: [PATCH] [gradle][toml] IDEA-370681 fix finding TOML version catalog usages in build scripts of subprojects in included builds Replace deprecated API that works only for subprojects of a root build. * org.jetbrains.plugins.gradle.dsl.versionCatalogs.GradleVersionCatalogsFindUsagesTest.testNestedProjectOfIncludedBuild GitOrigin-RevId: 57f7cb6cabd9aa8ac7524b79e58a1f160a24380f --- .../resolve/GradleVersionCatalogHandler.kt | 2 +- .../toml/GradleTomlUseScopeEnlarger.kt | 11 +++++------ .../GradleVersionCatalogFixtures.kt | 4 ++++ .../GradleVersionCatalogsFindUsagesTest.kt | 19 +++++++++++++++++++ 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/plugins/gradle/java/src/service/resolve/GradleVersionCatalogHandler.kt b/plugins/gradle/java/src/service/resolve/GradleVersionCatalogHandler.kt index e42615075c5d..17e987c27a66 100644 --- a/plugins/gradle/java/src/service/resolve/GradleVersionCatalogHandler.kt +++ b/plugins/gradle/java/src/service/resolve/GradleVersionCatalogHandler.kt @@ -66,7 +66,7 @@ fun getAccessorsForAllCatalogs(context: PsiElement) : Map { fun isInVersionCatalog(element: PsiElement): Boolean { val module = ModuleUtilCore.findModuleForPsiElement(element) ?: return false val versionCatalogFiles = getVersionCatalogFiles(module).values - val thisFile = element.containingFile?.virtualFile + val thisFile = element.containingFile?.virtualFile ?:return false return versionCatalogFiles.any { it == thisFile } } diff --git a/plugins/gradle/java/src/service/toml/GradleTomlUseScopeEnlarger.kt b/plugins/gradle/java/src/service/toml/GradleTomlUseScopeEnlarger.kt index 44df9acc0b1c..b48886834dfc 100644 --- a/plugins/gradle/java/src/service/toml/GradleTomlUseScopeEnlarger.kt +++ b/plugins/gradle/java/src/service/toml/GradleTomlUseScopeEnlarger.kt @@ -5,17 +5,16 @@ import com.intellij.psi.PsiElement import com.intellij.psi.search.SearchScope import com.intellij.psi.search.UseScopeEnlarger import org.jetbrains.plugins.gradle.config.GradleBuildscriptSearchScope -import org.jetbrains.plugins.gradle.service.resolve.getVersionCatalogFiles +import org.jetbrains.plugins.gradle.service.resolve.isInVersionCatalog import org.toml.lang.psi.TomlElement +/** + * Enables finding usages of TOML version catalog entries in subprojects. + */ class GradleTomlUseScopeEnlarger : UseScopeEnlarger() { override fun getAdditionalUseScope(element: PsiElement): SearchScope? { if (element !is TomlElement) return null - val containingFile = element.containingFile?.virtualFile ?: return null - val versionCatalogFiles = getVersionCatalogFiles(element.project).values - if (containingFile !in versionCatalogFiles) { - return null - } + if (!isInVersionCatalog(element)) return null return GradleBuildscriptSearchScope(element.project) } } \ No newline at end of file diff --git a/plugins/gradle/java/testSources/dsl/versionCatalogs/GradleVersionCatalogFixtures.kt b/plugins/gradle/java/testSources/dsl/versionCatalogs/GradleVersionCatalogFixtures.kt index fd4a2eaf4fe9..86e9a72eafd8 100644 --- a/plugins/gradle/java/testSources/dsl/versionCatalogs/GradleVersionCatalogFixtures.kt +++ b/plugins/gradle/java/testSources/dsl/versionCatalogs/GradleVersionCatalogFixtures.kt @@ -56,7 +56,11 @@ internal object GradleVersionCatalogFixtures { withSettingsFile(gradleVersion) { includeBuild("includedBuild1") } + withSettingsFile(gradleVersion, "includedBuild1",) { + include("subproject1") + } withBuildFile(gradleVersion, "includedBuild1") + withBuildFile(gradleVersion, "includedBuild1/subproject1") withFile("includedBuild1/gradle/libs.versions.toml", "") } } diff --git a/plugins/gradle/java/testSources/dsl/versionCatalogs/GradleVersionCatalogsFindUsagesTest.kt b/plugins/gradle/java/testSources/dsl/versionCatalogs/GradleVersionCatalogsFindUsagesTest.kt index 003c21fe2a24..ff22dedd4085 100644 --- a/plugins/gradle/java/testSources/dsl/versionCatalogs/GradleVersionCatalogsFindUsagesTest.kt +++ b/plugins/gradle/java/testSources/dsl/versionCatalogs/GradleVersionCatalogsFindUsagesTest.kt @@ -8,6 +8,7 @@ import org.gradle.util.GradleVersion import org.jetbrains.annotations.Unmodifiable import org.jetbrains.plugins.gradle.dsl.versionCatalogs.GradleVersionCatalogFixtures.BASE_VERSION_CATALOG_FIXTURE import org.jetbrains.plugins.gradle.dsl.versionCatalogs.GradleVersionCatalogFixtures.DYNAMICALLY_INCLUDED_SUBPROJECTS_FIXTURE +import org.jetbrains.plugins.gradle.dsl.versionCatalogs.GradleVersionCatalogFixtures.VERSION_CATALOG_COMPOSITE_BUILD_FIXTURE import org.jetbrains.plugins.gradle.testFramework.GradleCodeInsightTestCase import org.jetbrains.plugins.gradle.testFramework.annotations.BaseGradleVersionSource import org.junit.jupiter.api.Assertions.assertNotNull @@ -103,6 +104,24 @@ class GradleVersionCatalogsFindUsagesTest : GradleCodeInsightTestCase() { } } + @ParameterizedTest + @BaseGradleVersionSource + fun testNestedProjectOfIncludedBuild(gradleVersion: GradleVersion) { + test(gradleVersion, VERSION_CATALOG_COMPOSITE_BUILD_FIXTURE) { + writeTextAndCommit("includedBuild1/gradle/libs.versions.toml", /* language=TOML */ """ + [libraries] + apache-groovy = { module = "org.apache.groovy:groovy", version = "4.0.0" } + """.trimIndent() + ) + writeTextAndCommit("includedBuild1/subproject1/build.gradle", "libs.apache.groovy") + runInEdtAndWait { + codeInsightFixture.configureFromExistingVirtualFile(getFile("includedBuild1/gradle/libs.versions.toml")) + val usages = ReferencesSearch.search(codeInsightFixture.elementAtCaret).findAll() + assertContainsUsagesInFiles(usages, "includedBuild1/subproject1/build.gradle") + } + } + } + @ParameterizedTest @BaseGradleVersionSource fun testDynamicallyAddedSubprojectAndCustomToml(gradleVersion: GradleVersion) {