From e818e2a4c037212bc7742afdc33c9cbbdc2fd6f4 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Thu, 10 Aug 2017 19:50:25 +0300 Subject: [PATCH] registry prop for turning code-block and java-structure mod trackers --- .../com/intellij/psi/impl/PsiManagerImpl.java | 9 ++++++- .../psi/impl/PsiModificationTrackerImpl.java | 25 ++++++++----------- .../util/resources/misc/registry.properties | 5 ++++ 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/platform/core-impl/src/com/intellij/psi/impl/PsiManagerImpl.java b/platform/core-impl/src/com/intellij/psi/impl/PsiManagerImpl.java index 8de3f04706d6..414522e8bae9 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/PsiManagerImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/PsiManagerImpl.java @@ -19,7 +19,6 @@ package com.intellij.psi.impl; import com.intellij.lang.PsiBuilderFactory; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.Result; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; @@ -367,9 +366,17 @@ public class PsiManagerImpl extends PsiManagerEx { for (PsiTreeChangePreprocessor preprocessor : myTreeChangePreprocessors) { preprocessor.treeChanged(event); } + boolean enableOutOfCodeBlockTracking = myModificationTracker.getOutOfCodeBlockModificationTracker() != myModificationTracker; for (PsiTreeChangePreprocessor preprocessor : Extensions.getExtensions(PsiTreeChangePreprocessor.EP_NAME, myProject)) { + if (!enableOutOfCodeBlockTracking && preprocessor instanceof PsiTreeChangePreprocessorBase) continue; preprocessor.treeChanged(event); } + if (!enableOutOfCodeBlockTracking) { + for (PsiTreeChangePreprocessor preprocessor : Extensions.getExtensions(PsiTreeChangePreprocessor.EP_NAME, myProject)) { + if (!(preprocessor instanceof PsiTreeChangePreprocessorBase)) continue; + ((PsiTreeChangePreprocessorBase)preprocessor).onOutOfCodeBlockModification(event); + } + } for (PsiTreeChangeListener listener : myTreeChangeListeners) { try { diff --git a/platform/core-impl/src/com/intellij/psi/impl/PsiModificationTrackerImpl.java b/platform/core-impl/src/com/intellij/psi/impl/PsiModificationTrackerImpl.java index c17ea6eeadf1..1fc5d46bfcf7 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/PsiModificationTrackerImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/PsiModificationTrackerImpl.java @@ -21,6 +21,7 @@ import com.intellij.openapi.application.TransactionGuardImpl; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.ModificationTracker; +import com.intellij.openapi.util.registry.Registry; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiTreeChangeEvent; import com.intellij.psi.util.PsiModificationTracker; @@ -37,9 +38,16 @@ import static com.intellij.psi.impl.PsiTreeChangeEventImpl.PsiEventType.PROPERTY * Date: Jul 18, 2002 */ public class PsiModificationTrackerImpl implements PsiModificationTracker, PsiTreeChangePreprocessor { + private final boolean myEnableCodeBlockTracker = Registry.is("psi.modification.tracker.code-block"); + private final boolean myEnableJavaStructureTracker = Registry.is("psi.modification.tracker.java-structure"); + private final AtomicLong myModificationCount = new AtomicLong(0); - private final AtomicLong myOutOfCodeBlockModificationCount = new AtomicLong(0); - private final AtomicLong myJavaStructureModificationCount = new AtomicLong(0); + private final AtomicLong myOutOfCodeBlockModificationCount = myEnableCodeBlockTracker ? new AtomicLong(0) : myModificationCount; + private final AtomicLong myJavaStructureModificationCount = myEnableJavaStructureTracker ? new AtomicLong(0) : myModificationCount; + + private final ModificationTracker myOutOfCodeBlockModificationTracker = myEnableCodeBlockTracker ? () -> getOutOfCodeBlockModificationCount() : this; + private final ModificationTracker myJavaStructureModificationTracker = myEnableJavaStructureTracker ? () -> getJavaStructureModificationCount() : this; + private final Listener myPublisher; public PsiModificationTrackerImpl(Project project) { @@ -114,13 +122,6 @@ public class PsiModificationTrackerImpl implements PsiModificationTracker, PsiTr return myOutOfCodeBlockModificationCount.get(); } - private final ModificationTracker myOutOfCodeBlockModificationTracker = new ModificationTracker() { - @Override - public long getModificationCount() { - return getOutOfCodeBlockModificationCount(); - } - }; - @NotNull @Override public ModificationTracker getOutOfCodeBlockModificationTracker() { @@ -132,12 +133,6 @@ public class PsiModificationTrackerImpl implements PsiModificationTracker, PsiTr return myJavaStructureModificationCount.get(); } - private final ModificationTracker myJavaStructureModificationTracker = new ModificationTracker() { - @Override - public long getModificationCount() { - return getJavaStructureModificationCount(); - } - }; @NotNull @Override public ModificationTracker getJavaStructureModificationTracker() { diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 64cef3ef3b2a..6e00740200fc 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -367,6 +367,11 @@ psi.track.invalidation.description=When PSI elements are invalidated, store stac psi.element.list.cell.renderer.focus.border.enabled=false psi.element.list.cell.renderer.focus.border.enabled.description=Enables default focus border in a list of PSI elements. +psi.modification.tracker.code-block=true +psi.modification.tracker.code-block.description=Controls out-of-code-block PSI modification tracker optimization (requires project reopening) +psi.modification.tracker.java-structure=true +psi.modification.tracker.java-structure.description=Controls java-structure PSI modification tracker optimization (requires project reopening) + ide.suggest.file.when.creating.filename.like.directory=true ide.suggest.file.when.creating.filename.like.directory.description=When creating a directory named foo.txt, suggest to create a file with such a name instead