From 4d5400164ea49807f5eab9868bebf0e491e63dbf Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Wed, 17 Nov 2010 14:25:26 +0300 Subject: [PATCH] maven: smart completion suggests basic variants in maven dom --- ...enArtifactCoordinatesGroupIdConverter.java | 3 +- .../dom/converters/MavenSmartConverter.java | 24 ++++ ...avenGroupIdSmartCompletionContributor.java | 87 -------------- .../MavenSmartCompletionContributor.java | 108 ++++++++++++++++++ .../src/main/resources/META-INF/plugin.xml | 7 +- 5 files changed, 138 insertions(+), 91 deletions(-) create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenSmartConverter.java delete mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenGroupIdSmartCompletionContributor.java create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenSmartCompletionContributor.java diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesGroupIdConverter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesGroupIdConverter.java index 6a471d5b7f53..cf8d0d4a8d3e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesGroupIdConverter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesGroupIdConverter.java @@ -9,7 +9,7 @@ import org.jetbrains.idea.maven.model.MavenId; import java.util.Collection; import java.util.Set; -public class MavenArtifactCoordinatesGroupIdConverter extends MavenArtifactCoordinatesConverter { +public class MavenArtifactCoordinatesGroupIdConverter extends MavenArtifactCoordinatesConverter implements MavenSmartConverter { @Override protected boolean doIsValid(MavenId id, MavenProjectIndicesManager manager, ConvertContext context) { if (StringUtil.isEmpty(id.getGroupId())) return false; @@ -21,6 +21,7 @@ public class MavenArtifactCoordinatesGroupIdConverter extends MavenArtifactCoord return manager.getGroupIds(); } + @Override public Collection getSmartVariants(ConvertContext convertContext) { Set groupIds = new HashSet(); String artifactId = MavenArtifactCoordinatesHelper.getId(convertContext).getArtifactId(); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenSmartConverter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenSmartConverter.java new file mode 100644 index 000000000000..86a1a394e16f --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenSmartConverter.java @@ -0,0 +1,24 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.dom.converters; + +import com.intellij.util.xml.ConvertContext; + +import java.util.Collection; + +public interface MavenSmartConverter { + Collection getSmartVariants(ConvertContext convertContext); +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenGroupIdSmartCompletionContributor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenGroupIdSmartCompletionContributor.java deleted file mode 100644 index 1b41749c9c67..000000000000 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenGroupIdSmartCompletionContributor.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2000-2010 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.idea.maven.dom.model.completion; - -import com.intellij.codeInsight.completion.CompletionContributor; -import com.intellij.codeInsight.completion.CompletionParameters; -import com.intellij.codeInsight.completion.CompletionResultSet; -import com.intellij.codeInsight.completion.CompletionType; -import com.intellij.codeInsight.lookup.LookupElementBuilder; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiReference; -import com.intellij.psi.xml.XmlText; -import com.intellij.psi.xml.XmlToken; -import com.intellij.util.xml.Converter; -import com.intellij.util.xml.impl.GenericDomValueReference; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.dom.converters.MavenArtifactCoordinatesGroupIdConverter; - -import java.util.Collection; - -public class MavenGroupIdSmartCompletionContributor extends CompletionContributor { - - @Override - public void fillCompletionVariants(final CompletionParameters parameters, final CompletionResultSet result) { - - if (parameters.getCompletionType() != CompletionType.SMART) { - return; - } - ApplicationManager.getApplication().runReadAction(new Runnable() { - public void run() { - final GenericDomValueReference reference = getReference(parameters); - if (reference == null) { - return; - } - - Collection variants = - ((MavenArtifactCoordinatesGroupIdConverter)reference.getConverter()).getSmartVariants(reference.getConvertContext()); - - for (String variant : variants) { - if (!StringUtil.isEmptyOrSpaces(variant)) { - result.addElement(LookupElementBuilder.create(variant)); - - } - } - } - }); - } - - @Nullable - private GenericDomValueReference getReference(CompletionParameters parameters) { - - if (!(parameters.getPosition() instanceof XmlToken)) return null; - - PsiReference[] references = getReferences(parameters); - for (final PsiReference psiReference : references) { - if (psiReference instanceof GenericDomValueReference) { - final Converter converter = ((GenericDomValueReference)psiReference).getConverter(); - if (converter instanceof MavenArtifactCoordinatesGroupIdConverter) { - return (GenericDomValueReference)psiReference; - } - } - } - return null; - } - - private static PsiReference[] getReferences(CompletionParameters parameters) { - PsiElement psiElement = parameters.getPosition().getParent(); - - return psiElement instanceof XmlText ? psiElement.getParent().getReferences() : psiElement.getReferences(); - } -} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenSmartCompletionContributor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenSmartCompletionContributor.java new file mode 100644 index 000000000000..3983f2b24582 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenSmartCompletionContributor.java @@ -0,0 +1,108 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.idea.maven.dom.model.completion; + +import com.intellij.codeInsight.completion.CompletionContributor; +import com.intellij.codeInsight.completion.CompletionParameters; +import com.intellij.codeInsight.completion.CompletionResultSet; +import com.intellij.codeInsight.completion.CompletionType; +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.util.Computable; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiNamedElement; +import com.intellij.psi.PsiReference; +import com.intellij.psi.impl.source.xml.TagNameReference; +import com.intellij.psi.xml.XmlText; +import com.intellij.util.SmartList; +import com.intellij.util.xml.Converter; +import com.intellij.util.xml.ResolvingConverter; +import com.intellij.util.xml.impl.GenericDomValueReference; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.maven.dom.MavenDomUtil; +import org.jetbrains.idea.maven.dom.converters.MavenSmartConverter; + +import java.util.Collection; +import java.util.Collections; + +public class MavenSmartCompletionContributor extends CompletionContributor { + @Override + public void fillCompletionVariants(final CompletionParameters parameters, CompletionResultSet result) { + if (parameters.getCompletionType() != CompletionType.SMART) return; + + Collection variants = ApplicationManager.getApplication().runReadAction(new Computable>() { + @Override + public Collection compute() { + return getVariants(parameters); + } + }); + + for (Object each : variants) { + LookupElement e; + if (each instanceof LookupElement) { + e = (LookupElement)each; + } + else if (each instanceof String) { + e = LookupElementBuilder.create((String)each); + } + else if (each instanceof PsiNamedElement) { + e = LookupElementBuilder.create((PsiNamedElement)each); + } + else { + e = LookupElementBuilder.create(each, String.valueOf(each)); + } + result.addElement(e); + } + } + + @NotNull + private static Collection getVariants(CompletionParameters parameters) { + if (!MavenDomUtil.isMavenFile(parameters.getOriginalFile())) return Collections.emptyList(); + + SmartList result = new SmartList(); + + for (PsiReference each : getReferences(parameters)) { + if (each instanceof TagNameReference) continue; + + if (each instanceof GenericDomValueReference) { + GenericDomValueReference reference = (GenericDomValueReference)each; + + Converter converter = reference.getConverter(); + + if (converter instanceof MavenSmartConverter) { + result.addAll(((MavenSmartConverter)converter).getSmartVariants(reference.getConvertContext())); + } + else if (converter instanceof ResolvingConverter) { + //noinspection unchecked + result.addAll(((ResolvingConverter)converter).getVariants(reference.getConvertContext())); + } + } + else { + //noinspection unchecked + Collections.addAll((Collection)result, each.getVariants()); + } + } + return result; + } + + @NotNull + private static PsiReference[] getReferences(CompletionParameters parameters) { + PsiElement psiElement = parameters.getPosition().getParent(); + return psiElement instanceof XmlText ? psiElement.getParent().getReferences() : psiElement.getReferences(); + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/resources/META-INF/plugin.xml b/plugins/maven/src/main/resources/META-INF/plugin.xml index b74689b14b2c..d41f41b66e4c 100644 --- a/plugins/maven/src/main/resources/META-INF/plugin.xml +++ b/plugins/maven/src/main/resources/META-INF/plugin.xml @@ -66,8 +66,11 @@ - + @@ -96,8 +99,6 @@ -