From ab93332d8543bcdeb7ca93c7764b56ea88d04c62 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Thu, 23 Oct 2008 15:18:47 +0400 Subject: [PATCH] [revd jeka]: Attempt to reindex faulty stubs automatially, when failure detected. --- .../src/com/intellij/psi/stubs/StubIndexImpl.java | 2 ++ lang-impl/src/com/intellij/psi/stubs/StubTree.java | 23 +++++++++++++++++++-- .../psi/impl/file/impl/JavaFileManagerImpl.java | 24 ++++++++++++++++++++-- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java b/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java index ea233d865f..018649daf5 100644 --- a/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java +++ b/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java @@ -220,6 +220,8 @@ public class StubIndexImpl extends StubIndex implements ApplicationComponent, Pe builder.append(stubTreeJustBuilt); builder.append("\n"); LOG.info(builder.toString()); + + FileBasedIndex.getInstance().requestReindex(file); } } } diff --git a/lang-impl/src/com/intellij/psi/stubs/StubTree.java b/lang-impl/src/com/intellij/psi/stubs/StubTree.java index 6b06db66f3..4d838ad8cf 100644 --- a/lang-impl/src/com/intellij/psi/stubs/StubTree.java +++ b/lang-impl/src/com/intellij/psi/stubs/StubTree.java @@ -3,6 +3,11 @@ */ package com.intellij.psi.stubs; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.UserDataHolder; import com.intellij.openapi.vfs.VirtualFile; @@ -18,6 +23,8 @@ import java.util.List; import java.util.Map; public class StubTree { + private static final Logger LOG = Logger.getInstance("#com.intellij.psi.stubs.StubTree"); + private static final Key HARD_REF_IN_STUB = new Key("HARD_REF_IN_STUB"); private final PsiFileStub myRoot; private final List> myPlainList = new ArrayList>(); @@ -80,12 +87,24 @@ public class StubTree { final List datas = FileBasedIndex.getInstance().getValues(StubUpdatingIndex.INDEX_ID, id, VirtualFileFilter.ALL); final int size = datas.size(); - assert size == 1 || size == 0 : vFile.getPresentableUrl() + " has " + size + " stub versions. Should only have one. id=" + id; - if (size == 1) { StubElement stub = datas.get(0).getStub(); return new StubTree((PsiFileStub)stub); } + else if (size != 0) { + LOG.error("Twin stubs: " + vFile.getPresentableUrl() + " has " + size + " stub versions. Should only have one. id=" + id); + + ApplicationManager.getApplication().invokeLater(new Runnable() { + public void run() { + final Document doc = FileDocumentManager.getInstance().getCachedDocument(vFile); + if (doc != null) { + FileDocumentManager.getInstance().saveDocument(doc); + } + } + }, ModalityState.NON_MODAL); + + FileBasedIndex.getInstance().requestReindex(vFile); + } } return null; diff --git a/source/com/intellij/psi/impl/file/impl/JavaFileManagerImpl.java b/source/com/intellij/psi/impl/file/impl/JavaFileManagerImpl.java index 4cbd21339e..7f39d2bbc3 100644 --- a/source/com/intellij/psi/impl/file/impl/JavaFileManagerImpl.java +++ b/source/com/intellij/psi/impl/file/impl/JavaFileManagerImpl.java @@ -18,8 +18,10 @@ import com.intellij.psi.impl.PsiManagerEx; import com.intellij.psi.impl.file.PsiPackageImpl; import com.intellij.psi.impl.java.stubs.index.JavaFullClassNameIndex; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.Query; import com.intellij.util.containers.ConcurrentHashMap; +import com.intellij.util.indexing.FileBasedIndex; import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.MessageBusConnection; import org.jetbrains.annotations.NonNls; @@ -110,7 +112,10 @@ public class JavaFileManagerImpl implements JavaFileManager { final Collection classes = JavaFullClassNameIndex.getInstance().get(qName.hashCode(), myManager.getProject(), scope); if (classes.isEmpty()) return PsiClass.EMPTY_ARRAY; List result = new ArrayList(classes.size()); - for (PsiClass aClass : classes) { + for (PsiElement found : classes) { + if (notClass(found)) continue; + + PsiClass aClass = (PsiClass)found; final String qualifiedName = aClass.getQualifiedName(); if (qualifiedName == null || !qualifiedName.equals(qName)) continue; @@ -127,6 +132,18 @@ public class JavaFileManagerImpl implements JavaFileManager { return result.toArray(new PsiClass[result.size()]); } + private static boolean notClass(final PsiElement found) { + if (found instanceof PsiClass) return false; + + VirtualFile faultyContainer = PsiUtil.getVirtualFile(found); + LOG.error("Non class in class list: " + faultyContainer); + if (faultyContainer != null && faultyContainer.isValid()) { + FileBasedIndex.getInstance().requestReindex(faultyContainer); + } + + return true; + } + @Nullable public PsiClass findClass(@NotNull String qName, @NotNull GlobalSearchScope scope) { if (!myUseRepository) { @@ -266,7 +283,10 @@ public class JavaFileManagerImpl implements JavaFileManager { final Collection classes = JavaFullClassNameIndex.getInstance().get(qName.hashCode(), myManager.getProject(), scope); - for (PsiClass aClass : classes) { + for (PsiElement found : classes) { + if (notClass(found)) continue; + + PsiClass aClass = (PsiClass)found; final boolean valid = aClass.isValid(); LOG.assertTrue(valid); if (!valid) continue; -- 2.11.4.GIT