maven: smart completion suggests basic variants in maven dom

This commit is contained in:
Anton Makeev
2010-11-18 12:51:39 +03:00
parent 2fe5ec91a2
commit 4d5400164e
5 changed files with 138 additions and 91 deletions
@@ -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<String> {
@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<String> getSmartVariants(ConvertContext convertContext) {
Set<String> groupIds = new HashSet<String>();
String artifactId = MavenArtifactCoordinatesHelper.getId(convertContext).getArtifactId();
@@ -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<T> {
Collection<T> getSmartVariants(ConvertContext convertContext);
}
@@ -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<String> 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();
}
}
@@ -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<Collection<?>>() {
@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<Object>();
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();
}
}
@@ -66,8 +66,11 @@
<dom.extender domClass="org.jetbrains.idea.maven.dom.model.MavenDomConfigurationParameter"
extenderClass="org.jetbrains.idea.maven.dom.MavenPluginConfigurationParameterDomExtender"/>
<completion.contributor language="any" implementationClass="org.jetbrains.idea.maven.dom.references.MavenPropertyCompletionContributor"
<completion.contributor language="any"
implementationClass="org.jetbrains.idea.maven.dom.references.MavenPropertyCompletionContributor"
id="Maven"/>
<completion.contributor language="XML"
implementationClass="org.jetbrains.idea.maven.dom.model.completion.MavenSmartCompletionContributor"/>
<psi.referenceContributor implementation="org.jetbrains.idea.maven.dom.references.MavenPropertyPsiReferenceContributor"/>
<usageTargetProvider implementation="org.jetbrains.idea.maven.dom.references.MavenUsageTargetProvider"/>
@@ -96,8 +99,6 @@
<gotoFileContributor implementation="org.jetbrains.idea.maven.utils.MavenGotoSettingsFileContibutor"/>
<fileTemplateGroup implementation="org.jetbrains.idea.maven.utils.MavenFileTemplateGroupFactory"/>
<completion.contributor language="XML"
implementationClass="org.jetbrains.idea.maven.dom.model.completion.MavenGroupIdSmartCompletionContributor"/>
<annotator language="XML" implementationClass="org.jetbrains.idea.maven.dom.annotator.MavenDomGutterAnnotator"/>
</extensions>