From e37fc7d205fde661a223be6895c3e0904d7ecc89 Mon Sep 17 00:00:00 2001 From: Rustam Vishnyakov Date: Fri, 20 Dec 2019 16:14:02 +0300 Subject: [PATCH] Register/unregister CommonCodeStyleSettings from LanguageCodeStyleSettingsProvider GitOrigin-RevId: f35d03c74fa85d3e0d9bbe70d9cd261c58c18c30 --- .../AppCodeStyleSettingsManager.java | 23 +++++++++++++++ .../psi/codeStyle/CodeStyleSettings.java | 9 ++++++ .../codeStyle/CodeStyleSettingsManager.java | 29 ++++++++++++++++++- .../CommonCodeStyleSettingsManager.java | 8 +++++ .../LanguageCodeStyleSettingsProvider.java | 5 ++++ .../codeStyle/CodeStyleSchemesImpl.java | 16 ++++++++++ .../src/META-INF/FormatterExtensionPoints.xml | 2 +- 7 files changed, 90 insertions(+), 2 deletions(-) diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/AppCodeStyleSettingsManager.java b/platform/lang-api/src/com/intellij/psi/codeStyle/AppCodeStyleSettingsManager.java index 1b4892893da6..97f0f01e50df 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/AppCodeStyleSettingsManager.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/AppCodeStyleSettingsManager.java @@ -1,9 +1,13 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.psi.codeStyle; +import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; +import com.intellij.openapi.extensions.ExtensionPointListener; +import com.intellij.openapi.extensions.PluginDescriptor; +import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.Collections; @@ -15,6 +19,25 @@ public final class AppCodeStyleSettingsManager extends CodeStyleSettingsManager registerExtensionPointListeners(ApplicationManager.getApplication()); } + @Override + protected void registerExtensionPointListeners(@NotNull Disposable disposable) { + super.registerExtensionPointListeners(disposable); + LanguageCodeStyleSettingsProvider.EP_NAME.addExtensionPointListener( + new ExtensionPointListener() { + @Override + public void extensionAdded(@NotNull LanguageCodeStyleSettingsProvider extension, @NotNull PluginDescriptor pluginDescriptor) { + LanguageCodeStyleSettingsProvider.resetSettingsPagesProviders(); + } + + @Override + public void extensionRemoved(@NotNull LanguageCodeStyleSettingsProvider extension, @NotNull PluginDescriptor pluginDescriptor) { + LanguageCodeStyleSettingsProvider.resetSettingsPagesProviders(); + } + }, + disposable + ); + } + @Override protected Collection enumSettings() { return getMainProjectCodeStyle() != null ? diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java index 0934aa361dd3..980e4991abaa 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java @@ -1413,4 +1413,13 @@ public class CodeStyleSettings extends LegacyCodeStyleSettings implements Clonea return myModificationTracker; } + @ApiStatus.Internal + public void removeSettings(@NotNull LanguageCodeStyleSettingsProvider provider) { + myCommonSettingsManager.removeLanguageSettings(provider.getLanguage()); + } + + @ApiStatus.Internal + public void registerSettings(@NotNull LanguageCodeStyleSettingsProvider provider) { + myCommonSettingsManager.addLanguageSettings(provider.getLanguage(), provider.getDefaultCommonSettings()); + } } diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsManager.java b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsManager.java index 4c9568617cde..dbaa1043435a 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsManager.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsManager.java @@ -60,7 +60,7 @@ public class CodeStyleSettingsManager implements PersistentStateComponent() { @Override @@ -89,6 +89,19 @@ public class CodeStyleSettingsManager implements PersistentStateComponent() { + @Override + public void extensionAdded(@NotNull LanguageCodeStyleSettingsProvider extension, @NotNull PluginDescriptor pluginDescriptor) { + registerLanguageSettings(enumSettings(), extension); + } + + @Override + public void extensionRemoved(@NotNull LanguageCodeStyleSettingsProvider extension, @NotNull PluginDescriptor pluginDescriptor) { + unregisterLanguageSettings(enumSettings(), extension); + } + }, disposable + ); } protected Collection enumSettings() { return Collections.emptyList(); } @@ -108,6 +121,20 @@ public class CodeStyleSettingsManager implements PersistentStateComponent allSettings, + @NotNull LanguageCodeStyleSettingsProvider provider) { + allSettings.forEach(settings -> settings.registerSettings(provider)); + notifyCodeStyleSettingsChanged(); + } + + @ApiStatus.Internal + public final void unregisterLanguageSettings(@NotNull Collection allSettings, + @NotNull LanguageCodeStyleSettingsProvider provider) { + allSettings.forEach(settings -> settings.removeSettings(provider)); + notifyCodeStyleSettingsChanged(); + } + /** * @deprecated Use one of the following methods: *
    diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettingsManager.java b/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettingsManager.java index 2d71fc3bdbe6..eb6605d0e3b0 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettingsManager.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettingsManager.java @@ -247,4 +247,12 @@ class CommonCodeStyleSettingsManager { } return false; } + + void removeLanguageSettings(@NotNull Language language) { + myCommonSettingsMap.remove(language); + } + + void addLanguageSettings(@NotNull Language language, @NotNull CommonCodeStyleSettings settings) { + myCommonSettingsMap.put(language, settings); + } } diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/LanguageCodeStyleSettingsProvider.java b/platform/lang-api/src/com/intellij/psi/codeStyle/LanguageCodeStyleSettingsProvider.java index d215f7b1cd6b..fa40adf97c95 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/LanguageCodeStyleSettingsProvider.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/LanguageCodeStyleSettingsProvider.java @@ -368,6 +368,11 @@ public abstract class LanguageCodeStyleSettingsProvider extends CodeStyleSetting private static final AtomicReference> ourSettingsPagesProviders = new AtomicReference<>(); + @ApiStatus.Internal + public static void resetSettingsPagesProviders() { + ourSettingsPagesProviders.set(null); + } + /** * @return A list of providers implementing {@link #createConfigurable(CodeStyleSettings, CodeStyleSettings)} */ diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemesImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemesImpl.java index 9e2eadd5eda9..5f2f26c0264b 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemesImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemesImpl.java @@ -58,6 +58,22 @@ public abstract class CodeStyleSchemesImpl extends CodeStyleSchemes { .unregisterFileTypeIndentOptions(getAllSettings(), extension.getFileType()); } }, ApplicationManager.getApplication()); + + LanguageCodeStyleSettingsProvider.EP_NAME.addExtensionPointListener( + new ExtensionPointListener() { + @Override + public void extensionAdded(@NotNull LanguageCodeStyleSettingsProvider extension, @NotNull PluginDescriptor pluginDescriptor) { + //noinspection deprecation + CodeStyleSettingsManager.getInstance().registerLanguageSettings(getAllSettings(), extension); + } + + @Override + public void extensionRemoved(@NotNull LanguageCodeStyleSettingsProvider extension, @NotNull PluginDescriptor pluginDescriptor) { + //noinspection deprecation + CodeStyleSettingsManager.getInstance().unregisterLanguageSettings(getAllSettings(), extension); + } + }, ApplicationManager.getApplication() + ); } private List getAllSettings() { diff --git a/platform/platform-resources/src/META-INF/FormatterExtensionPoints.xml b/platform/platform-resources/src/META-INF/FormatterExtensionPoints.xml index 6f53888213d8..78c9aed87996 100644 --- a/platform/platform-resources/src/META-INF/FormatterExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/FormatterExtensionPoints.xml @@ -40,7 +40,7 @@ - +