From 93f6447448d4aa640c062c7c43483457bbba921a Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Mon, 12 Dec 2016 15:12:31 +0300 Subject: [PATCH] gradle: configurations completion --- .../ConfigurationsCompletionContributor.kt | 64 ++++++++++++------- .../settings/GradleExtensionsSettings.java | 3 + .../gradle/model/GradleConfiguration.java | 5 +- .../model/DefaultGradleConfiguration.java | 17 ++++- .../ProjectExtensionsDataBuilderImpl.groovy | 3 + 5 files changed, 66 insertions(+), 26 deletions(-) diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/codeInsight/ConfigurationsCompletionContributor.kt b/plugins/gradle/src/org/jetbrains/plugins/gradle/codeInsight/ConfigurationsCompletionContributor.kt index 04ca6f8d4bc5..4c0b6d112c56 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/codeInsight/ConfigurationsCompletionContributor.kt +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/codeInsight/ConfigurationsCompletionContributor.kt @@ -21,12 +21,13 @@ import com.intellij.patterns.PlatformPatterns.psiElement import com.intellij.psi.PsiElement import com.intellij.util.ProcessingContext import icons.GradleIcons -import org.jetbrains.plugins.gradle.service.resolve.GradleCommonClassNames.GRADLE_API_CONFIGURATION -import org.jetbrains.plugins.gradle.service.resolve.GradleDependenciesContributor.Companion.dependenciesClosure +import org.jetbrains.plugins.gradle.service.resolve.GradleCommonClassNames.* import org.jetbrains.plugins.gradle.service.resolve.GradleExtensionsContributor import org.jetbrains.plugins.groovy.dsl.holders.NonCodeMembersHolder import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightVariable +import org.jetbrains.plugins.groovy.lang.psi.patterns.groovyClosure +import org.jetbrains.plugins.groovy.lang.psi.patterns.psiMethod import java.lang.Double.MAX_VALUE /** @@ -34,34 +35,51 @@ import java.lang.Double.MAX_VALUE * @since 12/7/2016 */ class ConfigurationsCompletionContributor : AbstractGradleCompletionContributor() { - init { - extend(CompletionType.BASIC, PLACE_PATTERN, object : CompletionProvider() { - override fun addCompletions(params: CompletionParameters, - context: ProcessingContext, - result: CompletionResultSet) { - val position = params.position - val extensionsData = GradleExtensionsContributor.getExtensionsFor(position) ?: return - for (configuration in extensionsData.configurations) { - val confVar = object : GrLightVariable(position.manager, configuration.name, GRADLE_API_CONFIGURATION, position) { - override fun getNavigationElement(): PsiElement { - val navigationElement = super.getNavigationElement() - navigationElement.putUserData(NonCodeMembersHolder.DOCUMENTATION, configuration.description) - return navigationElement - } + + class ConfigurationsCompletionProvider(val isScriptClasspath: Boolean = false) : CompletionProvider() { + + override fun addCompletions(params: CompletionParameters, + context: ProcessingContext, + result: CompletionResultSet) { + val position = params.position + val extensionsData = GradleExtensionsContributor.getExtensionsFor(position) ?: return + for (configuration in extensionsData.configurations) { + if (isScriptClasspath != configuration.scriptClasspath) continue + + val confVar = object : GrLightVariable(position.manager, configuration.name, GRADLE_API_CONFIGURATION, position) { + override fun getNavigationElement(): PsiElement { + val navigationElement = super.getNavigationElement() + val description = if (isScriptClasspath && configuration.description == null) DEFAULT_SCRIPT_CLASSPATH_DESCRIPTION else configuration.description + navigationElement.putUserData(NonCodeMembersHolder.DOCUMENTATION, description) + return navigationElement } - val elementBuilder = LookupElementBuilder.create(confVar, configuration.name) - .withIcon(GradleIcons.Gradle) - .withTypeText("Configuration") - result.addElement(PrioritizedLookupElement.withPriority(elementBuilder, MAX_VALUE)) } + val elementBuilder = LookupElementBuilder.create(confVar, configuration.name) + .withIcon(GradleIcons.Gradle) + .withTypeText("Configuration") + result.addElement(PrioritizedLookupElement.withPriority(elementBuilder, MAX_VALUE)) } - }) + } + } + + init { + extend(CompletionType.BASIC, PROJECT_DEPENDENCIES_PLACE_PATTERN, ConfigurationsCompletionProvider()) + extend(CompletionType.BASIC, SCRIPT_DEPENDENCIES_PLACE_PATTERN, ConfigurationsCompletionProvider(true)) } companion object { - private val PLACE_PATTERN = psiElement() + + private val DEFAULT_SCRIPT_CLASSPATH_DESCRIPTION = "The script classpath configuration used to compile and execute a build script. " + + "This classpath is also used to load the plugins which the build script uses." + + private val PROJECT_DEPENDENCIES_PLACE_PATTERN = psiElement() .and(GRADLE_FILE_PATTERN) .withParent(GrReferenceExpression::class.java) - .withAncestor(4, dependenciesClosure) + .withAncestor(4, groovyClosure().inMethod(psiMethod(GRADLE_API_PROJECT, "dependencies"))) + + private val SCRIPT_DEPENDENCIES_PLACE_PATTERN = psiElement() + .and(GRADLE_FILE_PATTERN) + .withParent(GrReferenceExpression::class.java) + .withAncestor(4, groovyClosure().inMethod(psiMethod(GRADLE_API_SCRIPT_HANDLER, "dependencies"))) } } \ No newline at end of file diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleExtensionsSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleExtensionsSettings.java index c40a7b8b4715..849a561dd8bd 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleExtensionsSettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleExtensionsSettings.java @@ -148,6 +148,7 @@ public class GradleExtensionsSettings implements PersistentStateComponent