From 3c49259246d801c9824152ccd9187a2ae6b5a96e Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Wed, 2 Nov 2016 22:33:50 +0300 Subject: [PATCH] [Parameter Name Hints] language aware blacklist dialog --- .../codeInsight/hints/PopupActions.kt | 5 +- .../ParameterNameHintsConfigurable.java | 114 +++++++++++++----- 2 files changed, 88 insertions(+), 31 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hints/PopupActions.kt b/platform/lang-impl/src/com/intellij/codeInsight/hints/PopupActions.kt index 9cdf7d17c5fc..b8992f6eafcc 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hints/PopupActions.kt +++ b/platform/lang-impl/src/com/intellij/codeInsight/hints/PopupActions.kt @@ -60,9 +60,10 @@ class ShowSettingsWithAddedPattern : AnAction() { val file = CommonDataKeys.PSI_FILE.getData(e.dataContext) ?: return val editor = CommonDataKeys.EDITOR.getData(e.dataContext) ?: return - val hintExtension = InlayParameterHintsExtension.forLanguage(file.language) ?: return + val language = file.language.baseLanguage ?: file.language + InlayParameterHintsExtension.forLanguage(language) ?: return val info = getMethodInfoAtOffset(editor, file) ?: return - val dialog = ParameterNameHintsConfigurable(project, hintExtension.defaultBlackList, file.language, info.toPattern()) + val dialog = ParameterNameHintsConfigurable(project, language, info.toPattern()) dialog.show() } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hints/settings/ParameterNameHintsConfigurable.java b/platform/lang-impl/src/com/intellij/codeInsight/hints/settings/ParameterNameHintsConfigurable.java index 6c6d2613ee99..d3fae792998b 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hints/settings/ParameterNameHintsConfigurable.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/hints/settings/ParameterNameHintsConfigurable.java @@ -16,6 +16,7 @@ package com.intellij.codeInsight.hints.settings; import com.intellij.codeInsight.hints.InlayParameterHintsExtension; +import com.intellij.codeInsight.hints.InlayParameterHintsProvider; import com.intellij.codeInsight.hints.filtering.MatcherConstructor; import com.intellij.lang.Language; import com.intellij.openapi.editor.Document; @@ -30,15 +31,18 @@ import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.EditorTextField; import com.intellij.ui.ListCellRendererWrapper; -import com.intellij.util.containers.JBIterable; +import com.intellij.util.containers.ContainerUtil; import org.jdesktop.swingx.combobox.ListComboBoxModel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; -import java.util.Collection; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -47,26 +51,22 @@ public class ParameterNameHintsConfigurable extends DialogWrapper { private EditorTextField myEditorTextField; private ComboBox myCurrentLanguageCombo; - private final Set myDefaultBlackList; - private final Language myLanguage; + private final Language myInitiallySelectedLanguage; private final String myNewPreselectedItem; private final Project myProject; - public ParameterNameHintsConfigurable(@NotNull Project project, - @NotNull Set defaultBlackList, - @NotNull Language language) { - this(project, defaultBlackList, language, null); - } + private final Map myBlackLists; public ParameterNameHintsConfigurable(@NotNull Project project, - @NotNull Set defaultBlackList, - @NotNull Language language, + @NotNull Language selectedLanguage, @Nullable String newPreselectedPattern) { super(project); myProject = project; - myLanguage = language; - myDefaultBlackList = defaultBlackList; + myInitiallySelectedLanguage = selectedLanguage; + myNewPreselectedItem = newPreselectedPattern; + myBlackLists = ContainerUtil.newHashMap(); + setTitle("Configure Parameter Name Hints Blacklist"); init(); } @@ -87,14 +87,27 @@ public class ParameterNameHintsConfigurable extends DialogWrapper { protected void doOKAction() { super.doOKAction(); + Language language = (Language)myCurrentLanguageCombo.getModel().getSelectedItem(); + myBlackLists.put(language, myEditorTextField.getText()); + + myBlackLists.entrySet().forEach((entry) -> { + Language lang = entry.getKey(); + String text = entry.getValue(); + storeBlackListDiff(lang, text); + }); + } + + private static void storeBlackListDiff(@NotNull Language language, @NotNull String text) { Set updatedBlackList = StringUtil - .split(myEditorTextField.getText(), "\n") + .split(text, "\n") .stream() .filter((e) -> !e.trim().isEmpty()) .collect(Collectors.toSet()); - - Diff diff = Diff.Builder.build(myDefaultBlackList, updatedBlackList); - ParameterNameHintsSettings.getInstance().setBlackListDiff(myLanguage, diff); + + InlayParameterHintsProvider provider = InlayParameterHintsExtension.INSTANCE.forLanguage(language); + Set defaultBlackList = provider.getDefaultBlackList(); + Diff diff = Diff.Builder.build(defaultBlackList, updatedBlackList); + ParameterNameHintsSettings.getInstance().setBlackListDiff(language, diff); } @Nullable @@ -104,34 +117,77 @@ public class ParameterNameHintsConfigurable extends DialogWrapper { } private void createUIComponents() { - Diff diff = ParameterNameHintsSettings.getInstance().getBlackListDiff(myLanguage); - Set blacklist = diff.applyOn(myDefaultBlackList); - - myEditorTextField = createEditor(blacklist, myNewPreselectedItem); + List languages = getBaseLanguagesWithProviders(); + + Language selected = myInitiallySelectedLanguage; + if (selected == null) { + selected = languages.get(0); + } + + String text = getLanguageBlackList(selected); + myEditorTextField = createEditor(text, myNewPreselectedItem); myEditorTextField.addDocumentListener(new DocumentAdapter() { @Override public void documentChanged(DocumentEvent e) { updateOkEnabled(); } }); - - Collection allLanguages = Language.getRegisteredLanguages(); - JBIterable languagesWithHintsSupport = JBIterable.from(allLanguages) - .filter((lang) -> !InlayParameterHintsExtension.INSTANCE.forKey(lang).isEmpty()); - ListComboBoxModel model = new ListComboBoxModel<>(languagesWithHintsSupport.toList()); + initLanguageCombo(languages, selected); + } + + private void initLanguageCombo(List languages, Language selected) { + ListComboBoxModel model = new ListComboBoxModel<>(languages); + myCurrentLanguageCombo = new ComboBox<>(model); + myCurrentLanguageCombo.setSelectedItem(selected); myCurrentLanguageCombo.setRenderer(new ListCellRendererWrapper() { @Override public void customize(JList list, Language value, int index, boolean selected, boolean hasFocus) { setText(value.getDisplayName()); } }); + + myCurrentLanguageCombo.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + Language language = (Language)e.getItem(); + if (e.getStateChange() == ItemEvent.DESELECTED) { + myBlackLists.put(language, myEditorTextField.getText()); + } + else if (e.getStateChange() == ItemEvent.SELECTED) { + String text = myBlackLists.get(language); + if (text == null) { + text = getLanguageBlackList(language); + } + myEditorTextField.setText(text); + } + } + }); } - private EditorTextField createEditor(@NotNull Set blacklist, @Nullable String newPreselectedItem) { - String text = StringUtil.join(blacklist, "\n"); - + @NotNull + private static String getLanguageBlackList(@NotNull Language language) { + InlayParameterHintsProvider hintsProvider = InlayParameterHintsExtension.INSTANCE.forLanguage(language); + if (hintsProvider == null) { + return ""; + } + Diff diff = ParameterNameHintsSettings.getInstance().getBlackListDiff(language); + Set blackList = diff.applyOn(hintsProvider.getDefaultBlackList()); + return StringUtil.join(blackList, "\n"); + } + + @NotNull + private static List getBaseLanguagesWithProviders() { + return Language.getRegisteredLanguages() + .stream() + .filter(lang -> lang.getBaseLanguage() == null) + .filter(lang -> InlayParameterHintsExtension.INSTANCE.forLanguage(lang) != null) + .sorted(Comparator.comparingInt(l -> l.getDisplayName().length())) + .collect(Collectors.toList()); + } + + private EditorTextField createEditor(@NotNull String text, @Nullable String newPreselectedItem) { final TextRange range; if (newPreselectedItem != null) { text += "\n";