diff --git a/platform/util/src/com/intellij/util/xmlb/OptionTagBinding.java b/platform/util/src/com/intellij/util/xmlb/OptionTagBinding.java index b11cd341a3da..de45f1b0af91 100644 --- a/platform/util/src/com/intellij/util/xmlb/OptionTagBinding.java +++ b/platform/util/src/com/intellij/util/xmlb/OptionTagBinding.java @@ -42,14 +42,15 @@ class OptionTagBinding extends BasePrimitiveBinding { myValueAttribute = Constants.VALUE; } else { - myNameAttribute = optionTag.nameAttribute(); myValueAttribute = optionTag.valueAttribute(); String tagName = optionTag.tag(); - if (StringUtil.isEmpty(myNameAttribute) && Constants.OPTION.equals(tagName)) { + String nameAttribute = optionTag.nameAttribute(); + if (StringUtil.isEmpty(nameAttribute) && Constants.OPTION.equals(tagName)) { tagName = myAccessor.getName(); } myTagName = tagName; + myNameAttribute = tagName.equals(Constants.OPTION) || !nameAttribute.equals(Constants.NAME) ? StringUtil.nullize(nameAttribute) : null; } } @@ -59,7 +60,7 @@ class OptionTagBinding extends BasePrimitiveBinding { Object value = myAccessor.read(o); Element targetElement = new Element(myTagName); - if (!StringUtil.isEmpty(myNameAttribute)) { + if (myNameAttribute != null) { targetElement.setAttribute(myNameAttribute, myName); } @@ -119,14 +120,22 @@ class OptionTagBinding extends BasePrimitiveBinding { @Override public boolean isBoundTo(Object node) { - if (!(node instanceof Element)) return false; + if (!(node instanceof Element)) { + return false; + } + Element e = (Element)node; - if (!e.getName().equals(myTagName)) return false; + if (!e.getName().equals(myTagName)) { + return false; + } + String name = e.getAttributeValue(myNameAttribute); - if (StringUtil.isEmpty(myNameAttribute)) { + if (myNameAttribute == null) { return name == null || name.equals(myName); } - return name != null && name.equals(myName); + else { + return myName.equals(name); + } } @NonNls diff --git a/platform/util/src/com/intellij/util/xmlb/annotations/OptionTag.java b/platform/util/src/com/intellij/util/xmlb/annotations/OptionTag.java index 29eac3a31d13..792d0a5a1534 100644 --- a/platform/util/src/com/intellij/util/xmlb/annotations/OptionTag.java +++ b/platform/util/src/com/intellij/util/xmlb/annotations/OptionTag.java @@ -24,9 +24,13 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** + * Please consider to use annotation parameters only to achieve backward compatibility. Otherwise feel free to file issues about serialization cosmetics. + * *
Store value in tag like {@code }
*nameAttribute can be empty, in which case it is skipped: {@code }
* + * If {@link #tag} is specified but {@link #nameAttribute} is not, name attribute will not be added: {@code