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 1f4de200cf41..136490e241d2 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 @@ -609,7 +609,7 @@ public abstract class DomInvocationHandler stubs = myStub.getChildrenByName(xmlName.getLocalName(), xmlName.getNamespaceKey()); + List stubs = myStub.getChildrenByName(xmlName); 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); @@ -836,10 +836,17 @@ public abstract class DomInvocationHandler stubs = myStub.getChildrenByName(xmlName.getLocalName(), xmlName.getNamespaceKey()); - List elements = - ContainerUtil.map(stubs, stub -> stub.getOrCreateHandler((DomChildDescriptionImpl)description, myManager).getProxy()); - return addIncludedElements(elements, xmlName); + SmartList result = new SmartList<>(); + List stubs = myStub.getChildrenStubs(); + for (Stub stub : stubs) { + if (stub instanceof DomStub && ((DomStub)stub).matches(xmlName)) { + result.add(((DomStub)stub).getOrCreateHandler((DomChildDescriptionImpl)description, myManager).getProxy()); + } + else if (stub instanceof XIncludeStub) { + ((XIncludeStub)stub).resolve(this, result, xmlName); + } + } + return result; } else if (description instanceof CustomDomChildrenDescriptionImpl) { List stubs = myStub.getChildrenStubs(); diff --git a/xml/dom-impl/src/com/intellij/util/xml/stubs/DomStub.java b/xml/dom-impl/src/com/intellij/util/xml/stubs/DomStub.java index 5eb0bf65b50f..4f8593148b1e 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/stubs/DomStub.java +++ b/xml/dom-impl/src/com/intellij/util/xml/stubs/DomStub.java @@ -16,6 +16,7 @@ package com.intellij.util.xml.stubs; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.stubs.ObjectStubBase; import com.intellij.psi.stubs.Stub; import com.intellij.util.SmartList; @@ -60,19 +61,21 @@ public abstract class DomStub extends ObjectStubBase { return myNamespace == null ? null : myNamespace.getString(); } - public List getChildrenByName(final CharSequence name, @Nullable final String nsKey) { + public boolean matches(XmlName name) { + return name.getLocalName().equals(getName()) && StringUtil.notNullize(name.getNamespaceKey()).equals(getNamespaceKey()); + } + + public List getChildrenByName(XmlName xmlName) { final List stubs = getChildrenStubs(); if (stubs.isEmpty()) { return Collections.emptyList(); } - final String s = nsKey == null ? "" : nsKey; final List result = new SmartList<>(); //noinspection ForLoopReplaceableByForEach for (int i = 0, size = stubs.size(); i < size; i++) { final Stub stub = stubs.get(i); - if (stub instanceof DomStub && XmlUtil.getLocalName(((DomStub)stub).getName()).equals(name) && - Comparing.equal(s, ((DomStub)stub).getNamespaceKey())) { + if (stub instanceof DomStub && matches(xmlName)) { result.add((DomStub)stub); } } diff --git a/xml/dom-impl/src/com/intellij/util/xml/stubs/XIncludeStub.java b/xml/dom-impl/src/com/intellij/util/xml/stubs/XIncludeStub.java index a49f10c7a16a..9e425d187415 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/stubs/XIncludeStub.java +++ b/xml/dom-impl/src/com/intellij/util/xml/stubs/XIncludeStub.java @@ -16,6 +16,7 @@ import com.intellij.util.xml.impl.DomFileElementImpl; import com.intellij.util.xml.impl.DomInvocationHandler; import com.intellij.util.xmlb.JDOMXIncluder; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.Collections; @@ -27,21 +28,13 @@ public class XIncludeStub extends ObjectStubBase { private final String myHref; private final String myXpointer; - public XIncludeStub(ElementStub parent, String href, String xpointer) { + public XIncludeStub(ElementStub parent, @Nullable String href, @Nullable String xpointer) { super(parent); myHref = href; myXpointer = xpointer; parent.addChild(this); } - public String getHref() { - return myHref; - } - - public String getXpointer() { - return myXpointer; - } - @NotNull @Override public List getChildrenStubs() { @@ -95,10 +88,10 @@ public class XIncludeStub extends ObjectStubBase { @Override public String toString() { - return "href=" + getHref() + " xpointer=" + getXpointer(); + return "href=" + myHref + " xpointer=" + myXpointer; } - public final static ObjectStubSerializer ourSerializer = new ObjectStubSerializer() { + final static ObjectStubSerializer ourSerializer = new ObjectStubSerializer() { @NotNull @Override @@ -108,8 +101,8 @@ public class XIncludeStub extends ObjectStubBase { @Override public void serialize(@NotNull XIncludeStub stub, @NotNull StubOutputStream dataStream) throws IOException { - dataStream.writeUTFFast(StringUtil.notNullize(stub.getHref())); - dataStream.writeUTFFast(StringUtil.notNullize(stub.getXpointer())); + dataStream.writeUTFFast(StringUtil.notNullize(stub.myHref)); + dataStream.writeUTFFast(StringUtil.notNullize(stub.myXpointer)); } @NotNull diff --git a/xml/dom-impl/src/com/intellij/util/xml/stubs/builder/DomStubBuilder.java b/xml/dom-impl/src/com/intellij/util/xml/stubs/builder/DomStubBuilder.java index e31a4ac901d1..ffc4ca7c941d 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/stubs/builder/DomStubBuilder.java +++ b/xml/dom-impl/src/com/intellij/util/xml/stubs/builder/DomStubBuilder.java @@ -96,6 +96,6 @@ public class DomStubBuilder implements BinaryFileStubBuilder { @Override public int getStubVersion() { - return 21 + DomApplicationComponent.getInstance().getCumulativeVersion(true); + return 22 + DomApplicationComponent.getInstance().getCumulativeVersion(true); } } diff --git a/xml/dom-tests/tests/com/intellij/util/xml/stubs/DomStubBuilderTest.java b/xml/dom-tests/tests/com/intellij/util/xml/stubs/DomStubBuilderTest.java index 6e99c5875f04..a8ab8c7712a8 100644 --- a/xml/dom-tests/tests/com/intellij/util/xml/stubs/DomStubBuilderTest.java +++ b/xml/dom-tests/tests/com/intellij/util/xml/stubs/DomStubBuilderTest.java @@ -38,6 +38,8 @@ import com.intellij.util.xml.stubs.model.Custom; import com.intellij.util.xml.stubs.model.Foo; import org.jetbrains.annotations.NotNull; +import java.util.List; + /** * @author Dmitry Avdeev */ @@ -120,7 +122,9 @@ public class DomStubBuilderTest extends DomStubTest { DomFileElement element = DomManager.getDomManager(getProject()).getFileElement((XmlFile)file, Foo.class); assert element != null; - assertEquals(3, element.getRootElement().getBars().size()); + List bars = element.getRootElement().getBars(); + assertEquals(3, bars.size()); + assertEquals("include.xml", bars.get(0).getXmlTag().getContainingFile().getName()); } public static class TestExtender extends DomExtender {