From d71b731f7aa0e2c64736c3f582175ef0fc197604 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 20 Dec 2016 12:46:09 +0100 Subject: [PATCH] remove some PsiLock usages in AST cloning and injection --- .../impl/source/tree/CompositeElement.java | 42 +++++++++---------- .../psi/impl/source/tree/TreeElement.java | 13 ++---- .../injected/InjectedLanguageManagerImpl.java | 3 +- .../tree/injected/InjectedLanguageUtil.java | 2 +- .../tree/injected/MultiHostRegistrarImpl.java | 2 +- 5 files changed, 27 insertions(+), 35 deletions(-) diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java index eeacd0eb13f2..7c4e68167608 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java @@ -75,36 +75,32 @@ public class CompositeElement extends TreeElement { public CompositeElement clone() { CompositeElement clone = (CompositeElement)super.clone(); - synchronized (PsiLock.LOCK) { - clone.firstChild = null; - clone.lastChild = null; - clone.myModificationsCount = 0; - clone.myWrapper = null; - for (ASTNode child = rawFirstChild(); child != null; child = child.getTreeNext()) { - clone.rawAddChildrenWithoutNotifications((TreeElement)child.clone()); - } - clone.clearCaches(); + clone.firstChild = null; + clone.lastChild = null; + clone.myModificationsCount = 0; + clone.myWrapper = null; + for (ASTNode child = rawFirstChild(); child != null; child = child.getTreeNext()) { + clone.rawAddChildrenWithoutNotifications((TreeElement)child.clone()); } + clone.clearCaches(); return clone; } public void subtreeChanged() { - synchronized (PsiLock.LOCK) { - CompositeElement compositeElement = this; - while(compositeElement != null) { - compositeElement.clearCaches(); - if (!(compositeElement instanceof PsiElement)) { - final PsiElement psi = compositeElement.myWrapper; - if (psi instanceof ASTDelegatePsiElement) { - ((ASTDelegatePsiElement)psi).subtreeChanged(); - } - else if (psi instanceof PsiFile) { - ((PsiFile)psi).subtreeChanged(); - } + CompositeElement compositeElement = this; + while(compositeElement != null) { + compositeElement.clearCaches(); + if (!(compositeElement instanceof PsiElement)) { + final PsiElement psi = compositeElement.myWrapper; + if (psi instanceof ASTDelegatePsiElement) { + ((ASTDelegatePsiElement)psi).subtreeChanged(); + } + else if (psi instanceof PsiFile) { + ((PsiFile)psi).subtreeChanged(); } - - compositeElement = compositeElement.getTreeParent(); } + + compositeElement = compositeElement.getTreeParent(); } } diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/TreeElement.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/TreeElement.java index 80568738634c..feba3bdd180e 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/TreeElement.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/TreeElement.java @@ -22,13 +22,11 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectCoreUtil; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiLock; import com.intellij.psi.TokenType; import com.intellij.psi.impl.DebugUtil; import com.intellij.psi.impl.ElementBase; import com.intellij.psi.impl.PsiManagerEx; import com.intellij.psi.impl.source.PsiFileImpl; -import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.tree.IElementType; import com.intellij.util.CharTable; import org.jetbrains.annotations.NonNls; @@ -57,13 +55,10 @@ public abstract class TreeElement extends ElementBase implements ASTNode, Clonea @Override public Object clone() { TreeElement clone = (TreeElement)super.clone(); - synchronized (PsiLock.LOCK) { - clone.myNextSibling = null; - clone.myPrevSibling = null; - clone.myParent = null; - clone.myStartOffsetInParent = -1; - } - + clone.myNextSibling = null; + clone.myPrevSibling = null; + clone.myParent = null; + clone.myStartOffsetInParent = -1; return clone; } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java index 82c842230805..543158a1bc56 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java @@ -64,6 +64,7 @@ import java.util.*; */ public class InjectedLanguageManagerImpl extends InjectedLanguageManager implements Disposable { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl"); + static final Object ourInjectionPsiLock = new String("injectionPsiLock"); private final Project myProject; private final DumbService myDumbService; private volatile DaemonProgressIndicator myProgress; @@ -152,7 +153,7 @@ public class InjectedLanguageManagerImpl extends InjectedLanguageManager impleme if (myProgress.isCanceled()) return; JobLauncher.getInstance().invokeConcurrentlyUnderProgress(new ArrayList<>(injected), myProgress, true, commitProcessor); - synchronized (PsiLock.LOCK) { + synchronized (ourInjectionPsiLock) { injected.clear(); injected.addAll(newDocuments); } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java index 790035902fb0..5b151b134022 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java @@ -466,7 +466,7 @@ public class InjectedLanguageUtil { } if (hostFile != null) { // modification of cachedInjectedDocuments must be under PsiLock - synchronized (PsiLock.LOCK) { + synchronized (InjectedLanguageManagerImpl.ourInjectionPsiLock) { List cachedInjectedDocuments = getCachedInjectedDocuments(hostFile); for (int i = cachedInjectedDocuments.size() - 1; i >= 0; i--) { DocumentWindow cachedInjectedDocument = cachedInjectedDocuments.get(i); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java index fd6edd4e4e15..c4e5a36fc2b3 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java @@ -231,7 +231,7 @@ public class MultiHostRegistrarImpl implements MultiHostRegistrar, ModificationT SmartPsiElementPointer pointer = ((ShredImpl)shreds.get(0)).getSmartPointer(); - synchronized (PsiLock.LOCK) { + synchronized (InjectedLanguageManagerImpl.ourInjectionPsiLock) { final ASTNode parsedNode = keepTreeFromChameleoningBack(psiFile); assert parsedNode instanceof FileElement : "Parsed to "+parsedNode+" instead of FileElement";