From 1bb9fe2d9655bfc48899bc909347764421f2a0da Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 29 Jul 2015 20:13:53 +0200 Subject: [PATCH] fix javadoc incremental reparse; add diagnostics for stub-ast mismatches caused by such events --- .../impl/source/tree/JavaDocElementType.java | 3 +++ .../intellij/psi/stubs/StubTreeLoader.java | 19 ++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementType.java index 793ad40dead4..23c6df0f1c4a 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementType.java @@ -25,6 +25,7 @@ import com.intellij.lang.java.parser.JavadocParser; import com.intellij.lexer.Lexer; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.LanguageLevelProjectExtension; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.impl.source.javadoc.*; import com.intellij.psi.tree.*; @@ -122,6 +123,8 @@ public interface JavaDocElementType { @Override public boolean isParsable(final CharSequence buffer, Language fileLanguage, final Project project) { + if (!StringUtil.startsWith(buffer, "/**") || !StringUtil.endsWith(buffer, "*/")) return false; + Lexer lexer = JavaParserDefinition.createLexer(LanguageLevelProjectExtension.getInstance(project).getLanguageLevel()); lexer.start(buffer); if (lexer.getTokenType() == DOC_COMMENT) { diff --git a/platform/core-impl/src/com/intellij/psi/stubs/StubTreeLoader.java b/platform/core-impl/src/com/intellij/psi/stubs/StubTreeLoader.java index 2959f13f4fe6..faecdc51b5d4 100644 --- a/platform/core-impl/src/com/intellij/psi/stubs/StubTreeLoader.java +++ b/platform/core-impl/src/com/intellij/psi/stubs/StubTreeLoader.java @@ -20,9 +20,8 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.FileViewProvider; -import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiFile; +import com.intellij.psi.*; +import com.intellij.psi.impl.DebugUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -54,6 +53,20 @@ public abstract class StubTreeLoader { msg += ", file.class=" + psiFile.getClass(); msg += ", file.lang=" + psiFile.getLanguage(); msg += ", modStamp=" + psiFile.getModificationStamp(); + + if (!(psiFile instanceof PsiCompiledElement)) { + String text = psiFile.getText(); + PsiFile fromText = PsiFileFactory.getInstance(psiFile.getProject()).createFileFromText(psiFile.getName(), psiFile.getFileType(), text); + if (fromText.getLanguage().equals(psiFile.getLanguage())) { + boolean consistent = DebugUtil.psiToString(psiFile, true).equals(DebugUtil.psiToString(fromText, true)); + if (consistent) { + msg += "\n tree consistent"; + } else { + msg += "\n AST INCONSISTENT, perhaps after incremental reparse; " + fromText; + } + } + } + msg += "\n stub debugInfo=" + stubTree.getDebugInfo(); msg += "\n document before=" + prevCachedDocument;