diff --git a/platform/core-api/src/com/intellij/psi/util/PsiUtilCore.java b/platform/core-api/src/com/intellij/psi/util/PsiUtilCore.java index 5db672fa8fcb..683369896164 100644 --- a/platform/core-api/src/com/intellij/psi/util/PsiUtilCore.java +++ b/platform/core-api/src/com/intellij/psi/util/PsiUtilCore.java @@ -20,7 +20,10 @@ import com.intellij.lang.FileASTNode; import com.intellij.lang.Language; import com.intellij.navigation.ItemPresentation; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Attachment; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; @@ -45,6 +48,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.Collection; +import java.util.List; /** * @author yole @@ -486,6 +490,41 @@ public class PsiUtilCore { } } + /** + * Tries to find PSI file for a virtual file and throws assertion error with debug info if it is null. + */ + @NotNull + public static PsiFile getPsiFile(@NotNull Project project, @NotNull VirtualFile file) { + PsiManager psiManager = PsiManager.getInstance(project); + PsiFile psi = psiManager.findFile(file); + if (psi != null) return psi; + FileType fileType = file.getFileType(); + FileViewProvider viewProvider = psiManager.findViewProvider(file); + Document document = FileDocumentManager.getInstance().getDocument(file); + StringBuilder sb = new StringBuilder(); + sb.append("valid=").append(file.isValid()). + append(" isDirectory=").append(file.isDirectory()). + append(" hasDocument=").append(document != null). + append(" length=").append(file.getLength()); + sb.append("\nproject=").append(project.getName()). + append(" default=").append(project.isDefault()). + append(" open=").append(project.isOpen());; + sb.append("\nfileType=").append(fileType.getName()).append("/").append(fileType.getClass().getName()); + sb.append("\nviewProvider=").append(viewProvider == null ? "null" : viewProvider.getClass().getName()); + if (viewProvider != null) { + List files = viewProvider.getAllFiles(); + sb.append(" language=").append(viewProvider.getBaseLanguage().getID()); + sb.append(" physical=").append(viewProvider.isPhysical()); + sb.append(" rootCount=").append(files.size()); + for (PsiFile o : files) { + sb.append("\n root=").append(o.getLanguage().getID()).append("/").append(o.getClass().getName()); + } + } + LOG.error("no PSI for file '" + file.getName() + "'", new Attachment(file.getPresentableUrl(), sb.toString())); + throw new AssertionError(); + } + + /** * @deprecated use CompletionUtil#getOriginalElement where appropriate instead */ diff --git a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java index 67fa2b13e228..01ae9e5c1611 100644 --- a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java @@ -47,10 +47,9 @@ import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.SingleRootFileViewProvider; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.testFramework.LightVirtualFile; import com.intellij.ui.components.JBScrollBar; import com.intellij.util.DocumentUtil; @@ -559,16 +558,7 @@ public class LanguageConsoleImpl extends ConsoleViewImpl implements LanguageCons @NotNull protected PsiFile createFile(@NotNull Project project, @NotNull VirtualFile virtualFile) { - PsiFile file = PsiManager.getInstance(project).findFile(virtualFile); - if (file == null) { - Language language = new SingleRootFileViewProvider(PsiManager.getInstance(project), virtualFile).getBaseLanguage(); - throw new AssertionError(String.format("no PSI for '%s'\nfile valid=%s, fileType=%s, language=%s", - virtualFile.getName(), - virtualFile.isValid(), - virtualFile.getFileType(), - language)); - } - return file; + return PsiUtilCore.getPsiFile(project, virtualFile); } boolean isHistoryViewerForceAdditionalColumnsUsage() {