summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java')
-rw-r--r--platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java61
1 files changed, 37 insertions, 24 deletions
diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java b/platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java
index c5b183c3594b..f99d47201a20 100644
--- a/platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java
+++ b/platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java
@@ -56,20 +56,22 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.TestOnly;
import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
public class PostprocessReformattingAspect implements PomModelAspect {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.PostprocessReformattingAspect");
private final Project myProject;
private final PsiManager myPsiManager;
private final TreeAspect myTreeAspect;
- private final Map<FileViewProvider, List<ASTNode>> myReformatElements = new HashMap<FileViewProvider, List<ASTNode>>();
- private volatile int myDisabledCounter = 0;
- private final Set<FileViewProvider> myUpdatedProviders = new HashSet<FileViewProvider>();
- private final AtomicInteger myPostponedCounter = new AtomicInteger();
private static final Key<Throwable> REFORMAT_ORIGINATOR = Key.create("REFORMAT_ORIGINATOR");
private static final boolean STORE_REFORMAT_ORIGINATOR_STACKTRACE = ApplicationManager.getApplication().isInternal();
+ private final ThreadLocal<Context> myContext = new ThreadLocal<Context>() {
+ @Override
+ protected Context initialValue() {
+ return new Context();
+ }
+ };
+
public PostprocessReformattingAspect(Project project, PsiManager psiManager, TreeAspect treeAspect,final CommandProcessor processor) {
myProject = project;
myPsiManager = psiManager;
@@ -113,12 +115,12 @@ public class PostprocessReformattingAspect implements PomModelAspect {
public <T> T disablePostprocessFormattingInside(@NotNull Computable<T> computable) {
try {
- myDisabledCounter++;
+ getContext().myDisabledCounter++;
return computable.compute();
}
finally {
- myDisabledCounter--;
- LOG.assertTrue(myDisabledCounter > 0 || !isDisabled());
+ getContext().myDisabledCounter--;
+ LOG.assertTrue(getContext().myDisabledCounter > 0 || !isDisabled());
}
}
@@ -145,13 +147,13 @@ public class PostprocessReformattingAspect implements PomModelAspect {
}
private void incrementPostponedCounter() {
- myPostponedCounter.incrementAndGet();
+ getContext().myPostponedCounter++;
}
private void decrementPostponedCounter() {
Application application = ApplicationManager.getApplication();
application.assertIsDispatchThread();
- if (myPostponedCounter.decrementAndGet() == 0) {
+ if (--getContext().myPostponedCounter == 0) {
if (application.isWriteAccessAllowed()) {
doPostponedFormatting();
}
@@ -175,7 +177,7 @@ public class PostprocessReformattingAspect implements PomModelAspect {
atomic(new Runnable() {
@Override
public void run() {
- if (isDisabled() || myPostponedCounter.get() == 0 && !ApplicationManager.getApplication().isUnitTestMode()) return;
+ if (isDisabled() || getContext().myPostponedCounter == 0 && !ApplicationManager.getApplication().isUnitTestMode()) return;
final TreeChangeEvent changeSet = (TreeChangeEvent)event.getChangeSet(myTreeAspect);
if (changeSet == null) return;
final PsiElement psiElement = changeSet.getRootElement().getPsi();
@@ -184,7 +186,7 @@ public class PostprocessReformattingAspect implements PomModelAspect {
final FileViewProvider viewProvider = containingFile.getViewProvider();
if (!viewProvider.isEventSystemEnabled()) return;
- myUpdatedProviders.add(viewProvider);
+ getContext().myUpdatedProviders.add(viewProvider);
for (final ASTNode node : changeSet.getChangedElements()) {
final TreeChange treeChange = changeSet.getChangesByElement(node);
for (final ASTNode affectedChild : treeChange.getAffectedChildren()) {
@@ -221,7 +223,7 @@ public class PostprocessReformattingAspect implements PomModelAspect {
public void run() {
if (isDisabled()) return;
try {
- FileViewProvider[] viewProviders = myUpdatedProviders.toArray(new FileViewProvider[myUpdatedProviders.size()]);
+ FileViewProvider[] viewProviders = getContext().myUpdatedProviders.toArray(new FileViewProvider[getContext().myUpdatedProviders.size()]);
for (final FileViewProvider viewProvider : viewProviders) {
doPostponedFormatting(viewProvider);
}
@@ -230,7 +232,7 @@ public class PostprocessReformattingAspect implements PomModelAspect {
LOG.error(e);
}
finally {
- LOG.assertTrue(myReformatElements.isEmpty(), myReformatElements);
+ LOG.assertTrue(getContext().myReformatElements.isEmpty(), getContext().myReformatElements);
}
}
});
@@ -248,7 +250,7 @@ public class PostprocessReformattingAspect implements PomModelAspect {
atomic(new Runnable() {
@Override
public void run() {
- if (isDisabled() || check && !myUpdatedProviders.contains(viewProvider)) return;
+ if (isDisabled() || check && !getContext().myUpdatedProviders.contains(viewProvider)) return;
try {
disablePostprocessFormattingInside(new Runnable() {
@@ -259,8 +261,8 @@ public class PostprocessReformattingAspect implements PomModelAspect {
});
}
finally {
- myUpdatedProviders.remove(viewProvider);
- myReformatElements.remove(viewProvider);
+ getContext().myUpdatedProviders.remove(viewProvider);
+ getContext().myReformatElements.remove(viewProvider);
viewProvider.putUserData(REFORMAT_ORIGINATOR, null);
}
}
@@ -268,7 +270,7 @@ public class PostprocessReformattingAspect implements PomModelAspect {
}
public boolean isViewProviderLocked(@NotNull FileViewProvider fileViewProvider) {
- return myReformatElements.containsKey(fileViewProvider);
+ return getContext().myReformatElements.containsKey(fileViewProvider);
}
public void beforeDocumentChanged(@NotNull FileViewProvider viewProvider) {
@@ -292,10 +294,10 @@ public class PostprocessReformattingAspect implements PomModelAspect {
LOG.assertTrue(oldIndent >= 0,
"for not generated items old indentation must be defined: element=" + child + ", text=" + child.getText());
}
- List<ASTNode> list = myReformatElements.get(viewProvider);
+ List<ASTNode> list = getContext().myReformatElements.get(viewProvider);
if (list == null) {
list = new ArrayList<ASTNode>();
- myReformatElements.put(viewProvider, list);
+ getContext().myReformatElements.put(viewProvider, list);
if (STORE_REFORMAT_ORIGINATOR_STACKTRACE) {
viewProvider.putUserData(REFORMAT_ORIGINATOR, new Throwable());
}
@@ -304,7 +306,7 @@ public class PostprocessReformattingAspect implements PomModelAspect {
}
private void doPostponedFormattingInner(@NotNull FileViewProvider key) {
- final List<ASTNode> astNodes = myReformatElements.remove(key);
+ final List<ASTNode> astNodes = getContext().myReformatElements.remove(key);
final Document document = key.getDocument();
// Sort ranges by end offsets so that we won't need any offset adjustment after reformat or reindent
if (document == null) return;
@@ -370,7 +372,7 @@ public class PostprocessReformattingAspect implements PomModelAspect {
String expectedPsi = treeDebugBuilder.psiToString(psi);
if (!expectedPsi.equals(actualPsiTree)) {
- myReformatElements.clear();
+ getContext().myReformatElements.clear();
assert expectedPsi.equals(actualPsiTree) : "Refactored psi should be the same as result of parsing";
}
}
@@ -627,7 +629,7 @@ public class PostprocessReformattingAspect implements PomModelAspect {
}
public boolean isDisabled() {
- return myDisabledCounter > 0;
+ return getContext().myDisabledCounter > 0;
}
@NotNull
@@ -769,6 +771,17 @@ public class PostprocessReformattingAspect implements PomModelAspect {
@TestOnly
public void clear() {
- myReformatElements.clear();
+ getContext().myReformatElements.clear();
+ }
+
+ private Context getContext() {
+ return myContext.get();
+ }
+
+ private static class Context {
+ private int myPostponedCounter = 0;
+ private int myDisabledCounter = 0;
+ private final Set<FileViewProvider> myUpdatedProviders = new HashSet<FileViewProvider>();
+ private final Map<FileViewProvider, List<ASTNode>> myReformatElements = new HashMap<FileViewProvider, List<ASTNode>>();
}
}