[gradle] IDEA-357140 Migrate Gradle Java Plugin descriptors to V2: properties module

GitOrigin-RevId: ac7bb2e345150f6d60c5d261ad98619ed4a8c871
This commit is contained in:
Dmitry Kichinsky
2026-02-13 02:01:33 +00:00
committed by intellij-monorepo-bot
parent dd70705bfb
commit d1a52976a3
32 changed files with 190 additions and 99 deletions
+1
View File
@@ -465,6 +465,7 @@
<module fileurl="file://$PROJECT_DIR$/plugins/gradle/java/groovy/toml/intellij.gradle.java.groovy.toml.iml" filepath="$PROJECT_DIR$/plugins/gradle/java/groovy/toml/intellij.gradle.java.groovy.toml.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/gradle-maven/intellij.gradle.java.maven.iml" filepath="$PROJECT_DIR$/plugins/gradle-maven/intellij.gradle.java.maven.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/gradle/java/performance/intellij.gradle.java.performance.iml" filepath="$PROJECT_DIR$/plugins/gradle/java/performance/intellij.gradle.java.performance.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/gradle/java/properties/intellij.gradle.java.properties.iml" filepath="$PROJECT_DIR$/plugins/gradle/java/properties/intellij.gradle.java.properties.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/gradle/java/intellij.gradle.java.tests.iml" filepath="$PROJECT_DIR$/plugins/gradle/java/intellij.gradle.java.tests.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/gradle/java/toml/intellij.gradle.java.toml.iml" filepath="$PROJECT_DIR$/plugins/gradle/java/toml/intellij.gradle.java.toml.iml" />
<module fileurl="file://$PROJECT_DIR$/plugins/gradle/jps-plugin/intellij.gradle.jps.iml" filepath="$PROJECT_DIR$/plugins/gradle/jps-plugin/intellij.gradle.jps.iml" />
+1
View File
@@ -1002,6 +1002,7 @@ plugins/gradle/java/groovy
plugins/gradle/java/groovy/ml
plugins/gradle/java/groovy/toml
plugins/gradle/java/performance
plugins/gradle/java/properties
plugins/gradle/java/toml
plugins/gradle/jps-plugin
plugins/gradle/kotlin/tests
+2 -2
View File
@@ -53,8 +53,6 @@ jvm_library(
"//libraries/xstream",
"//plugins/groovy/groovy-psi:psi",
"//java/execution/openapi:java-execution",
"//plugins/properties/properties-psi-api:psi",
"//plugins/properties/properties-psi-impl:backend-psi",
"//jps/model-impl",
"//platform/statistics",
"//platform/core-ui",
@@ -73,6 +71,7 @@ jvm_library(
"//java/debugger/shared",
"//platform/eel-provider",
"//platform/execution",
"//plugins/properties/properties-psi-impl:backend-psi",
],
exports = ["//plugins/gradle:gradle-common"],
runtime_deps = ["@lib//ant/lib:ant"]
@@ -172,6 +171,7 @@ jvm_library(
"//plugins/gradle/java/toml",
"//plugins/gradle/java/groovy",
"//plugins/gradle/java/groovy/toml",
"//plugins/gradle/java/properties",
],
runtime_deps = [":java-tests"]
)
@@ -10,7 +10,7 @@ import com.intellij.psi.OriginInfoAwareElement
import org.jetbrains.plugins.gradle.service.resolve.GradleArtifactHandlerContributor
import org.jetbrains.plugins.gradle.service.resolve.GradleDependencyHandlerContributor
import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionProperty
import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionsContributor
import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionsContributorUtil
import org.jetbrains.plugins.gradle.service.resolve.GradleGroovyProperty
import org.jetbrains.plugins.gradle.service.resolve.GradleNamedDomainCollectionContributor
import org.jetbrains.plugins.gradle.service.resolve.GradleTaskContainerContributor
@@ -22,7 +22,7 @@ class GradleGroovyElementFeatureProvider : ElementFeatureProvider {
ARTIFACT_HANDLER(GradleArtifactHandlerContributor.ARTIFACTS_ORIGIN_INFO),
DEPENDENCY_NOTATION(GradleDependencyHandlerContributor.DEPENDENCY_NOTATION),
USER_CONTRIBUTED_PROPERTY(GradleGroovyProperty.EXTENSION_PROPERTY),
PROPERTIES_FILE_PROPERTY(GradleExtensionsContributor.PROPERTIES_FILE_ORIGINAL_INFO),
PROPERTIES_FILE_PROPERTY(GradleExtensionsContributorUtil.PROPERTIES_FILE_ORIGINAL_INFO),
NAMED_DOMAIN_DECLARATION(GradleNamedDomainCollectionContributor.NAMED_DOMAIN_DECLARATION),
GRADLE_CONTRIBUTED_PROPERTY(GradleExtensionProperty.GRADLE_EXTENSION_PROPERTY),
TASK_METHOD(GradleTaskContainerContributor.GRADLE_TASK_INFO),
+1 -2
View File
@@ -49,8 +49,6 @@
<orderEntry type="module" module-name="intellij.libraries.xstream" />
<orderEntry type="module" module-name="intellij.groovy.psi" />
<orderEntry type="module" module-name="intellij.java.execution" />
<orderEntry type="module" module-name="intellij.properties.psi" />
<orderEntry type="module" module-name="intellij.properties.backend.psi" />
<orderEntry type="module" module-name="intellij.platform.jps.model.impl" />
<orderEntry type="module" module-name="intellij.platform.statistics" />
<orderEntry type="module" module-name="intellij.platform.core.ui" />
@@ -69,5 +67,6 @@
<orderEntry type="module" module-name="intellij.java.debugger.impl.shared" />
<orderEntry type="module" module-name="intellij.platform.eel.provider" />
<orderEntry type="module" module-name="intellij.platform.execution" />
<orderEntry type="module" module-name="intellij.properties.backend.psi" />
</component>
</module>
@@ -68,5 +68,6 @@
<orderEntry type="module" module-name="intellij.gradle.java.toml" scope="TEST" />
<orderEntry type="module" module-name="intellij.gradle.java.groovy" scope="TEST" />
<orderEntry type="module" module-name="intellij.gradle.java.groovy.toml" scope="TEST" />
<orderEntry type="module" module-name="intellij.gradle.java.properties" scope="TEST" />
</component>
</module>
@@ -0,0 +1,34 @@
### auto-generated section `build intellij.gradle.java.properties` start
load("@rules_jvm//:jvm.bzl", "jvm_library", "resourcegroup")
resourcegroup(
name = "properties_resources",
srcs = glob(["resources/**/*"]),
strip_prefix = "resources"
)
jvm_library(
name = "properties",
module_name = "intellij.gradle.java.properties",
visibility = ["//visibility:public"],
srcs = glob(["src/**/*.kt", "src/**/*.java", "src/**/*.form"], allow_empty = True),
resources = [":properties_resources"],
deps = [
"@lib//:kotlin-stdlib",
"@lib//:jetbrains-annotations",
"//plugins/properties/properties-psi-api:psi",
"//plugins/properties/properties-psi-impl:backend-psi",
"//plugins/gradle/java",
"//platform/core-api:core",
"//platform/core-impl",
"//platform/util",
"//platform/analysis-api:analysis",
"//platform/indexing-api:indexing",
"//plugins/groovy/groovy-psi:psi",
"//java/java-psi-api:psi",
"//java/java-psi-impl:psi-impl",
"//platform/util:util-ui",
"//platform/projectModel-api:projectModel",
]
)
### auto-generated section `build intellij.gradle.java.properties` end
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" packagePrefix="com.intellij.gradle.java.properties" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="kotlin-stdlib" level="project" />
<orderEntry type="library" name="jetbrains-annotations" level="project" />
<orderEntry type="module" module-name="intellij.properties.psi" />
<orderEntry type="module" module-name="intellij.properties.backend.psi" />
<orderEntry type="module" module-name="intellij.gradle.java" />
<orderEntry type="module" module-name="intellij.platform.core" />
<orderEntry type="module" module-name="intellij.platform.core.impl" />
<orderEntry type="module" module-name="intellij.platform.util" />
<orderEntry type="module" module-name="intellij.platform.analysis" />
<orderEntry type="module" module-name="intellij.platform.indexing" />
<orderEntry type="module" module-name="intellij.groovy.psi" />
<orderEntry type="module" module-name="intellij.java.psi" />
<orderEntry type="module" module-name="intellij.java.psi.impl" />
<orderEntry type="module" module-name="intellij.platform.util.ui" />
<orderEntry type="module" module-name="intellij.platform.projectModel" />
</component>
</module>
@@ -0,0 +1,26 @@
<idea-plugin>
<extensions defaultExtensionNs="com.intellij">
<referencesSearch implementation="com.intellij.gradle.java.properties.findUsages.GradlePropertyReferencesSearcher"/>
<properties.implicitPropertyUsageProvider implementation="com.intellij.gradle.java.properties.findUsages.GradleImplicitPropertyUsageProvider"/>
<localInspection language="Properties" groupPath="Gradle" shortName="LatestMinorVersion"
bundle="messages.GradleInspectionBundle"
key="inspection.display.name.latest.minor.version" groupKey="inspection.best.practises"
groupBundle="messages.GradleInspectionBundle"
enabledByDefault="true" level="WARNING"
implementationClass="org.jetbrains.plugins.gradle.codeInspection.GradleLatestMinorVersionInspection"
isInternal="true"/>
<localInspection language="UAST" groupPath="Gradle" shortName="RedundantKotlinStdLibDependency"
bundle="messages.GradleInspectionBundle"
key="inspection.display.name.redundant.kotlin.std.lib.dependency" groupKey="inspection.best.practises"
groupBundle="messages.GradleInspectionBundle"
enabledByDefault="true" level="WARNING"
implementationClass="com.intellij.gradle.java.properties.codeInspection.GradleRedundantKotlinStdLibInspection"
isInternal="true"/>
</extensions>
<extensions defaultExtensionNs="org.intellij.groovy">
<membersContributor implementation="com.intellij.gradle.java.properties.service.GradleExtensionsContributor"/>
</extensions>
</idea-plugin>
@@ -1,11 +1,12 @@
// 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.plugins.gradle.codeInspection
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.gradle.java.properties.codeInspection
import com.intellij.codeInspection.LocalInspectionTool
import com.intellij.codeInspection.ProblemsHolder
import com.intellij.gradle.java.properties.util.gradlePropertiesStream
import com.intellij.psi.PsiElementVisitor
import com.intellij.psi.PsiFile
import org.jetbrains.plugins.gradle.service.resolve.gradlePropertiesStream
import org.jetbrains.plugins.gradle.codeInspection.GradleDslInspectionProvider
class GradleRedundantKotlinStdLibInspection : LocalInspectionTool() {
override fun isAvailableForFile(file: PsiFile): Boolean {
@@ -16,13 +17,13 @@ class GradleRedundantKotlinStdLibInspection : LocalInspectionTool() {
if (kotlinStdlibDefaultDependencyProp == "false") return false
val language = file.language
val inspectionProvider = GradleDslInspectionProvider.INSTANCE.forLanguage(language) ?: return false
val inspectionProvider = GradleDslInspectionProvider.Companion.INSTANCE.forLanguage(language) ?: return false
return inspectionProvider.isRedundantKotlinStdLibInspectionAvailable(file)
}
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
val language = holder.file.language
val inspectionProvider = GradleDslInspectionProvider.INSTANCE.forLanguage(language) ?: return PsiElementVisitor.EMPTY_VISITOR
val inspectionProvider = GradleDslInspectionProvider.Companion.INSTANCE.forLanguage(language) ?: return PsiElementVisitor.EMPTY_VISITOR
return inspectionProvider.getRedundantKotlinStdLibInspectionVisitor(holder, isOnTheFly)
}
}
@@ -1,11 +1,11 @@
// 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.plugins.gradle.findUsages
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.gradle.java.properties.findUsages
import com.intellij.lang.properties.codeInspection.unused.ImplicitPropertyUsageProvider
import com.intellij.lang.properties.psi.PropertiesFile
import com.intellij.lang.properties.psi.Property
import com.intellij.util.asSafely
import org.jetbrains.plugins.gradle.service.resolve.gradlePropertiesStream
import com.intellij.gradle.java.properties.util.gradlePropertiesStream
class GradleImplicitPropertyUsageProvider : ImplicitPropertyUsageProvider {
@@ -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.plugins.gradle.findUsages;
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.gradle.java.properties.findUsages;
import com.intellij.lang.properties.psi.Property;
import com.intellij.openapi.application.QueryExecutorBase;
@@ -1,45 +1,46 @@
// 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.plugins.gradle.service.resolve
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.gradle.java.properties.service
import com.intellij.gradle.java.properties.util.gradlePropertiesStream
import com.intellij.icons.AllIcons
import com.intellij.lang.properties.IProperty
import com.intellij.openapi.roots.ProjectFileIndex
import com.intellij.psi.CommonClassNames
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiClassType
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementFactory
import com.intellij.psi.PsiSubstitutor
import com.intellij.psi.PsiType
import com.intellij.psi.ResolveState
import com.intellij.psi.scope.PsiScopeProcessor
import com.intellij.psi.util.InheritanceUtil
import icons.GradleIcons
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.plugins.gradle.service.resolve.GradleCommonClassNames.GRADLE_API_PROJECT
import org.jetbrains.plugins.gradle.settings.GradleExtensionsSettings
import org.jetbrains.plugins.gradle.settings.GradleExtensionsSettings.GradleExtensionsData
import org.jetbrains.plugins.gradle.service.resolve.GradleCommonClassNames
import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionsContributorUtil
import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionsContributorUtil.Companion.PROPERTIES_FILE_ORIGINAL_INFO
import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionsContributorUtil.Companion.getExtensionsFor
import org.jetbrains.plugins.gradle.service.resolve.GradleGroovyProperty
import org.jetbrains.plugins.gradle.service.resolve.GradleProjectAwareType
import org.jetbrains.plugins.gradle.service.resolve.getAccessorsForAllCatalogs
import org.jetbrains.plugins.gradle.service.resolve.getVersionCatalogAccessor
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightField
import org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersContributor
import org.jetbrains.plugins.groovy.lang.resolve.api.GroovyPropertyBase
import org.jetbrains.plugins.groovy.lang.resolve.getName
import org.jetbrains.plugins.groovy.lang.resolve.processors.inference.type
import org.jetbrains.plugins.groovy.lang.resolve.shouldProcessProperties
import javax.swing.Icon
@ApiStatus.Internal
class GradleExtensionsContributor : NonCodeMembersContributor() {
override fun getClassNames(): Collection<String> {
return listOf(GradleCommonClassNames.GRADLE_API_EXTRA_PROPERTIES_EXTENSION, GRADLE_API_PROJECT)
return listOf(GradleCommonClassNames.GRADLE_API_EXTRA_PROPERTIES_EXTENSION, GradleCommonClassNames.GRADLE_API_PROJECT)
}
override fun processDynamicElements(qualifierType: PsiType,
aClass: PsiClass?,
processor: PsiScopeProcessor,
place: PsiElement,
state: ResolveState) {
state: ResolveState
) {
if (qualifierType !is GradleProjectAwareType && !InheritanceUtil.isInheritor(qualifierType, GradleCommonClassNames.GRADLE_API_EXTRA_PROPERTIES_EXTENSION)) return
if (!processor.shouldProcessProperties()) return
val file = place.containingFile
@@ -64,7 +65,8 @@ class GradleExtensionsContributor : NonCodeMembersContributor() {
private fun processPropertiesFromFile(aClass: PsiClass?,
processor: PsiScopeProcessor,
place: PsiElement,
state: ResolveState) : Set<String> {
state: ResolveState
) : Set<String> {
if (aClass == null) {
return emptySet()
}
@@ -104,47 +106,27 @@ class GradleExtensionsContributor : NonCodeMembersContributor() {
return newProperty
}
class StaticVersionCatalogProperty(place: PsiElement, name: String, val clazz: PsiClass) : GroovyPropertyBase(name, place) {
override fun getPropertyType(): PsiType {
return PsiElementFactory.getInstance(project).createType(clazz, PsiSubstitutor.EMPTY)
}
override fun getIcon(flags: Int): Icon? {
return GradleIcons.Gradle
}
}
fun processPropertiesFromCatalog(name: String?, place: PsiElement, processor: PsiScopeProcessor, state: ResolveState) : Set<String>? {
if (name == null) {
// this case is possible when only a part of a catalog name is written and autocomplete is triggered
return processAllCatalogsOfBuild(place, processor, state)
}
val accessor = getVersionCatalogAccessor(place, name) ?: return emptySet()
val element = StaticVersionCatalogProperty(place, name, accessor)
val element = GradleExtensionsContributorUtil.Companion.StaticVersionCatalogProperty(place, name, accessor)
if (!processor.execute(element, state)) {
return null // to stop processing
}
return setOf(name)
}
fun getExtensionsFor(psiElement: PsiElement): GradleExtensionsData? {
val project = psiElement.project
val virtualFile = psiElement.containingFile?.originalFile?.virtualFile ?: return null
val module = ProjectFileIndex.getInstance(project).getModuleForFile(virtualFile)
return GradleExtensionsSettings.getInstance(project).getExtensionsFor(module)
}
const val PROPERTIES_FILE_ORIGINAL_INFO : String = "by gradle.properties"
private fun processAllCatalogsOfBuild(place: PsiElement, processor: PsiScopeProcessor, state: ResolveState): Set<String>? {
val catalogNameToAccessor: Map<String, PsiClass> = getAccessorsForAllCatalogs(place)
catalogNameToAccessor.forEach { (catalogName, accessor) ->
if (!processor.execute(StaticVersionCatalogProperty(place, catalogName, accessor), state)) {
if (!processor.execute(GradleExtensionsContributorUtil.Companion.StaticVersionCatalogProperty(place, catalogName, accessor), state)) {
return null // to stop processing
}
}
return catalogNameToAccessor.keys
}
}
}
}
@@ -1,13 +1,15 @@
// 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.plugins.gradle.service.resolve
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.gradle.java.properties.util
import com.intellij.lang.properties.psi.PropertiesFile
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiUtilCore
import com.intellij.util.asSafely
import org.jetbrains.plugins.gradle.properties.GradlePropertiesFile
import org.jetbrains.plugins.gradle.service.resolve.module
import org.jetbrains.plugins.gradle.util.GradleConstants.GRADLE_PROPERTIES_FILE_NAME
import java.nio.file.Path
@@ -21,3 +23,7 @@ private fun Path.getGradlePropertiesFile(project: Project): PropertiesFile? {
val file = VfsUtil.findFile(this, false)?.findChild(GRADLE_PROPERTIES_FILE_NAME)
return file?.let { PsiUtilCore.getPsiFile(project, it) }.asSafely<PropertiesFile>()
}
internal fun PsiElement.getRootGradleProjectPath() : String? {
return ExternalSystemApiUtil.getExternalRootProjectPath(module)
}
@@ -98,7 +98,6 @@
<membersContributor implementation="org.jetbrains.plugins.gradle.service.resolve.GradleArtifactHandlerContributor"/>
<membersContributor implementation="org.jetbrains.plugins.gradle.service.resolve.GradleTaskContainerContributor"/>
<membersContributor implementation="org.jetbrains.plugins.gradle.service.resolve.GradleNamedDomainCollectionContributor"/>
<membersContributor implementation="org.jetbrains.plugins.gradle.service.resolve.GradleExtensionsContributor"/>
<membersContributor implementation="org.jetbrains.plugins.gradle.service.resolve.GradleExtensionMembersContributor"/>
<callTypeCalculator implementation="org.jetbrains.plugins.gradle.service.resolve.GradleProjectCallTypeCalculator"/>
<callTypeCalculator implementation="org.jetbrains.plugins.gradle.service.resolve.GradleArtifactCallTypeCalculator"/>
@@ -1,15 +0,0 @@
<idea-plugin>
<extensions defaultExtensionNs="com.intellij">
<referencesSearch implementation="org.jetbrains.plugins.gradle.findUsages.GradlePropertyReferencesSearcher"/>
<properties.implicitPropertyUsageProvider implementation="org.jetbrains.plugins.gradle.findUsages.GradleImplicitPropertyUsageProvider"/>
<localInspection language="Properties" groupPath="Gradle" shortName="LatestMinorVersion"
bundle="messages.GradleInspectionBundle"
key="inspection.display.name.latest.minor.version" groupKey="inspection.best.practises"
groupBundle="messages.GradleInspectionBundle"
enabledByDefault="true" level="WARNING"
implementationClass="org.jetbrains.plugins.gradle.codeInspection.GradleLatestMinorVersionInspection"
isInternal="true"/>
</extensions>
</idea-plugin>
@@ -18,7 +18,6 @@
<module value="org.jetbrains.plugins.gradle.java"/>
<depends optional="true" config-file="gradle-groovy-integration.xml">org.intellij.groovy</depends>
<depends optional="true" config-file="gradle-properties-integration.xml">com.intellij.properties</depends>
<content namespace="jetbrains">
<module name="intellij.gradle.profiler"/>
@@ -31,6 +30,7 @@
<module name="intellij.gradle.java.groovy.toml"/>
<module name="intellij.gradle.java.groovy.ml"/>
<module name="intellij.gradle.java.coverage"/>
<module name="intellij.gradle.java.properties"/>
</content>
<resource-bundle>messages.GradleInspectionBundle</resource-bundle>
@@ -177,12 +177,5 @@
implementationClass="org.jetbrains.plugins.gradle.codeInspection.GradleAvoidDependencyNamedArgumentsNotationInspection"
isInternal="true"/>
<localInspection language="UAST" groupPath="Gradle" shortName="RedundantKotlinStdLibDependency"
bundle="messages.GradleInspectionBundle"
key="inspection.display.name.redundant.kotlin.std.lib.dependency" groupKey="inspection.best.practises"
groupBundle="messages.GradleInspectionBundle"
enabledByDefault="true" level="WARNING"
implementationClass="org.jetbrains.plugins.gradle.codeInspection.GradleRedundantKotlinStdLibInspection"
isInternal="true"/>
</extensions>
</idea-plugin>
@@ -46,7 +46,7 @@ interface GradleDslInspectionProvider {
fun getAvoidDependencyNamedArgumentsNotationInspectionVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor
/**
* @see GradleRedundantKotlinStdLibInspection
* @see com.intellij.gradle.java.properties.codeInspection.GradleRedundantKotlinStdLibInspection
*/
fun isRedundantKotlinStdLibInspectionAvailable(file: PsiFile): Boolean
fun getRedundantKotlinStdLibInspectionVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor
@@ -7,7 +7,7 @@ import com.intellij.codeInspection.ProblemsHolder
import com.intellij.util.containers.map2Array
import org.jetbrains.plugins.gradle.codeInspection.GradleInspectionBundle
import org.jetbrains.plugins.gradle.service.resolve.DECLARATION_ALTERNATIVES
import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionsContributor
import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionsContributorUtil
import org.jetbrains.plugins.groovy.intentions.GrReplaceMethodCallQuickFix
import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression
@@ -19,7 +19,7 @@ class GroovyDeprecatedConfigurationInspectionVisitor(val holder: ProblemsHolder)
val resolved = referenceExpression.resolve() ?: return
val alternatives = resolved.getUserData(DECLARATION_ALTERNATIVES)?.takeIf { it.isNotEmpty() } ?: return
val knownConfigurations = GradleExtensionsContributor.getExtensionsFor(referenceExpression)?.configurations?.keys ?: emptyList()
val knownConfigurations = GradleExtensionsContributorUtil.getExtensionsFor(referenceExpression)?.configurations?.keys ?: emptyList()
val descriptor = InspectionManager.getInstance(referenceExpression.project)
.createProblemDescriptor(
@@ -14,7 +14,7 @@ import com.intellij.util.lazyPub
import org.jetbrains.plugins.gradle.codeInspection.groovy.DelegationHierarchy
import org.jetbrains.plugins.gradle.codeInspection.groovy.getDelegationHierarchy
import org.jetbrains.plugins.gradle.codeInspection.groovy.getDelegationSourceCaller
import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionsContributor
import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionsContributorUtil
import org.jetbrains.plugins.groovy.lang.completion.api.GroovyCompletionConsumer
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightField
import kotlin.math.absoluteValue
@@ -33,7 +33,7 @@ class GradleCompletionConsumer(position: PsiElement, val delegate: GroovyComplet
GradleLookupWeigher.setGradleCompletionPriority(newElement, GradleLookupWeigher.DEFAULT_COMPLETION_PRIORITY - 1)
delegate.consume(newElement)
}
else if (psi is GrLightField && psi.originInfo == GradleExtensionsContributor.PROPERTIES_FILE_ORIGINAL_INFO) {
else if (psi is GrLightField && psi.originInfo == GradleExtensionsContributorUtil.PROPERTIES_FILE_ORIGINAL_INFO) {
val property = psi.navigationElement.asSafely<IProperty>() ?: return delegate.consume(element)
val value = property.value
val newElement = element.modify { withTailText("=$value").withTypeText(psi.type.presentableText, true) }
@@ -15,7 +15,7 @@ import com.intellij.util.asSafely
import org.jetbrains.plugins.gradle.service.project.CommonGradleProjectResolverExtension
import org.jetbrains.plugins.gradle.service.resolve.GradleCommonClassNames
import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionProperty
import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionsContributor.Companion.StaticVersionCatalogProperty
import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionsContributorUtil.Companion.StaticVersionCatalogProperty
import org.jetbrains.plugins.gradle.util.GradleConstants
import org.jetbrains.plugins.gradle.util.getCapitalizedAccessorName
import org.jetbrains.plugins.groovy.intentions.style.inference.resolve
@@ -33,7 +33,7 @@ class GradleArtifactHandlerContributor : NonCodeMembersContributor() {
if (clazz == null) return
if (!processor.shouldProcessMethods()) return
val data = GradleExtensionsContributor.getExtensionsFor(place) ?: return
val data = GradleExtensionsContributorUtil.getExtensionsFor(place) ?: return
val methodName = processor.getName(state)
val manager = place.manager
val objectVarargType = PsiEllipsisType(getJavaLangObject(place))
@@ -39,7 +39,7 @@ class GradleDependencyHandlerContributor : NonCodeMembersContributor() {
if (clazz == null) return
if (!processor.shouldProcessMethods()) return
val data = GradleExtensionsContributor.getExtensionsFor(place) ?: return
val data = GradleExtensionsContributorUtil.getExtensionsFor(place) ?: return
val methodName = processor.getName(state)
val manager = place.manager
val objectVarargType = PsiEllipsisType(TypesUtil.getJavaLangObject(place))
@@ -0,0 +1,37 @@
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gradle.service.resolve
import com.intellij.openapi.roots.ProjectFileIndex
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementFactory
import com.intellij.psi.PsiSubstitutor
import com.intellij.psi.PsiType
import icons.GradleIcons
import org.jetbrains.plugins.gradle.settings.GradleExtensionsSettings
import org.jetbrains.plugins.groovy.lang.resolve.api.GroovyPropertyBase
import javax.swing.Icon
class GradleExtensionsContributorUtil {
companion object {
const val PROPERTIES_FILE_ORIGINAL_INFO : String = "by gradle.properties"
fun getExtensionsFor(psiElement: PsiElement): GradleExtensionsSettings.GradleExtensionsData? {
val project = psiElement.project
val virtualFile = psiElement.containingFile?.originalFile?.virtualFile ?: return null
val module = ProjectFileIndex.getInstance(project).getModuleForFile(virtualFile)
return GradleExtensionsSettings.getInstance(project).getExtensionsFor(module)
}
class StaticVersionCatalogProperty(place: PsiElement, name: String, val clazz: PsiClass) : GroovyPropertyBase(name, place) {
override fun getPropertyType(): PsiType {
return PsiElementFactory.getInstance(project).createType(clazz, PsiSubstitutor.EMPTY)
}
override fun getIcon(flags: Int): Icon? {
return GradleIcons.Gradle
}
}
}
}
@@ -43,7 +43,7 @@ class GradleProjectExtensionContributor : NonCodeMembersContributor() {
}
val containingFile = place.containingFile
val extensionsData = GradleExtensionsContributor.getExtensionsFor(containingFile) ?: return
val extensionsData = GradleExtensionsContributorUtil.getExtensionsFor(containingFile) ?: return
val name = processor.getName(state)
val allExtensions = extensionsData.extensions
@@ -26,7 +26,7 @@ class GradleProjectMembersContributor : NonCodeMembersContributor() {
if (qualifierType !is GradleProjectAwareType) return
val file = place.containingFile ?: return
val extensionsData = GradleExtensionsContributor.getExtensionsFor(file) ?: return
val extensionsData = GradleExtensionsContributorUtil.getExtensionsFor(file) ?: return
for (convention in extensionsData.conventions) {
if (!createType(convention.typeFqn, file).processReceiverType(processor, state, place)) {
return
@@ -40,7 +40,7 @@ class GradleTaskContainerContributor : NonCodeMembersContributor() {
}
val file = place.containingFile ?: return
val data = GradleExtensionsContributor.getExtensionsFor(file) ?: return
val data = GradleExtensionsContributorUtil.getExtensionsFor(file) ?: return
val name = processor.getName(state)
val gradleProjectType = JavaPsiFacade.getInstance(place.project).findClass(GradleCommonClassNames.GRADLE_API_PROJECT,
@@ -2,6 +2,7 @@
package org.jetbrains.plugins.gradle.service.resolve
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.ProjectFileIndex
import com.intellij.openapi.util.Key
import com.intellij.patterns.PatternCondition
@@ -37,15 +38,11 @@ internal fun PsiClass?.isResolvedInGradleScript() = this is GroovyScriptClass &&
internal fun PsiFile?.isGradleScript() = this?.originalFile?.virtualFile?.extension == EXTENSION
private val PsiElement.module get() = containingFile?.originalFile?.virtualFile?.let {
ProjectFileIndex.getInstance(project).getModuleForFile(it)
}
@get:ApiStatus.Internal
val PsiElement.module: Module?
get() = containingFile?.originalFile?.virtualFile?.let { ProjectFileIndex.getInstance(project).getModuleForFile(it) }
@ApiStatus.Internal
fun PsiElement.getLinkedGradleProjectPath() : String? {
return ExternalSystemApiUtil.getExternalProjectPath(module)
}
internal fun PsiElement.getRootGradleProjectPath() : String? {
return ExternalSystemApiUtil.getExternalRootProjectPath(module)
}
@@ -1,8 +1,8 @@
// 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.plugins.gradle.dsl.inspections
import com.intellij.gradle.java.properties.codeInspection.GradleRedundantKotlinStdLibInspection
import org.gradle.util.GradleVersion
import org.jetbrains.plugins.gradle.codeInspection.GradleRedundantKotlinStdLibInspection
import org.jetbrains.plugins.gradle.testFramework.GradleCodeInsightTestCase
import org.jetbrains.plugins.gradle.testFramework.GradleTestFixtureBuilder
import org.jetbrains.plugins.gradle.testFramework.annotations.AllGradleVersionsSource
@@ -169,6 +169,7 @@ jvm_library(
"//plugins/gradle/completion",
"//plugins/gradle/completion:completion_test_lib",
"//plugins/gradle/java/toml",
"//plugins/gradle/java/properties",
]
)
### auto-generated section `build intellij.kotlin.gradle.scripting` end
@@ -93,5 +93,6 @@
<orderEntry type="module" module-name="intellij.kotlin.uast.base" />
<orderEntry type="module" module-name="intellij.gradle.completion" scope="TEST" />
<orderEntry type="module" module-name="intellij.gradle.java.toml" />
<orderEntry type="module" module-name="intellij.gradle.java.properties" scope="TEST" />
</component>
</module>
@@ -1,9 +1,9 @@
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle.scripting.k2.inspections
import com.intellij.gradle.java.properties.codeInspection.GradleRedundantKotlinStdLibInspection
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.scripting.k2.K2GradleCodeInsightTestCase
import org.jetbrains.plugins.gradle.codeInspection.GradleRedundantKotlinStdLibInspection
import org.jetbrains.plugins.gradle.frameworkSupport.GradleDsl
import org.jetbrains.plugins.gradle.testFramework.GradleTestFixtureBuilder
import org.jetbrains.plugins.gradle.testFramework.annotations.AllGradleVersionsSource