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)
}
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)
<template name="serr" value="System.err.println("$\END$")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()
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())));
}
}
@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<>();
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) {
// 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
@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";
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));
}
}
}
@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) {
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;
}