WEB-15430 Add Emmet support for JSX files/snippets
authorAlexander Zolotov <Alexander.Zolotov@jetbrains.com>
Tue, 24 Feb 2015 16:43:18 +0000 (19:43 +0300)
committerAlexander Zolotov <Alexander.Zolotov@jetbrains.com>
Tue, 24 Feb 2015 16:54:46 +0000 (19:54 +0300)
xml/impl/src/com/intellij/codeInsight/template/emmet/XmlEmmetParser.java
xml/impl/src/com/intellij/codeInsight/template/emmet/generators/XmlZenCodingGenerator.java
xml/impl/src/com/intellij/codeInsight/template/emmet/generators/ZenCodingGenerator.java
xml/impl/src/com/intellij/codeInsight/template/emmet/nodes/GenerationNode.java

index 100cc940091867a7ca832f97b6e7646c2c85e9bd..f08a52c3a63f31021f926b169f96b98e7ba65643 100644 (file)
@@ -74,6 +74,7 @@ public class XmlEmmetParser extends EmmetParser {
     put("object", "param");
     put("map", "area");
   }};
+  private boolean isHtml;
 
   public XmlEmmetParser(List<ZenCodingToken> tokens,
                         CustomTemplateCallback callback,
@@ -84,6 +85,7 @@ public class XmlEmmetParser extends EmmetParser {
     if (surroundWithTemplate && parentTag != null && context.getNode().getElementType() == XmlTokenType.XML_START_TAG_START) {
       parentTag = PsiTreeUtil.getParentOfType(parentTag, XmlTag.class);
     }
+    isHtml = generator.isHtml(callback);
     if (parentTag != null) {
       hasTagContext = true;
       tagLevel.push(parentTag.getName());
@@ -210,7 +212,7 @@ public class XmlEmmetParser extends EmmetParser {
 
   @Nullable
   private String getDefaultTemplateKey() {
-    return ZenCodingUtil.isHtml(myCallback) ? suggestTagName() : null;
+    return isHtml ? suggestTagName() : null;
   }
 
   @Nullable
index 0434ea054e07ec01b2b4f7664205544fd742560e..346c1528fee939d0baba1ffad37b6bb8f344a01d 100644 (file)
@@ -18,6 +18,7 @@ package com.intellij.codeInsight.template.emmet.generators;
 import com.intellij.application.options.emmet.EmmetOptions;
 import com.intellij.codeInsight.template.CustomTemplateCallback;
 import com.intellij.codeInsight.template.emmet.ZenCodingTemplate;
+import com.intellij.codeInsight.template.emmet.ZenCodingUtil;
 import com.intellij.codeInsight.template.emmet.tokens.TemplateToken;
 import com.intellij.codeInsight.template.impl.TemplateImpl;
 import com.intellij.diagnostic.AttachmentFactory;
@@ -124,4 +125,9 @@ public abstract class XmlZenCodingGenerator extends ZenCodingGenerator {
   public void disableEmmet() {
     EmmetOptions.getInstance().setEmmetEnabled(false);
   }
+
+  @Override
+  public boolean isHtml(@NotNull CustomTemplateCallback callback) {
+    return ZenCodingUtil.isHtml(callback);
+  }
 }
index e333a0f1bc2936df6f597534f45d79e6f1a2d075..025bae895a0249245ae67d9138953f6478510951 100644 (file)
@@ -148,6 +148,10 @@ public abstract class ZenCodingGenerator {
     return false;
   }
   
+  public boolean isHtml(@NotNull CustomTemplateCallback callback) {
+    return false;
+  }
+  
   public void disableEmmet() {
   }
 }
index f83263a72b9178e8d5a3a6d66efda136bcc09bfc..be969593947ea404978d1c6b1715f42ab22f46fa 100644 (file)
@@ -49,6 +49,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
 import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.psi.xml.*;
 import com.intellij.util.LocalTimeCounter;
+import com.intellij.util.ObjectUtils;
 import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.containers.HashMap;
 import com.intellij.util.containers.HashSet;
@@ -276,6 +277,8 @@ public class GenerationNode extends UserDataHolderBase {
     /*assert generator == null || generator instanceof XmlZenCodingGenerator :
       "The generator cannot process TemplateToken because it doesn't inherit XmlZenCodingGenerator";*/
 
+    ZenCodingGenerator zenCodingGenerator = ObjectUtils.notNull(generator, XmlZenCodingGeneratorImpl.INSTANCE);
+    
     Map<String, String> attributes = token.getAttributes();
     TemplateImpl template = token.getTemplate();
     assert template != null;
@@ -307,7 +310,7 @@ public class GenerationNode extends UserDataHolderBase {
         }
       }
       XmlTag tag1 = hasChildren ? expandEmptyTagIfNecessary(tag) : tag;
-      setAttributeValues(tag1, attributes, callback);
+      setAttributeValues(tag1, attributes, callback, zenCodingGenerator.isHtml(callback));
       XmlFile physicalFile = (XmlFile)fileFactory.createFileFromText(HTMLLanguage.INSTANCE, tag1.getContainingFile().getText());
       VirtualFile vFile = physicalFile.getVirtualFile();
       if (vFile != null) {
@@ -315,7 +318,6 @@ public class GenerationNode extends UserDataHolderBase {
       }
       token.setFile(physicalFile);
     }
-    ZenCodingGenerator zenCodingGenerator = generator != null ? generator : XmlZenCodingGeneratorImpl.INSTANCE;
     template = zenCodingGenerator.generateTemplate(token, hasChildren, callback.getContext());
     removeVariablesWhichHasNoSegment(template);
     return template;
@@ -445,7 +447,10 @@ public class GenerationNode extends UserDataHolderBase {
     return predefinedValues;
   }
 
-  private void setAttributeValues(@NotNull XmlTag tag, @NotNull final Map<String, String> attributes, CustomTemplateCallback callback) {
+  private void setAttributeValues(@NotNull XmlTag tag,
+                                  @NotNull final Map<String, String> attributes,
+                                  @NotNull CustomTemplateCallback callback, 
+                                  boolean isHtml) {
     // default and implied attributes
     final String defaultAttributeValue = attributes.get(XmlEmmetParser.DEFAULT_ATTRIBUTE_NAME);
     if (defaultAttributeValue != null) {
@@ -495,7 +500,7 @@ public class GenerationNode extends UserDataHolderBase {
         myContainsSurroundedTextMarker = true;
       }
 
-      if (isBooleanAttribute(attributeValue, xmlAttribute, callback)) {
+      if (isHtml && isBooleanAttribute(attributeValue, xmlAttribute, callback)) {
         if (HtmlUtil.isShortNotationOfBooleanAttributePreferred()) {
           if (xmlAttributeValueElement != null) {
             final PsiElement prevSibling = xmlAttributeValueElement.getPrevSibling();
@@ -536,7 +541,7 @@ public class GenerationNode extends UserDataHolderBase {
     if (XmlEmmetParser.BOOLEAN_ATTRIBUTE_VALUE.equals(attributeValue)) {
       return true;
     }
-    if (ZenCodingUtil.isHtml(callback) && StringUtil.isEmpty(attributeValue)) {
+    if (StringUtil.isEmpty(attributeValue)) {
       final XmlAttributeDescriptor descriptor = xmlAttribute.getDescriptor();
       return descriptor != null && HtmlUtil.isBooleanAttribute(descriptor, callback.getContext());
     }