From e73588bde45525585fc9a01cb1976ef08ce1efc4 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Wed, 21 Sep 2016 15:42:22 +0300 Subject: [PATCH] EA-88640 - assert: FileDocumentManagerImpl.getDocument --- .../com/intellij/debugger/SourcePosition.java | 96 +++++++++---------- 1 file changed, 45 insertions(+), 51 deletions(-) diff --git a/java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java b/java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java index 0628fb94c4ae..81dd8f699739 100644 --- a/java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java +++ b/java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java @@ -153,7 +153,7 @@ public abstract class SourcePosition implements Navigatable{ updateData(); PsiElement element = myPsiElementRef != null ? myPsiElementRef.get() : null; if (element == null) { - element = calcPsiElement(); + element = ApplicationManager.getApplication().runReadAction((Computable)this::calcPsiElement); myPsiElementRef = new WeakReference<>(element); return element; } @@ -211,70 +211,64 @@ public abstract class SourcePosition implements Navigatable{ protected PsiElement calcPsiElement() { // currently PsiDocumentManager does not store documents for mirror file, so we store original file PsiFile psiFile = getFile(); + if (!psiFile.isValid()) { + return null; + } + int lineNumber = getLine(); - if(lineNumber < 0) { + if (lineNumber < 0) { return psiFile; } - final Document document = getDocument(getFile()); + Document document = getDocument(psiFile); if (document == null) { return null; } if (lineNumber >= document.getLineCount()) { return psiFile; } - final int startOffset = document.getLineStartOffset(lineNumber); - if(startOffset == -1) { + int startOffset = document.getLineStartOffset(lineNumber); + if (startOffset == -1) { return null; } - return ApplicationManager.getApplication().runReadAction(new Computable() { - @Override - public PsiElement compute() { - PsiElement rootElement = psiFile; - - if (!psiFile.isValid()) { - return null; + PsiElement rootElement = psiFile; + List allFiles = psiFile.getViewProvider().getAllFiles(); + if (allFiles.size() > 1) { // jsp & gsp + PsiClassOwner owner = ContainerUtil.findInstance(allFiles, PsiClassOwner.class); + if (owner != null) { + PsiClass[] classes = owner.getClasses(); + if (classes.length == 1 && classes[0] instanceof SyntheticElement) { + rootElement = classes[0]; } - - List allFiles = psiFile.getViewProvider().getAllFiles(); - if (allFiles.size() > 1) { // jsp & gsp - PsiClassOwner owner = ContainerUtil.findInstance(allFiles, PsiClassOwner.class); - if (owner != null) { - PsiClass[] classes = owner.getClasses(); - if (classes.length == 1 && classes[0] instanceof SyntheticElement) { - rootElement = classes[0]; - } - } - } - - PsiElement element = null; - int offset = getOffset(); - while (true) { - final CharSequence charsSequence = document.getCharsSequence(); - for (; offset < charsSequence.length(); offset++) { - char c = charsSequence.charAt(offset); - if (c != ' ' && c != '\t') { - break; - } - } - if (offset >= charsSequence.length()) break; - - element = rootElement.findElementAt(offset); - - if (element instanceof PsiComment) { - offset = element.getTextRange().getEndOffset() + 1; - } - else { - break; - } - } - if (element != null && element.getParent() instanceof PsiForStatement) { - return ((PsiForStatement)element.getParent()).getInitialization(); - } - return element; } - }); + } + + PsiElement element = null; + int offset = getOffset(); + while (true) { + final CharSequence charsSequence = document.getCharsSequence(); + for (; offset < charsSequence.length(); offset++) { + char c = charsSequence.charAt(offset); + if (c != ' ' && c != '\t') { + break; + } + } + if (offset >= charsSequence.length()) break; + + element = rootElement.findElementAt(offset); + + if (element instanceof PsiComment) { + offset = element.getTextRange().getEndOffset() + 1; + } + else { + break; + } + } + if (element != null && element.getParent() instanceof PsiForStatement) { + return ((PsiForStatement)element.getParent()).getInitialization(); + } + return element; } } @@ -332,7 +326,7 @@ public abstract class SourcePosition implements Navigatable{ return new SourcePositionCache(psiFile) { @Override protected PsiElement calcPsiElement() { - return ApplicationManager.getApplication().runReadAction((Computable)pointer::getElement); + return pointer.getElement(); } @Override