From ab2f829e663f18dd1df5d868de61ae0e9b24796b Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 22 Aug 2012 18:41:42 +0400 Subject: [PATCH] namespace support for DOM stubs --- .../src/com/intellij/util/io/StringRef.java | 7 +++++ .../util/xml/impl/DomInvocationHandler.java | 7 ++--- .../util/xml/stubs/AttributeStub.java | 4 +-- .../xml/stubs/AttributeStubSerializer.java | 3 ++- .../com/intellij/util/xml/stubs/DomStub.java | 27 +++++++++++++------ .../intellij/util/xml/stubs/ElementStub.java | 7 ++--- .../util/xml/stubs/ElementStubSerializer.java | 3 ++- .../com/intellij/util/xml/stubs/FileStub.java | 4 +-- .../xml/stubs/builder/DomStubBuilder.java | 2 +- .../stubs/builder/DomStubBuilderVisitor.java | 12 ++++++--- 10 files changed, 52 insertions(+), 24 deletions(-) diff --git a/platform/util/src/com/intellij/util/io/StringRef.java b/platform/util/src/com/intellij/util/io/StringRef.java index 238ded4a9122..74a0cd573792 100644 --- a/platform/util/src/com/intellij/util/io/StringRef.java +++ b/platform/util/src/com/intellij/util/io/StringRef.java @@ -19,6 +19,8 @@ */ package com.intellij.util.io; +import org.jetbrains.annotations.NotNull; + import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; @@ -98,6 +100,11 @@ public class StringRef { return source == null ? null : new StringRef(source); } + @NotNull + public static StringRef fromNullableString(String source) { + return source == null ? new StringRef("") : new StringRef(source); + } + public static StringRef fromStream(DataInput in, AbstractStringEnumerator store) throws IOException { final int nameId = DataInputOutputUtil.readINT(in); diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/DomInvocationHandler.java b/xml/dom-impl/src/com/intellij/util/xml/impl/DomInvocationHandler.java index 090080e2a739..166bbaba3c5b 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/DomInvocationHandler.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/DomInvocationHandler.java @@ -557,9 +557,10 @@ public abstract class DomInvocationHandler info) { final FixedChildDescriptionImpl description = info.first; - final EvaluatedXmlName evaluatedXmlName = createEvaluatedXmlName(description.getXmlName()); + XmlName xmlName = description.getXmlName(); + final EvaluatedXmlName evaluatedXmlName = createEvaluatedXmlName(xmlName); if (myStub != null && description.isStubbed()) { - List stubs = myStub.getChildrenByName(description.getXmlName().getLocalName()); + List stubs = myStub.getChildrenByName(xmlName.getLocalName(), xmlName.getNamespaceKey()); DomStub stub = stubs.isEmpty() ? null : stubs.get(0); DomParentStrategy strategy = stub == null ? new StubParentStrategy.Empty(myStub) : new StubParentStrategy(stub); return new IndexedElementInvocationHandler(evaluatedXmlName, description, 0, strategy, myManager, (ElementStub)stub); @@ -771,7 +772,7 @@ public abstract class DomInvocationHandler stubs = myStub.getChildrenByName(xmlName.getLocalName()); + List stubs = myStub.getChildrenByName(xmlName.getLocalName(), xmlName.getNamespaceKey()); return ContainerUtil.map(stubs, new Function() { @Override public DomElement fun(DomStub stub) { diff --git a/xml/dom-impl/src/com/intellij/util/xml/stubs/AttributeStub.java b/xml/dom-impl/src/com/intellij/util/xml/stubs/AttributeStub.java index bf542b63c7e2..552675235ce8 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/stubs/AttributeStub.java +++ b/xml/dom-impl/src/com/intellij/util/xml/stubs/AttributeStub.java @@ -29,8 +29,8 @@ public class AttributeStub extends DomStub { private final String myValue; - public AttributeStub(DomStub parent, StringRef name, String value) { - super(parent, name); + public AttributeStub(DomStub parent, StringRef name, StringRef namespace, String value) { + super(parent, name, namespace); myValue = value; } diff --git a/xml/dom-impl/src/com/intellij/util/xml/stubs/AttributeStubSerializer.java b/xml/dom-impl/src/com/intellij/util/xml/stubs/AttributeStubSerializer.java index c79e6d9be61e..2a091a9f0256 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/stubs/AttributeStubSerializer.java +++ b/xml/dom-impl/src/com/intellij/util/xml/stubs/AttributeStubSerializer.java @@ -38,12 +38,13 @@ public class AttributeStubSerializer implements ObjectStubSerializer { - protected final StringRef myName; + protected final StringRef myLocalName; + private final StringRef myNamespace; private DomInvocationHandler myHandler; - public DomStub(DomStub parent, StringRef name) { + public DomStub(DomStub parent, @NotNull StringRef localName, StringRef namespace) { super(parent); + myNamespace = namespace; if (parent != null) { ((ElementStub)parent).addChild(this); } - myName = name; + myLocalName = localName; } public abstract List getChildrenStubs(); public int getChildIndex(DomStub child) { - List stubs = getChildrenByName(XmlUtil.getLocalName(child.getName())); + List stubs = getChildrenByName(XmlUtil.getLocalName(child.getName()), child.getNamespaceKey()); return stubs.indexOf(child); } public String getName() { - return myName.getString(); + return myLocalName.getString(); } - public List getChildrenByName(final CharSequence localName) { + public String getNamespaceKey() { + return myNamespace.getString(); + } + + public List getChildrenByName(final CharSequence name, final String nsKey) { + final String s = nsKey == null ? "" : nsKey; return ContainerUtil.filter(getChildrenStubs(), new Condition() { @Override public boolean value(DomStub stub) { - return stub instanceof ElementStub && XmlUtil.getLocalName(stub.getName()).equals(localName); + return XmlUtil.getLocalName(stub.getName()).equals(name) && stub.getNamespaceKey().equals(s); } }); } diff --git a/xml/dom-impl/src/com/intellij/util/xml/stubs/ElementStub.java b/xml/dom-impl/src/com/intellij/util/xml/stubs/ElementStub.java index b5e5bd33e1cc..2c804a1aaab8 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/stubs/ElementStub.java +++ b/xml/dom-impl/src/com/intellij/util/xml/stubs/ElementStub.java @@ -18,6 +18,7 @@ package com.intellij.util.xml.stubs; import com.intellij.psi.stubs.ObjectStubSerializer; import com.intellij.util.SmartList; import com.intellij.util.io.StringRef; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -31,8 +32,8 @@ public class ElementStub extends DomStub { private final List myChildren = new SmartList(); private final boolean myCustom; - public ElementStub(@Nullable ElementStub parent, StringRef name, boolean custom) { - super(parent, name); + public ElementStub(@Nullable ElementStub parent, @NotNull StringRef name, StringRef namespace, boolean custom) { + super(parent, name, namespace); myCustom = custom; } @@ -58,7 +59,7 @@ public class ElementStub extends DomStub { @Override public boolean equals(Object obj) { if (obj == this) return true; - return obj instanceof ElementStub && id == ((ElementStub)obj).id && myName.equals(((ElementStub)obj).myName); + return obj instanceof ElementStub && id == ((ElementStub)obj).id && myLocalName.equals(((ElementStub)obj).myLocalName); } public boolean isCustom() { diff --git a/xml/dom-impl/src/com/intellij/util/xml/stubs/ElementStubSerializer.java b/xml/dom-impl/src/com/intellij/util/xml/stubs/ElementStubSerializer.java index 1d6aceb63262..8d03da89d95f 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/stubs/ElementStubSerializer.java +++ b/xml/dom-impl/src/com/intellij/util/xml/stubs/ElementStubSerializer.java @@ -33,12 +33,13 @@ public class ElementStubSerializer implements ObjectStubSerializer children = DomUtil.getDefinedChildren(element, true, true); for (DomElement child : children) { visitDomElement(child); @@ -64,6 +69,7 @@ public class DomStubBuilderVisitor implements DomElementVisitor { } else if (xmlElement instanceof XmlAttribute) { new AttributeStub(myRoot, StringRef.fromString(((XmlAttribute)xmlElement).getLocalName()), + StringRef.fromNullableString(nsKey), ((XmlAttribute)xmlElement).getValue()); } }