From adb873e5988520f75d9ddccd047e62d8b5e5d799 Mon Sep 17 00:00:00 2001 From: Gregory Shrago Date: Mon, 26 Jul 2010 18:56:27 +0400 Subject: [PATCH] better fix for missing binary indexer --- .../intellij/psi/stubs/StubUpdatingIndex.java | 51 +++++++++++-------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java b/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java index f20b020e2681..1d4734a43ac6 100644 --- a/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java +++ b/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java @@ -32,6 +32,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.tree.IFileElementType; import com.intellij.psi.tree.IStubFileElementType; +import com.intellij.util.ObjectUtils; import com.intellij.util.indexing.*; import com.intellij.util.io.DataExternalizer; import com.intellij.util.io.IntInlineKeyDescriptor; @@ -127,37 +128,43 @@ public class StubUpdatingIndex extends CustomImplementationFileBasedIndexExtensi }; } - private static Key stubElementKey = Key.create("stub.tree.for.file.content"); + private static Key stubElementKey = Key.create("stub.tree.for.file.content"); @Nullable public static StubElement buildStubTree(final FileContent inputData) { - StubElement data = inputData.getUserData(stubElementKey); - if (data != null) return data; + Object data = inputData.getUserData(stubElementKey); + if (data == null) { + synchronized (inputData) { + data = inputData.getUserData(stubElementKey); + if (data == null) { + final FileType fileType = inputData.getFileType(); - synchronized (inputData) { - data = inputData.getUserData(stubElementKey); - if (data != null) return data; + if (fileType.isBinary()) { + final BinaryFileStubBuilder builder = BinaryFileStubBuilders.INSTANCE.forFileType(fileType); + if (builder != null) { + data = builder.buildStubTree(inputData.getFile(), inputData.getContent(), inputData.getProject()); + } + else { + data = ObjectUtils.NULL; + } + } + else { + final LanguageFileType filetype = (LanguageFileType)fileType; + Language l = filetype.getLanguage(); + final IFileElementType type = LanguageParserDefinitions.INSTANCE.forLanguage(l).getFileNodeType(); - final FileType fileType = inputData.getFileType(); + PsiFile psi = inputData.getPsiFile(); - if (fileType.isBinary()) { - final BinaryFileStubBuilder builder = BinaryFileStubBuilders.INSTANCE.forFileType(fileType); - assert builder != null; + data = ((IStubFileElementType)type).getBuilder().buildStubTree(psi); + } - data = builder.buildStubTree(inputData.getFile(), inputData.getContent(), inputData.getProject()); - } else { - final LanguageFileType filetype = (LanguageFileType)fileType; - Language l = filetype.getLanguage(); - final IFileElementType type = LanguageParserDefinitions.INSTANCE.forLanguage(l).getFileNodeType(); - - PsiFile psi = inputData.getPsiFile(); - - data = ((IStubFileElementType)type).getBuilder().buildStubTree(psi); + inputData.putUserData(stubElementKey, data); + } } - - inputData.putUserData(stubElementKey, data); - return data; } + if (data == ObjectUtils.NULL) return null; + if (data instanceof StubElement) return (StubElement)data; + throw new AssertionError(data); } public KeyDescriptor getKeyDescriptor() {