IDEA-CR-15780 do not write default context values appcode/171.1051
authorVladimir Krivosheev <vladimir.krivosheev@jetbrains.com>
Thu, 17 Nov 2016 13:34:42 +0000 (14:34 +0100)
committerVladimir Krivosheev <vladimir.krivosheev@jetbrains.com>
Thu, 17 Nov 2016 13:35:38 +0000 (14:35 +0100)
java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy
platform/configuration-store-impl/testSrc/TemplateSchemeTest.kt
platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateTree.java
platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateContext.java
platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSettings.java

index 792af508a0a2e409a324982f053bc7b753e550c2..847c24646bd9c141be6f260a50ff2a2226cc161b 100644 (file)
@@ -665,14 +665,12 @@ class Outer {
 
     def copy = defContext.createCopy()
 
-    def write = new Element("context")
-    copy.writeTemplateContext(write)
+    def write = copy.writeTemplateContext(null)
     assert write.children.size() == 2 : JDOMUtil.writeElement(write)
 
     copy.setEnabled(TemplateContextType.EP_NAME.findExtension(JavaCommentContextType), false)
 
-    write = new Element("context")
-    copy.writeTemplateContext(write)
+    write = copy.writeTemplateContext(null)
     assert write.children.size() == 3 : JDOMUtil.writeElement(write)
   }
 
@@ -700,8 +698,7 @@ class Outer {
     def javaContext = TemplateContextType.EP_NAME.findExtension(JavaCodeContextType.Generic)
     context.setEnabled(javaContext, true)
 
-    def saved = new Element('context')
-    context.writeTemplateContext(saved)
+    def saved = context.writeTemplateContext(null)
 
     context = new TemplateContext()
     context.readTemplateContext(saved)
index 58ad90361a334cf1121b80af134ebdcf0e8e8ab0..dc55a44cd96f50e9d9ea94f7a0a35dc77ceff5a2 100644 (file)
@@ -30,6 +30,7 @@ class TemplateSchemeTest {
       <template name="serr" value="System.err.println(&quot;$\END$&quot;)dwed" description="Prints a string to System.errwefwe" toReformat="true" toShortenFQNames="true" deactivated="true">
         <context>
           <option name="__DO_NOT_DELETE_ME__" value="true" />
+          <option name="GROOVY_STATEMENT" value="false" />
         </context>
       </template>
     </templateSet>""".trimIndent()
index d3cd1e3e820c1046d3ae581f931aa3463f31f6b3..401423f19bbd8c6e68cf9a0e1627af369742c5e8 100644 (file)
@@ -88,10 +88,11 @@ class LiveTemplateTree extends CheckboxTree implements DataProvider, CopyProvide
   public void performCopy(@NotNull DataContext dataContext) {
     final Set<TemplateImpl> templates = myConfigurable.getSelectedTemplates().keySet();
 
-
+    TemplateSettings templateSettings = TemplateSettings.getInstance();
     CopyPasteManager.getInstance().setContents(
       new StringSelection(StringUtil.join(templates,
-                                          template -> JDOMUtil.writeElement(TemplateSettings.serializeTemplate(template)),
+                                          template -> JDOMUtil.writeElement(
+                                            TemplateSettings.serializeTemplate(template, templateSettings.getDefaultTemplate(template))),
                                           SystemProperties.getLineSeparator())));
     
   }
index a6c13fa2fef8591e73d416ccf22e7ab242a39e35..ab0ef669677e741c471070a7128748c7df98301e 100644 (file)
@@ -123,9 +123,10 @@ public class TemplateContext {
   }
 
   @VisibleForTesting
-  public void writeTemplateContext(@NotNull Element element) {
+  @Nullable
+  public Element writeTemplateContext(@Nullable TemplateContext defaultContext) {
     if (myContextStates.isEmpty()) {
-      return;
+      return null;
     }
 
     Map<String, TemplateContextType> idToType = new THashMap<>();
@@ -133,6 +134,7 @@ public class TemplateContext {
       idToType.put(type.getContextId(), type);
     }
 
+    Element element = new Element(TemplateSettings.CONTEXT);
     for (Map.Entry<String, Boolean> entry : myContextStates.entrySet()) {
       Boolean ownValue = entry.getValue();
       if (ownValue == null) {
@@ -144,14 +146,30 @@ public class TemplateContext {
         // https://youtrack.jetbrains.com/issue/IDEA-155623#comment=27-1721029
         JdomKt.addOptionTag(element, entry.getKey(), ownValue.toString());
       }
-      else {
-        TemplateContextType base = type.getBaseContextType();
-        boolean baseEnabled = base != null && isEnabled(base);
-        if (ownValue != baseEnabled) {
-          JdomKt.addOptionTag(element, type.getContextId(), ownValue.toString());
-        }
+      else if (isNotDefault(ownValue, type, defaultContext)) {
+        JdomKt.addOptionTag(element, type.getContextId(), ownValue.toString());
       }
     }
+    return element;
+  }
+
+  /**
+   * Default value for GROOVY_STATEMENT is `true` (defined in the `plugins/groovy/groovy-psi/resources/liveTemplates/Groovy.xml`).
+   * Base value is `false`.
+   *
+   * If default value is defined (as in our example) — we must not take base value in account.
+   * Because on init `setDefaultContext` will be called and we will have own value.
+   * Otherwise it will be not possible to set value for `GROOVY_STATEMENT` neither to `true` (equals to default), nor to `false` (equals to base).
+   * See TemplateSchemeTest.
+   */
+  boolean isNotDefault(@NotNull Boolean ownValue, @NotNull TemplateContextType type, @Nullable TemplateContext defaultContext) {
+    Boolean defaultValue = defaultContext == null ? null : defaultContext.getOwnValue(type);
+    if (defaultValue == null) {
+      TemplateContextType base = type.getBaseContextType();
+      boolean baseEnabled = base != null && isEnabled(base);
+      return ownValue != baseEnabled;
+    }
+    return !ownValue.equals(defaultValue);
   }
 
   @Override
index 7594043c034ed252abef4ea5c458d52e1fc0ce6a..e7b4c6ec593ae44916fb0e4c8197c8b161e379f4 100644 (file)
@@ -83,7 +83,7 @@ public class TemplateSettings implements PersistentStateComponent<TemplateSettin
   @NonNls private static final String DEFAULT_VALUE = "defaultValue";
   @NonNls private static final String ALWAYS_STOP_AT = "alwaysStopAt";
 
-  @NonNls private static final String CONTEXT = "context";
+  @NonNls static final String CONTEXT = "context";
   @NonNls private static final String TO_REFORMAT = "toReformat";
   @NonNls private static final String TO_SHORTEN_FQ_NAMES = "toShortenFQNames";
   @NonNls private static final String USE_STATIC_IMPORT = "useStaticImport";
@@ -214,8 +214,9 @@ public class TemplateSettings implements PersistentStateComponent<TemplateSettin
         templateSetElement.setAttribute(GROUP, template.getName());
 
         for (TemplateImpl t : template.getElements()) {
-          if (differsFromDefault(t)) {
-            templateSetElement.addContent(serializeTemplate(t));
+          TemplateImpl defaultTemplate = getDefaultTemplate(t);
+          if (defaultTemplate == null || !t.equals(defaultTemplate) || !t.contextsEqual(defaultTemplate)) {
+            templateSetElement.addContent(serializeTemplate(t, defaultTemplate));
           }
         }
 
@@ -582,7 +583,7 @@ public class TemplateSettings implements PersistentStateComponent<TemplateSettin
   }
 
   @NotNull
-  static Element serializeTemplate(@NotNull TemplateImpl template) {
+  static Element serializeTemplate(@NotNull TemplateImpl template, @Nullable TemplateImpl defaultTemplate) {
     Element element = new Element(TEMPLATE);
     final String id = template.getId();
     if (id != null) {
@@ -621,9 +622,10 @@ public class TemplateSettings implements PersistentStateComponent<TemplateSettin
       element.addContent(variableElement);
     }
 
-    Element contextElement = new Element(CONTEXT);
-    template.getTemplateContext().writeTemplateContext(contextElement);
-    element.addContent(contextElement);
+    Element contextElement = template.getTemplateContext().writeTemplateContext(defaultTemplate == null ? null : defaultTemplate.getTemplateContext());
+    if (contextElement != null) {
+      element.addContent(contextElement);
+    }
     return element;
   }