diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/DomServiceImpl.java b/xml/dom-impl/src/com/intellij/util/xml/impl/DomServiceImpl.java index 84b04c8b10d1..04e520073ca1 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/DomServiceImpl.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/DomServiceImpl.java @@ -16,6 +16,7 @@ package com.intellij.util.xml.impl; +import com.intellij.ide.highlighter.XmlFileType; import com.intellij.ide.structureView.StructureViewBuilder; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; @@ -23,10 +24,13 @@ import com.intellij.openapi.util.Key; import com.intellij.openapi.util.UserDataCache; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileWithId; import com.intellij.psi.PsiErrorElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.stubs.ObjectStubTree; +import com.intellij.psi.stubs.StubTreeLoader; import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; @@ -35,6 +39,8 @@ import com.intellij.util.Function; import com.intellij.util.indexing.FileBasedIndex; import com.intellij.util.xml.*; import com.intellij.util.xml.structure.DomStructureViewBuilder; +import com.intellij.util.xml.stubs.FileStub; +import com.intellij.util.xml.stubs.builder.DomStubBuilder; import com.intellij.xml.util.XmlUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -61,15 +67,16 @@ public class DomServiceImpl extends DomService { @NotNull private static XmlFileHeader calcXmlFileHeader(final PsiFile file) { - //if (file.getFileType() == XmlFileType.INSTANCE) { - // VirtualFile virtualFile = file.getVirtualFile(); - // if (virtualFile instanceof VirtualFileWithId) { - // ObjectStubTree tree = StubTreeLoader.getInstance().readFromVFile(file.getProject(), virtualFile); - // if (tree != null) { - // return ((FileStub)tree.getRoot()).getHeader(); - // } - // } - //} + if (!DomStubBuilder.isStubBuilding(file) && file.getFileType() == XmlFileType.INSTANCE) { + VirtualFile virtualFile = file.getVirtualFile(); + if (virtualFile instanceof VirtualFileWithId) { + ObjectStubTree tree = StubTreeLoader.getInstance().readFromVFile(file.getProject(), virtualFile); + if (tree != null) { + return ((FileStub)tree.getRoot()).getHeader(); + } + } + } + if (file instanceof XmlFile && file.getNode().isParsed()) { final XmlDocument document = ((XmlFile)file).getDocument(); if (document != null) { diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/FileDescriptionCachedValueProvider.java b/xml/dom-impl/src/com/intellij/util/xml/impl/FileDescriptionCachedValueProvider.java index 96b2ca0aaf4a..d7008f162b13 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/FileDescriptionCachedValueProvider.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/FileDescriptionCachedValueProvider.java @@ -116,7 +116,7 @@ class FileDescriptionCachedValueProvider implements SemEle FileStub stub = null; if (file instanceof VirtualFileWithId) { ApplicationManager.getApplication().assertReadAccessAllowed(); - if (!Boolean.TRUE.equals(myXmlFile.getUserData(DomStubBuilder.BUILDING_DOM_STUBS))) { + if (!DomStubBuilder.isStubBuilding(myXmlFile)) { ObjectStubTree stubTree = StubTreeLoader.getInstance().readOrBuild(myXmlFile.getProject(), file, myXmlFile); if (stubTree != null) { stub = (FileStub)stubTree.getRoot(); 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 268662653c38..d676c25857cc 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 @@ -37,7 +37,11 @@ import java.io.ByteArrayInputStream; */ public class DomStubBuilder implements BinaryFileStubBuilder { - public final static Key BUILDING_DOM_STUBS = Key.create("building dom stubs..."); + public static boolean isStubBuilding(PsiFile file) { + return Boolean.TRUE.equals(file.getUserData(BUILDING_DOM_STUBS)); + } + private final static Key BUILDING_DOM_STUBS = Key.create("building dom stubs..."); + private final static Logger LOG = Logger.getInstance(DomStubBuilder.class); @Override diff --git a/xml/dom-tests/tests/com/intellij/util/xml/stubs/DomStubTest.java b/xml/dom-tests/tests/com/intellij/util/xml/stubs/DomStubTest.java index 650d93bf6f45..b22bd4f2e1f6 100644 --- a/xml/dom-tests/tests/com/intellij/util/xml/stubs/DomStubTest.java +++ b/xml/dom-tests/tests/com/intellij/util/xml/stubs/DomStubTest.java @@ -73,19 +73,25 @@ public abstract class DomStubTest extends LightCodeInsightFixtureTestCase { } protected DomFileElement prepare(String path, Class domClass) { - PsiFile file = myFixture.configureByFile(path); + XmlFile file = prepareFile(path); + + DomFileElement fileElement = DomManager.getDomManager(getProject()).getFileElement(file, domClass); + assertNotNull(fileElement); + return fileElement; + } + + protected XmlFile prepareFile(String path) { + XmlFile file = (XmlFile)myFixture.configureByFile(path); assertFalse(file.getNode().isParsed()); VirtualFile virtualFile = file.getVirtualFile(); + assertNotNull(virtualFile); ObjectStubTree tree = StubTreeLoader.getInstance().readOrBuild(getProject(), virtualFile, file); assertNotNull(tree); ((PsiManagerImpl)getPsiManager()).cleanupForNextTest(); - file = getPsiManager().findFile(virtualFile); - assertFalse(file.getNode().isParsed()); - - DomFileElement fileElement = DomManager.getDomManager(getProject()).getFileElement((XmlFile)file, domClass); - assertNotNull(fileElement); - return fileElement; + file = (XmlFile)getPsiManager().findFile(virtualFile); + assertNotNull(file); + return file; } } diff --git a/xml/dom-tests/tests/com/intellij/util/xml/stubs/DomStubUsingTest.java b/xml/dom-tests/tests/com/intellij/util/xml/stubs/DomStubUsingTest.java index 21695bb6bf7c..92afd1cff478 100644 --- a/xml/dom-tests/tests/com/intellij/util/xml/stubs/DomStubUsingTest.java +++ b/xml/dom-tests/tests/com/intellij/util/xml/stubs/DomStubUsingTest.java @@ -15,14 +15,14 @@ */ package com.intellij.util.xml.stubs; +import com.intellij.openapi.vfs.VirtualFileFilter; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiFile; +import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; -import com.intellij.util.xml.DomElement; -import com.intellij.util.xml.DomFileElement; -import com.intellij.util.xml.DomUtil; -import com.intellij.util.xml.GenericAttributeValue; +import com.intellij.util.xml.*; import com.intellij.util.xml.stubs.model.Bar; import com.intellij.util.xml.stubs.model.Foo; import com.intellij.util.xml.stubs.model.NotStubbed; @@ -99,8 +99,6 @@ public class DomStubUsingTest extends DomStubTest { DomElement parent = notStubbed.getParent(); assertEquals(bar, parent); -// SemService.getSemService(getProject()).clearCache(); - NotStubbed child = bar.getNotStubbeds().get(0); parent = child.getParent(); assertEquals(bar, parent); @@ -113,4 +111,15 @@ public class DomStubUsingTest extends DomStubTest { List bars = DomUtil.getChildrenOf(foo, Bar.class); assertEquals(2, bars.size()); } + + public void testFileLoading() throws Exception { + XmlFile file = prepareFile("foo.xml"); + ((PsiManagerImpl)getPsiManager()).setAssertOnFileLoadingFilter(VirtualFileFilter.ALL); + try { + DomManager.getDomManager(getProject()).getFileElement(file, Foo.class); + } + finally { + ((PsiManagerImpl)getPsiManager()).setAssertOnFileLoadingFilter(VirtualFileFilter.NONE); + } + } }