XmlNoVariantsDelegator
authorDmitry Avdeev <Dmitry.Avdeev@jetbrains.com>
Mon, 19 Dec 2011 09:46:13 +0000 (13:46 +0400)
committerDmitry Avdeev <Dmitry.Avdeev@jetbrains.com>
Mon, 19 Dec 2011 09:46:13 +0000 (13:46 +0400)
java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java
platform/lang-impl/src/com/intellij/codeInsight/completion/NoVariantsDelegator.java [new file with mode: 0644]
platform/platform-resources/src/META-INF/XmlPlugin.xml
xml/impl/src/com/intellij/codeInsight/completion/XmlCompletionContributor.java
xml/impl/src/com/intellij/codeInsight/completion/XmlNoVariantsDelegator.java [new file with mode: 0644]

index e3c81663a4fcab3e343e8490e023dc70df5435d3..9dcfb4a9f016b848c50eaa671d7a25a0437ddeda 100644 (file)
@@ -17,54 +17,38 @@ package com.intellij.codeInsight.completion;
 
 import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
 import com.intellij.codeInsight.lookup.LookupElement;
-import com.intellij.openapi.util.Ref;
 import com.intellij.util.Consumer;
 
 /**
  * @author peter
  */
-public class JavaNoVariantsDelegator extends CompletionContributor {
+public class JavaNoVariantsDelegator extends NoVariantsDelegator {
 
   @Override
-  public void fillCompletionVariants(final CompletionParameters parameters, final CompletionResultSet result) {
-    final Ref<Boolean> empty = Ref.create(true);
-    Consumer<CompletionResult> passResult = new Consumer<CompletionResult>() {
-      public void consume(final CompletionResult lookupElement) {
-        empty.set(false);
-        result.passResult(lookupElement);
-      }
-    };
-    result.runRemainingContributors(parameters, passResult);
+  protected void delegate(CompletionParameters parameters, CompletionResultSet result, Consumer<CompletionResult> passResult) {
+    if (parameters.getCompletionType() == CompletionType.BASIC &&
+        parameters.getInvocationCount() <= 1 &&
+        JavaCompletionContributor.mayStartClassName(result, false) &&
+        JavaCompletionContributor.isClassNamePossible(parameters.getPosition())) {
+      final ClassByNameMerger merger = new ClassByNameMerger(parameters.getInvocationCount() == 0, result);
 
-    if (!empty.get() && parameters.getInvocationCount() == 0) {
-      result.restartCompletionWhenNothingMatches();
-    }
-
-    if (empty.get()) {
-      if (parameters.getCompletionType() == CompletionType.BASIC &&
-          parameters.getInvocationCount() <= 1 &&
-          JavaCompletionContributor.mayStartClassName(result, false) &&
-          JavaCompletionContributor.isClassNamePossible(parameters.getPosition())) {
-        final ClassByNameMerger merger = new ClassByNameMerger(parameters.getInvocationCount() == 0, result);
-        
-        JavaClassNameCompletionContributor.addAllClasses(parameters, JavaCompletionSorting.addJavaSorting(parameters, result),
-                                                         true, new Consumer<LookupElement>() {
-          @Override
-          public void consume(LookupElement element) {
-            JavaPsiClassReferenceElement classElement = element.as(JavaPsiClassReferenceElement.CLASS_CONDITION_KEY);
-            if (classElement != null) {
-              classElement.setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE);
-            }
-            
-            merger.consume(classElement);
+      JavaClassNameCompletionContributor.addAllClasses(parameters, JavaCompletionSorting.addJavaSorting(parameters, result),
+                                                       true, new Consumer<LookupElement>() {
+        @Override
+        public void consume(LookupElement element) {
+          JavaPsiClassReferenceElement classElement = element.as(JavaPsiClassReferenceElement.CLASS_CONDITION_KEY);
+          if (classElement != null) {
+            classElement.setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE);
           }
-        });
 
-        merger.finishedClassProcessing();
+          merger.consume(classElement);
+        }
+      });
+
+      merger.finishedClassProcessing();
 
-      } else if (parameters.getCompletionType() == CompletionType.SMART && parameters.getInvocationCount() == 2) {
-        result.runRemainingContributors(parameters.withInvocationCount(3), passResult);
-      }
+    } else if (parameters.getCompletionType() == CompletionType.SMART && parameters.getInvocationCount() == 2) {
+      result.runRemainingContributors(parameters.withInvocationCount(3), passResult);
     }
   }
 }
diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/NoVariantsDelegator.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/NoVariantsDelegator.java
new file mode 100644 (file)
index 0000000..8830708
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2000-2011 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 com.intellij.codeInsight.completion;
+
+import com.intellij.openapi.util.Ref;
+import com.intellij.util.Consumer;
+
+/**
+ * @author Dmitry Avdeev
+ *         Date: 12/19/11
+ */
+public abstract class NoVariantsDelegator extends CompletionContributor {
+
+  @Override
+  public void fillCompletionVariants(final CompletionParameters parameters, final CompletionResultSet result) {
+    final Ref<Boolean> empty = Ref.create(true);
+    Consumer<CompletionResult> passResult = new Consumer<CompletionResult>() {
+      public void consume(final CompletionResult lookupElement) {
+        empty.set(false);
+        result.passResult(lookupElement);
+      }
+    };
+    result.runRemainingContributors(parameters, passResult);
+
+    if (!empty.get() && parameters.getInvocationCount() == 0) {
+      result.restartCompletionWhenNothingMatches();
+    }
+
+    if (empty.get()) {
+      delegate(parameters, result, passResult);
+    }
+  }
+
+  protected abstract void delegate(CompletionParameters parameters, CompletionResultSet result, Consumer<CompletionResult> passResult);
+}
index 35e5c4d046283742e2635d4226d0e8f094230ba2..678706f07a584af62d9a3c12f35a3ca67d2dfc4a 100644 (file)
@@ -73,6 +73,8 @@
     <completion.contributor language="any" implementationClass="com.intellij.codeInsight.completion.XmlCompletionContributor" id="xml"
                             order="first"/>
 
+    <completion.contributor language="XML" implementationClass="com.intellij.codeInsight.completion.XmlNoVariantsDelegator" order="after xml"/>
+
     <completion.confidence language="XML" implementationClass="com.intellij.codeInsight.completion.XmlNameCompletionConfidence" id="xml"/>
     <completion.confidence language="HTML" implementationClass="com.intellij.codeInsight.completion.XmlNameCompletionConfidence" id="html"/>
 
index 5e1c167394e0849e3d01c5802c05c6dffa43da7f..cc1196429104b0270c183bde8cf3b848bb23aee1 100644 (file)
@@ -28,6 +28,7 @@ import com.intellij.openapi.util.Key;
 import com.intellij.openapi.util.Pair;
 import com.intellij.openapi.util.Ref;
 import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.patterns.PlatformPatterns;
 import com.intellij.patterns.XmlPatterns;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiReference;
@@ -82,7 +83,7 @@ public class XmlCompletionContributor extends CompletionContributor {
 
   public XmlCompletionContributor() {
     extend(CompletionType.BASIC,
-           XmlPatterns.psiElement().inside(XmlPatterns.xmlAttributeValue()),
+           PlatformPatterns.psiElement().inside(XmlPatterns.xmlAttributeValue()),
            new CompletionProvider<CompletionParameters>() {
              @Override
              protected void addCompletions(@NotNull CompletionParameters parameters,
@@ -118,10 +119,7 @@ public class XmlCompletionContributor extends CompletionContributor {
 
   public static boolean isXmlNameCompletion(final CompletionParameters parameters) {
     final ASTNode node = parameters.getPosition().getNode();
-    if (node == null || node.getElementType() != XmlTokenType.XML_NAME) {
-      return false;
-    }
-    return true;
+    return node != null && node.getElementType() == XmlTokenType.XML_NAME;
   }
 
   public void fillCompletionVariants(final CompletionParameters parameters, final CompletionResultSet result) {
@@ -133,43 +131,48 @@ public class XmlCompletionContributor extends CompletionContributor {
     final PsiElement element = parameters.getPosition();
 
     if (parameters.getCompletionType() == CompletionType.CLASS_NAME) {
-      if (!isXmlNameCompletion(parameters)) return;
-      result.stopHere();
-      if (!(element.getParent() instanceof XmlTag)) {
-        return;
-      }
-      final XmlTag parent = (XmlTag)element.getParent();
-      final String namespace = parent.getNamespace();
-      final XmlElementDescriptor parentDescriptor = parent.getDescriptor();
-      final String prefix = result.getPrefixMatcher().getPrefix();
-      final int pos = prefix.indexOf(':');
-      final String namespacePrefix = pos > 0 ? prefix.substring(0, pos) : null;
-
-      final PsiReference reference = parent.getReference();
-      if (reference != null && namespace.length() > 0 && parentDescriptor != null && !(parentDescriptor instanceof AnyXmlElementDescriptor)) {
-        final Set<LookupElement> set = new HashSet<LookupElement>();
-        new XmlCompletionData().completeReference(reference, set, element, parameters.getOriginalFile(), parameters.getOffset());
-        for (final LookupElement item : set) {
-          result.addElement(item);
-        }
-      }
-      else {
+      completeTagName(parameters, result);
+    }
 
-        final CompletionResultSet newResult = result.withPrefixMatcher(pos >= 0 ? prefix.substring(pos + 1) : prefix);
+    else if (parameters.getCompletionType() == CompletionType.SMART) {
+      new XmlSmartCompletionProvider().complete(parameters, result, element);
+    }
+  }
 
-        final XmlFile file = (XmlFile)parameters.getOriginalFile();
-        final List<Pair<String,String>> names = XmlExtension.getExtension(file).getAvailableTagNames(file, parent);
-        for (Pair<String, String> pair : names) {
-          final String name = pair.getFirst();
-          final String ns = pair.getSecond();
-          final LookupElement item = createLookupElement(name, ns, ns, namespacePrefix);
-          newResult.addElement(item);
-        }
+  static void completeTagName(CompletionParameters parameters, CompletionResultSet result) {
+    PsiElement element = parameters.getPosition();
+    if (!isXmlNameCompletion(parameters)) return;
+    result.stopHere();
+    if (!(element.getParent() instanceof XmlTag) || !(parameters.getOriginalFile() instanceof XmlFile)) {
+      return;
+    }
+    final XmlTag parent = (XmlTag)element.getParent();
+    final String namespace = parent.getNamespace();
+    final XmlElementDescriptor parentDescriptor = parent.getDescriptor();
+    final String prefix = result.getPrefixMatcher().getPrefix();
+    final int pos = prefix.indexOf(':');
+    final String namespacePrefix = pos > 0 ? prefix.substring(0, pos) : null;
+
+    final PsiReference reference = parent.getReference();
+    if (reference != null && namespace.length() > 0 && parentDescriptor != null && !(parentDescriptor instanceof AnyXmlElementDescriptor)) {
+      final Set<LookupElement> set = new HashSet<LookupElement>();
+      new XmlCompletionData().completeReference(reference, set, element, parameters.getOriginalFile(), parameters.getOffset());
+      for (final LookupElement item : set) {
+        result.addElement(item);
       }
     }
+    else {
 
-    else if (parameters.getCompletionType() == CompletionType.SMART) {
-      new XmlSmartCompletionProvider().complete(parameters, result, element);
+      final CompletionResultSet newResult = result.withPrefixMatcher(pos >= 0 ? prefix.substring(pos + 1) : prefix);
+
+      final XmlFile file = (XmlFile)parameters.getOriginalFile();
+      final List<Pair<String,String>> names = XmlExtension.getExtension(file).getAvailableTagNames(file, parent);
+      for (Pair<String, String> pair : names) {
+        final String name = pair.getFirst();
+        final String ns = pair.getSecond();
+        final LookupElement item = createLookupElement(name, ns, ns, namespacePrefix);
+        newResult.addElement(item);
+      }
     }
   }
 
diff --git a/xml/impl/src/com/intellij/codeInsight/completion/XmlNoVariantsDelegator.java b/xml/impl/src/com/intellij/codeInsight/completion/XmlNoVariantsDelegator.java
new file mode 100644 (file)
index 0000000..eee41f1
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2000-2011 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 com.intellij.codeInsight.completion;
+
+import com.intellij.util.Consumer;
+
+/**
+ * @author Dmitry Avdeev
+ *         Date: 12/19/11
+ */
+public class XmlNoVariantsDelegator extends NoVariantsDelegator {
+
+  @Override
+  protected void delegate(CompletionParameters parameters, CompletionResultSet result, Consumer<CompletionResult> passResult) {
+    if (parameters.getCompletionType() == CompletionType.BASIC) {
+      XmlCompletionContributor.completeTagName(parameters, result);
+    }
+  }
+}