UnboundNSFix fixed && tested
authorDmitry Avdeev <Dmitry.Avdeev@jetbrains.com>
Tue, 9 Feb 2010 15:00:23 +0000 (18:00 +0300)
committerDmitry Avdeev <Dmitry.Avdeev@jetbrains.com>
Tue, 9 Feb 2010 15:00:23 +0000 (18:00 +0300)
xml/impl/src/com/intellij/codeInsight/completion/ExtendedTagInsertHandler.java
xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/CreateNSDeclarationIntentionFix.java

index d935312f634ee4d2eb90e1f3da9009223d2fe121..5be5516534798a029ccdc0146372d0599927df23 100644 (file)
@@ -98,7 +98,7 @@ public class ExtendedTagInsertHandler extends XmlTagInsertHandler {
     try {
       final String prefixByNamespace = getPrefixByNamespace(file, myNamespace);
       if (myNamespacePrefix != null || StringUtil.isEmpty(prefixByNamespace)) {
-        final String nsPrefix = myNamespacePrefix == null ? suggestPrefix(file) : myNamespacePrefix;
+        final String nsPrefix = myNamespacePrefix == null ? suggestPrefix(file, myNamespace) : myNamespacePrefix;
         extension.insertNamespaceDeclaration(file, editor, Collections.singleton(myNamespace), nsPrefix, runAfter);
         FeatureUsageTracker.getInstance().triggerFeatureUsed(XmlCompletionContributor.TAG_NAME_COMPLETION_FEATURE);
       } else {
@@ -130,12 +130,12 @@ public class ExtendedTagInsertHandler extends XmlTagInsertHandler {
   }
 
   @Nullable
-  protected String suggestPrefix(XmlFile file) {
-    if (myNamespace == null) {
+  public static String suggestPrefix(XmlFile file, @Nullable String namespace) {
+    if (namespace == null) {
       return null;
     }
     for (XmlSchemaProvider provider : XmlSchemaProvider.getAvailableProviders(file)) {
-      String prefix = provider.getDefaultPrefix(myNamespace, file);
+      String prefix = provider.getDefaultPrefix(namespace, file);
       if (prefix != null) {
         return prefix;
       }
index 5029f682a74533e9f27123aabb4f0d8c2a6eea62..91e3b8d11f19001cd5e8d86e76c8ba9261bcb03c 100644 (file)
@@ -131,19 +131,26 @@ public class CreateNSDeclarationIntentionFix implements HintAction, LocalQuickFi
       project,
       new StringToAttributeProcessor() {
         public void doSomethingWithGivenStringToProduceXmlAttributeNowPlease(@NotNull final String namespace) throws IncorrectOperationException {
-          if (StringUtil.isEmpty(myNamespacePrefix)) {
+          String prefix = myNamespacePrefix;
+          if (StringUtil.isEmpty(prefix)) {
             final XmlExtension extension = XmlExtension.getExtension(myFile);
             final XmlFile xmlFile = extension.getContainingFile(myElement);
-            final String prefixByNamespace = ExtendedTagInsertHandler.getPrefixByNamespace(xmlFile, namespace);
-            if (prefixByNamespace != null) {
-              ExtendedTagInsertHandler.qualifyWithPrefix(prefixByNamespace, myElement);
+            prefix = ExtendedTagInsertHandler.getPrefixByNamespace(xmlFile, namespace);
+            if (StringUtil.isNotEmpty(prefix)) {
+              ExtendedTagInsertHandler.qualifyWithPrefix(prefix, myElement);
               return;
+            } else {
+              prefix = ExtendedTagInsertHandler.suggestPrefix(xmlFile, namespace);
+              if (StringUtil.isNotEmpty(prefix)) {
+                ExtendedTagInsertHandler.qualifyWithPrefix(prefix, myElement);
+                PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.getDocument());
+              }
             }
           }
           final int offset = editor.getCaretModel().getOffset();
           final RangeMarker marker = editor.getDocument().createRangeMarker(offset, offset);
           final XmlExtension extension = XmlExtension.getExtension(file);
-          extension.insertNamespaceDeclaration((XmlFile)file, editor, Collections.singleton(namespace), myNamespacePrefix, new XmlExtension.Runner<String, IncorrectOperationException>() {
+          extension.insertNamespaceDeclaration((XmlFile)file, editor, Collections.singleton(namespace), prefix, new XmlExtension.Runner<String, IncorrectOperationException>() {
             public void run(final String param) throws IncorrectOperationException {
               if (namespace.length() > 0) {
                 editor.getCaretModel().moveToOffset(marker.getStartOffset());