diff options
Diffstat (limited to 'java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java')
-rw-r--r-- | java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java | 82 |
1 files changed, 46 insertions, 36 deletions
diff --git a/java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java b/java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java index 9028b1489970..45f50d34b922 100644 --- a/java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java +++ b/java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -128,7 +128,12 @@ public abstract class SourcePosition implements Navigatable{ return true; } final PsiElement psiElement = myPsiElement; - return psiElement != null && !psiElement.isValid(); + return psiElement != null && !ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() { + @Override + public Boolean compute() { + return psiElement.isValid(); + } + }); } @Override @@ -194,7 +199,7 @@ public abstract class SourcePosition implements Navigatable{ @Nullable protected PsiElement calcPsiElement() { - PsiFile psiFile = getFile(); + final PsiFile psiFile = getFile(); int lineNumber = getLine(); if(lineNumber < 0) { return psiFile; @@ -207,47 +212,52 @@ public abstract class SourcePosition implements Navigatable{ if (lineNumber >= document.getLineCount()) { return psiFile; } - int startOffset = document.getLineStartOffset(lineNumber); + final int startOffset = document.getLineStartOffset(lineNumber); if(startOffset == -1) { return null; } - PsiElement rootElement = psiFile; - - List<PsiFile> 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]; + return ApplicationManager.getApplication().runReadAction(new Computable<PsiElement>() { + @Override + public PsiElement compute() { + PsiElement rootElement = psiFile; + + List<PsiFile> 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; - while(true) { - final CharSequence charsSequence = document.getCharsSequence(); - for (; startOffset < charsSequence.length(); startOffset++) { - char c = charsSequence.charAt(startOffset); - if (c != ' ' && c != '\t') { - break; + PsiElement element; + int offset = startOffset; + while (true) { + final CharSequence charsSequence = document.getCharsSequence(); + for (; offset < charsSequence.length(); offset++) { + char c = charsSequence.charAt(offset); + if (c != ' ' && c != '\t') { + 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; } - element = rootElement.findElementAt(startOffset); - - if(element instanceof PsiComment) { - startOffset = element.getTextRange().getEndOffset() + 1; - } - else{ - break; - } - } - - if (element != null && element.getParent() instanceof PsiForStatement) { - return ((PsiForStatement)element.getParent()).getInitialization(); - } - return element; + }); } } |