fix assertion (EA-20597)
authorEugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com>
Tue, 1 Jun 2010 14:50:34 +0000 (18:50 +0400)
committerEugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com>
Tue, 1 Jun 2010 14:50:34 +0000 (18:50 +0400)
xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java
xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingTemplate.java

index 21274dd639f949916aa0ef386738198447b534e2..5ad53eec3a94223b306fa3b464cd95564e659e8c 100644 (file)
@@ -17,6 +17,7 @@ package com.intellij.codeInsight.template.zencoding;
 
 import com.intellij.codeInsight.template.CustomTemplateCallback;
 import com.intellij.codeInsight.template.impl.TemplateImpl;
+import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.fileTypes.StdFileTypes;
 import com.intellij.openapi.util.Pair;
@@ -306,21 +307,19 @@ class XmlZenCodingInterpreter {
 
   private static void invokeTemplate(TemplateToken token,
                                      final CustomTemplateCallback callback,
-                                     int numberInIteration,
+                                     final int numberInIteration,
                                      String filter) {
     if (token instanceof XmlTemplateToken && token.getTemplate() != null) {
       XmlTemplateToken xmlTemplateToken = (XmlTemplateToken)token;
-      List<Pair<String, String>> attr2value = new ArrayList<Pair<String, String>>(xmlTemplateToken.getAttribute2Value());
+      final List<Pair<String, String>> attr2value = new ArrayList<Pair<String, String>>(xmlTemplateToken.getAttribute2Value());
       TemplateImpl modifiedTemplate = token.getTemplate().copy();
-      XmlTag tag = xmlTemplateToken.getTag();
+      final XmlTag tag = xmlTemplateToken.getTag();
       if (tag != null) {
-        for (Iterator<Pair<String, String>> iterator = attr2value.iterator(); iterator.hasNext();) {
-          Pair<String, String> pair = iterator.next();
-          if (tag.getAttribute(pair.first) != null) {
-            tag.setAttribute(pair.first, ZenCodingUtil.getValue(pair, numberInIteration));
-            iterator.remove();
+        ApplicationManager.getApplication().runWriteAction(new Runnable() {
+          public void run() {
+            setAttributeValues(tag, attr2value, numberInIteration);
           }
-        }
+        });
         String s = filterXml(tag, callback, filter);
         assert s != null;
         if (HtmlUtil.isHtmlBlockTagL(tag.getName())) {
@@ -350,6 +349,16 @@ class XmlZenCodingInterpreter {
     }
   }
 
+  private static void setAttributeValues(XmlTag tag, List<Pair<String, String>> attr2value, int numberInIteration) {
+    for (Iterator<Pair<String, String>> iterator = attr2value.iterator(); iterator.hasNext();) {
+      Pair<String, String> pair = iterator.next();
+      if (tag.getAttribute(pair.first) != null) {
+        tag.setAttribute(pair.first, ZenCodingUtil.getValue(pair, numberInIteration));
+        iterator.remove();
+      }
+    }
+  }
+
   @Nullable
   private static String filterXml(XmlTag tag, CustomTemplateCallback callback, String filterSuffix) {
     PsiElement context = callback.getContext();
index 080397ba94f545ac3b7c37925be4798e88776014..27bff77fc33b3cce073814c5d810a8a0c1934644 100644 (file)
@@ -20,6 +20,7 @@ import com.intellij.codeInsight.template.CustomTemplateCallback;
 import com.intellij.codeInsight.template.TemplateInvokationListener;
 import com.intellij.codeInsight.template.impl.TemplateImpl;
 import com.intellij.lang.xml.XMLLanguage;
+import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.fileTypes.FileType;
 import com.intellij.openapi.fileTypes.StdFileTypes;
@@ -191,7 +192,7 @@ public class XmlZenCodingTemplate extends ZenCodingTemplate {
     if (template == null && !isXML11ValidQName(prefix)) {
       return null;
     }
-    XmlTemplateToken token = parseSelectors(key);
+    final XmlTemplateToken token = parseSelectors(key);
     if (token == null) {
       return null;
     }
@@ -203,13 +204,17 @@ public class XmlZenCodingTemplate extends ZenCodingTemplate {
     }
     assert prefix.equals(token.getKey());
     token.setTemplate(template);
-    XmlTag tag = parseXmlTagInTemplate(template.getString(), callback, true);
+    final XmlTag tag = parseXmlTagInTemplate(template.getString(), callback, true);
     if (token.getAttribute2Value().size() > 0 && tag == null) {
       return null;
     }
     if (tag != null) {
       if (!XmlZenCodingInterpreter.containsAttrsVar(template) && token.getAttribute2Value().size() > 0) {
-        addMissingAttributes(tag, token.getAttribute2Value());
+        ApplicationManager.getApplication().runWriteAction(new Runnable() {
+          public void run() {
+            addMissingAttributes(tag, token.getAttribute2Value());
+          }
+        });
       }
       token.setTag(tag);
     }