IDEA-90935 Deadlock during git unstash

This commit is contained in:
Dmitry Avdeev
2012-09-04 18:10:23 +04:00
parent 0fe6b8ba78
commit c73b239ed3
5 changed files with 20 additions and 15 deletions
@@ -40,7 +40,6 @@ 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;
@@ -67,7 +66,7 @@ public class DomServiceImpl extends DomService {
@NotNull
private static XmlFileHeader calcXmlFileHeader(final XmlFile file) {
if (!DomStubBuilder.isStubBuilding(file) && file.getFileType() == XmlFileType.INSTANCE) {
if (!XmlUtil.isStubBuilding(file) && file.getFileType() == XmlFileType.INSTANCE) {
VirtualFile virtualFile = file.getVirtualFile();
if (virtualFile instanceof VirtualFileWithId) {
ObjectStubTree tree = StubTreeLoader.getInstance().readFromVFile(file.getProject(), virtualFile);
@@ -30,7 +30,7 @@ import com.intellij.util.containers.HashSet;
import com.intellij.util.xml.*;
import com.intellij.util.xml.events.DomEvent;
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;
@@ -116,7 +116,7 @@ class FileDescriptionCachedValueProvider<T extends DomElement> implements SemEle
FileStub stub = null;
if (description.hasStubs() && file instanceof VirtualFileWithId) {
ApplicationManager.getApplication().assertReadAccessAllowed();
if (!DomStubBuilder.isStubBuilding(myXmlFile)) {
if (!XmlUtil.isStubBuilding(myXmlFile)) {
ObjectStubTree stubTree = StubTreeLoader.getInstance().readOrBuild(myXmlFile.getProject(), file, myXmlFile);
if (stubTree != null) {
stub = (FileStub)stubTree.getRoot();
@@ -19,7 +19,6 @@ import com.intellij.ide.highlighter.XmlFileType;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
@@ -28,6 +27,7 @@ import com.intellij.psi.stubs.Stub;
import com.intellij.psi.xml.XmlFile;
import com.intellij.util.xml.*;
import com.intellij.util.xml.stubs.FileStub;
import com.intellij.xml.util.XmlUtil;
/**
* @author Dmitry Avdeev
@@ -35,11 +35,6 @@ import com.intellij.util.xml.stubs.FileStub;
*/
public class DomStubBuilder implements BinaryFileStubBuilder {
public static boolean isStubBuilding(PsiFile file) {
return Boolean.TRUE.equals(file.getUserData(BUILDING_DOM_STUBS));
}
private final static Key<Boolean> BUILDING_DOM_STUBS = Key.create("building dom stubs...");
private final static Logger LOG = Logger.getInstance(DomStubBuilder.class);
@Override
@@ -56,7 +51,7 @@ public class DomStubBuilder implements BinaryFileStubBuilder {
XmlFile xmlFile = (XmlFile)psiFile;
DomManager manager = DomManager.getDomManager(project);
try {
xmlFile.putUserData(BUILDING_DOM_STUBS, Boolean.TRUE);
xmlFile.putUserData(XmlUtil.BUILDING_DOM_STUBS, Boolean.TRUE);
DomFileElement<? extends DomElement> fileElement = manager.getFileElement(xmlFile);
if (fileElement == null || !fileElement.getFileDescription().hasStubs()) return null;
@@ -70,7 +65,7 @@ public class DomStubBuilder implements BinaryFileStubBuilder {
return fileStub;
}
finally {
xmlFile.putUserData(BUILDING_DOM_STUBS, null);
xmlFile.putUserData(XmlUtil.BUILDING_DOM_STUBS, null);
}
}
@@ -29,10 +29,14 @@ import com.intellij.util.indexing.FileContent;
import com.intellij.util.indexing.ID;
import com.intellij.util.io.DataExternalizer;
import com.intellij.util.text.CharArrayUtil;
import com.intellij.xml.util.XmlUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.*;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.File;
import java.io.IOException;
import java.util.*;
/**
@@ -164,7 +168,7 @@ public class XmlNamespaceIndex extends XmlIndex<XsdNamespaceBuilder> {
@Nullable final String version,
@NotNull PsiFile file) {
if (DumbService.isDumb(file.getProject())) return null;
if (DumbService.isDumb(file.getProject()) || XmlUtil.isStubBuilding(file)) return null;
IndexedRelevantResource<String,XsdNamespaceBuilder> resource =
guessSchema(namespace, tagName, version, ModuleUtilCore.findModuleForPsiElement(file));
@@ -176,7 +180,9 @@ public class XmlNamespaceIndex extends XmlIndex<XsdNamespaceBuilder> {
@Nullable
public static XmlFile guessDtd(String dtdUri, @NotNull PsiFile baseFile) {
if (!dtdUri.endsWith(".dtd") || DumbService.isDumb(baseFile.getProject())) return null;
if (!dtdUri.endsWith(".dtd") ||
DumbService.isDumb(baseFile.getProject()) ||
XmlUtil.isStubBuilding(baseFile)) return null;
String dtdFileName = new File(dtdUri).getName();
List<IndexedRelevantResource<String, XsdNamespaceBuilder>>
@@ -149,6 +149,7 @@ public class XmlUtil {
public static final Key<PsiAnchor> ORIGINAL_ELEMENT = Key.create("ORIGINAL_ELEMENT");
public static final String XHTML4_SCHEMA_LOCATION;
public final static Key<Boolean> BUILDING_DOM_STUBS = Key.create("building dom stubs...");
private XmlUtil() {
}
@@ -604,6 +605,10 @@ public class XmlUtil {
return tagName.subSequence(pos + 1, tagName.length());
}
public static boolean isStubBuilding(PsiFile file) {
return Boolean.TRUE.equals(file.getUserData(BUILDING_DOM_STUBS));
}
private static class XmlElementProcessor {
private final PsiElementProcessor processor;
private final PsiFile targetFile;