diff --git a/platform/core-api/src/com/intellij/psi/PsiInvalidElementAccessException.java b/platform/core-api/src/com/intellij/psi/PsiInvalidElementAccessException.java index 62a3286e63c4..42e527e8052d 100644 --- a/platform/core-api/src/com/intellij/psi/PsiInvalidElementAccessException.java +++ b/platform/core-api/src/com/intellij/psi/PsiInvalidElementAccessException.java @@ -75,13 +75,7 @@ public class PsiInvalidElementAccessException extends RuntimeException implement try { Object trace = recursiveInvocation ? null : getPsiInvalidationTrace(element); myMessage = getMessageWithReason(element, message, recursiveInvocation, trace); - if (trace == null) { - myDiagnostic = Attachment.EMPTY_ARRAY; - } - else { - myDiagnostic = new Attachment[]{trace instanceof Throwable ? new Attachment("invalidation", (Throwable)trace) - : new Attachment("diagnostic.txt", trace.toString())}; - } + myDiagnostic = createAttachments(trace); } finally { element.putUserData(REPORTING_EXCEPTION, null); @@ -89,6 +83,20 @@ public class PsiInvalidElementAccessException extends RuntimeException implement } } + public PsiInvalidElementAccessException(@NotNull ASTNode node, @Nullable String message) { + myElementReference = new SoftReference(null); + myMessage = "Element " + node.getClass() + " of type " + node.getElementType() + (message == null ? "" : "; " + message); + myDiagnostic = createAttachments(findInvalidationTrace(node)); + } + + @NotNull + private static Attachment[] createAttachments(@Nullable Object trace) { + return trace == null + ? Attachment.EMPTY_ARRAY + : new Attachment[]{trace instanceof Throwable ? new Attachment("invalidation", (Throwable)trace) + : new Attachment("diagnostic.txt", trace.toString())}; + } + @Nullable private static Object getPsiInvalidationTrace(@NotNull PsiElement element) { Object trace = getInvalidationTrace(element); diff --git a/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java b/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java index 387e22c94105..f8493f3fe491 100644 --- a/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java +++ b/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java @@ -242,7 +242,11 @@ public class StubBasedPsiElementBase extends ASTDelegateP return mySubstrateRef.getContainingFile(); } catch (PsiInvalidElementAccessException e) { - throw new PsiInvalidElementAccessException(this, e); + if (PsiInvalidElementAccessException.getInvalidationTrace(this) != null) { + throw new PsiInvalidElementAccessException(this, e); + } else { + throw e; + } } } diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/SubstrateRef.java b/platform/core-impl/src/com/intellij/psi/impl/source/SubstrateRef.java index 5c263da6827c..849759632279 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/SubstrateRef.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/SubstrateRef.java @@ -93,7 +93,7 @@ public abstract class SubstrateRef { @Override public PsiFile getContainingFile() { PsiFile file = SharedImplUtil.getContainingFile(node); - if (file == null) throw new PsiInvalidElementAccessException(node.getPsi()); + if (file == null) throw new PsiInvalidElementAccessException(node, null); return file; } };