From d65fbe402d40b47369ada6f99e1ee2479d9e076a Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 26 Aug 2019 18:51:57 +0200 Subject: [PATCH] fix DOM stub index inconsistency with xincludes present (hopefully EA-89230, EA-210672, EA-210382, EA-139275, EA-208992) GitOrigin-RevId: 36c4db63dd4dd30d896013cf152b947afa6eafd2 --- .../com/intellij/util/xml/impl/DomCreator.java | 8 ++++++-- .../intellij/util/xml/impl/DomManagerImpl.java | 8 +++++++- .../util/xml/stubs/DomStubBuilderTest.java | 15 +++++++++++++-- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/DomCreator.java b/xml/dom-impl/src/com/intellij/util/xml/impl/DomCreator.java index dc837c8e5a33..df2ea15b2de5 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/DomCreator.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/DomCreator.java @@ -19,8 +19,8 @@ import com.intellij.psi.stubs.StubTreeLoader; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; -import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.JBIterable; import com.intellij.util.indexing.FileBasedIndex; import com.intellij.util.xml.*; import com.intellij.util.xml.reflect.CustomDomChildrenDescription; @@ -30,6 +30,7 @@ import com.intellij.util.xml.reflect.DomFixedChildDescription; import com.intellij.util.xml.stubs.DomStub; import com.intellij.util.xml.stubs.ElementStub; import com.intellij.util.xml.stubs.FileStub; +import com.intellij.xml.util.IncludedXmlTag; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -123,7 +124,10 @@ final class DomCreator { XmlTag parentTag) { DomStub parentStub = parent.getStub(); if (parentStub != null) { - int index = ArrayUtil.indexOf(parentTag.findSubTags(tag.getName(), tag.getNamespace()), tag); + int index = JBIterable + .of(parentTag.findSubTags(tag.getName(), tag.getNamespace())) + .filter(t -> !(t instanceof IncludedXmlTag)) + .indexOf(t -> t == tag); ElementStub stub = parentStub.getElementStub(tag.getLocalName(), index); if (stub != null) { XmlName name = description.getXmlName(); diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java b/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java index 85151e51cbde..2e8c8e5ccb7a 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java @@ -349,7 +349,13 @@ public final class DomManagerImpl extends DomManager { public DomInvocationHandler getDomHandler(@Nullable XmlElement xml) { if (xml instanceof XmlTag) { return CachedValuesManager.getCachedValue(xml, chooseKey(HANDLER_KEY, HANDLER_KEY_FOR_INDEX), () -> - CachedValueProvider.Result.create(DomCreator.createTagHandler((XmlTag)xml), PsiModificationTracker.MODIFICATION_COUNT, this)); + { + DomInvocationHandler handler = DomCreator.createTagHandler((XmlTag)xml); + if (handler != null && handler.getXmlTag() != xml) { + throw new AssertionError("Inconsistent dom, stub=" + handler.getStub()); + } + return CachedValueProvider.Result.create(handler, PsiModificationTracker.MODIFICATION_COUNT, this); + }); } if (xml instanceof XmlAttribute) { return CachedValuesManager.getCachedValue(xml, chooseKey(HANDLER_KEY, HANDLER_KEY_FOR_INDEX), () -> 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 8dda148d0d54..e0714e523f55 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 @@ -24,6 +24,7 @@ import com.intellij.psi.stubs.ObjectStubTree; import com.intellij.psi.stubs.Stub; import com.intellij.psi.stubs.StubTreeLoader; import com.intellij.psi.xml.XmlFile; +import com.intellij.psi.xml.XmlTag; import com.intellij.testFramework.PlatformTestUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ref.GCWatcher; @@ -106,8 +107,11 @@ public class DomStubBuilderTest extends DomStubTest { assertNotNull(stubTree); } - public void testInclusion() { + public void testInclusionOnStubs() { doInclusionTest(true); + } + + public void testInclusionOnAST() { doInclusionTest(false); } @@ -128,7 +132,8 @@ public class DomStubBuilderTest extends DomStubTest { } assertEquals(!onStubs, ((PsiFileImpl) file).isContentsLoaded()); - DomFileElement element = DomManager.getDomManager(getProject()).getFileElement((XmlFile)file, Foo.class); + DomManager domManager = DomManager.getDomManager(getProject()); + DomFileElement element = domManager.getFileElement((XmlFile)file, Foo.class); assert element != null; List bars = element.getRootElement().getBars(); assertEquals(3, bars.size()); @@ -139,6 +144,12 @@ public class DomStubBuilderTest extends DomStubTest { Bar lastBar = bars.get(2); assertEquals("included2", assertOneElement(lastBar.getBars()).getString().getStringValue()); + + XmlTag[] barTags = ((XmlFile)file).getRootTag().findSubTags("bar"); + assertSize(3, barTags); + for (int i = 1; i < barTags.length; i++) { + assertEquals(String.valueOf(i), bars.get(i), domManager.getDomElement(barTags[i])); + } } public static class TestExtender extends DomExtender {