From 6d4584ed72bf1f9ae792c759449d76eca1b4894f Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 12 Apr 2011 11:06:53 +0400 Subject: [PATCH] NPE in injected due to datarace in isPhysical() --- .../com/intellij/lang/annotation/Annotation.java | 5 +++++ .../tree/injected/InjectedFileViewProvider.java | 15 ++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/platform/lang-api/src/com/intellij/lang/annotation/Annotation.java b/platform/lang-api/src/com/intellij/lang/annotation/Annotation.java index 412cffe99586..33ae27d072d5 100644 --- a/platform/lang-api/src/com/intellij/lang/annotation/Annotation.java +++ b/platform/lang-api/src/com/intellij/lang/annotation/Annotation.java @@ -79,6 +79,11 @@ public final class Annotation implements Segment { displayName = key != null ? HighlightDisplayKey.getDisplayNameByKey(key) : fix.getText(); options = null; } + + @Override + public String toString() { + return quickFix.toString(); + } } /** diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedFileViewProvider.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedFileViewProvider.java index 88e63c3fccad..7878c22b3b63 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedFileViewProvider.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedFileViewProvider.java @@ -41,7 +41,12 @@ public class InjectedFileViewProvider extends SingleRootFileViewProvider { private Project myProject; private final Object myLock = new Object(); private final DocumentWindow myDocumentWindow; - private volatile boolean physical = true; + private static final ThreadLocal disabledTemporarily = new ThreadLocal(){ + @Override + protected Boolean initialValue() { + return false; + } + }; InjectedFileViewProvider(@NotNull PsiManager psiManager, @NotNull VirtualFileWindow virtualFile, @@ -142,7 +147,7 @@ public class InjectedFileViewProvider extends SingleRootFileViewProvider { @Override public boolean isEventSystemEnabled() { if (myLock == null) return true; // hack to avoid NPE when this method called from super class constructor - return physical; + return !disabledTemporarily.get(); } @Override @@ -152,18 +157,18 @@ public class InjectedFileViewProvider extends SingleRootFileViewProvider { public void performNonPhysically(Runnable runnable) { synchronized (myLock) { - physical = false; + disabledTemporarily.set(true); try { runnable.run(); } finally { - physical = true; + disabledTemporarily.set(false); } } } @Override public String toString() { - return "Injected file '"+getVirtualFile().getName()+"' " + (isValid() ? "" : " invalid") + (physical ? "" : " nonphysical"); + return "Injected file '"+getVirtualFile().getName()+"' " + (isValid() ? "" : " invalid") + (isPhysical() ? "" : " nonphysical"); } }