From 8c52bd3f9c5a1601d5df9eb6c28787ef80330d69 Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Tue, 25 Oct 2016 13:28:55 +0300 Subject: [PATCH] [Parameter Name Hints] refactoring, removed language field from hints provider extension --- .../hints/JavaInlayParameterHintsProvider.kt | 4 - .../hints/InlayParameterHintsProvider.kt | 9 +- .../hints/ParameterHintsPassFactory.java | 12 ++- .../codeInsight/hints/PopupActions.kt | 2 +- .../ParameterNameHintsConfigurable.java | 24 +++-- .../settings/ParameterNameHintsSettings.kt | 98 ++++++++++--------- .../settings/ParameterNameSettingsTest.kt | 18 ++-- 7 files changed, 90 insertions(+), 77 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/hints/JavaInlayParameterHintsProvider.kt b/java/java-impl/src/com/intellij/codeInsight/hints/JavaInlayParameterHintsProvider.kt index 2cd887426c2a..fbc0fbecd63e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/hints/JavaInlayParameterHintsProvider.kt +++ b/java/java-impl/src/com/intellij/codeInsight/hints/JavaInlayParameterHintsProvider.kt @@ -15,8 +15,6 @@ */ package com.intellij.codeInsight.hints -import com.intellij.lang.Language -import com.intellij.lang.java.JavaLanguage import com.intellij.psi.PsiCallExpression import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod @@ -48,8 +46,6 @@ class JavaInlayParameterHintsProvider : InlayParameterHintsProvider { return MethodInfo(fullMethodName, paramNames) } - override val language: Language = JavaLanguage.INSTANCE - override val defaultBlackList = setOf( "(begin*, end*)", "(start*, end*)", diff --git a/platform/lang-api/src/com/intellij/codeInsight/hints/InlayParameterHintsProvider.kt b/platform/lang-api/src/com/intellij/codeInsight/hints/InlayParameterHintsProvider.kt index 6d9dc91dd9bd..e04cd417f15f 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/hints/InlayParameterHintsProvider.kt +++ b/platform/lang-api/src/com/intellij/codeInsight/hints/InlayParameterHintsProvider.kt @@ -15,7 +15,6 @@ */ package com.intellij.codeInsight.hints -import com.intellij.lang.Language import com.intellij.lang.LanguageExtension import com.intellij.psi.PsiElement import org.jetbrains.annotations.ApiStatus @@ -36,13 +35,7 @@ interface InlayParameterHintsProvider { * and selects "Do not show for this method". */ fun getMethodInfo(element: PsiElement): MethodInfo? = null - - /** - * Language used when saving blacklist methods - * Maybe will be moved to MethodInfo - */ - val language: Language - + /** * Default list of methods for which hints should not be shown */ diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hints/ParameterHintsPassFactory.java b/platform/lang-impl/src/com/intellij/codeInsight/hints/ParameterHintsPassFactory.java index fd49d5736ed5..f34b61e7db29 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hints/ParameterHintsPassFactory.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/hints/ParameterHintsPassFactory.java @@ -22,7 +22,9 @@ import com.intellij.codeHighlighting.TextEditorHighlightingPassRegistrar; import com.intellij.codeInsight.daemon.impl.ParameterHintsPresentationManager; import com.intellij.codeInsight.hints.filtering.Matcher; import com.intellij.codeInsight.hints.filtering.MatcherConstructor; +import com.intellij.codeInsight.hints.settings.Diff; import com.intellij.codeInsight.hints.settings.ParameterNameHintsSettings; +import com.intellij.lang.Language; import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Editor; @@ -71,12 +73,14 @@ public class ParameterHintsPassFactory extends AbstractProjectComponent implemen myAnnotations.clear(); if (!isEnabled()) return; - InlayParameterHintsProvider provider = InlayParameterHintsExtension.INSTANCE.forLanguage(myFile.getLanguage()); + Language language = myFile.getLanguage(); + InlayParameterHintsProvider provider = InlayParameterHintsExtension.INSTANCE.forLanguage(language); if (provider == null) return; - List matchers = ParameterNameHintsSettings - .getInstance() - .getIgnorePatternSet(provider) + Diff diff = ParameterNameHintsSettings.getInstance().getBlackListDiff(language); + Set blackList = diff.applyOn(provider.getDefaultBlackList()); + + List matchers = blackList .stream() .map((item) -> MatcherConstructor.INSTANCE.createMatcher(item)) .collect(Collectors.toList()); 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 1d4e224bd6ab..cbbe24034532 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hints/PopupActions.kt +++ b/platform/lang-impl/src/com/intellij/codeInsight/hints/PopupActions.kt @@ -50,7 +50,7 @@ class ShowParameterHintsSettings : AnAction() { val project = CommonDataKeys.PROJECT.getData(e.dataContext) ?: return val file = CommonDataKeys.PSI_FILE.getData(e.dataContext) ?: return val hintExtension = InlayParameterHintsExtension.forLanguage(file.language) ?: return - val dialog = ParameterNameHintsConfigurable(project, hintExtension) + val dialog = ParameterNameHintsConfigurable(project, hintExtension.defaultBlackList, file.language) 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 fc19484b00b4..fad2ac7c7039 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 @@ -15,8 +15,8 @@ */ package com.intellij.codeInsight.hints.settings; -import com.intellij.codeInsight.hints.InlayParameterHintsProvider; import com.intellij.codeInsight.hints.filtering.MatcherConstructor; +import com.intellij.lang.Language; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.editor.event.DocumentAdapter; import com.intellij.openapi.editor.event.DocumentEvent; @@ -38,12 +38,16 @@ import java.util.stream.Collectors; public class ParameterNameHintsConfigurable extends DialogWrapper { private final Project myProject; - private final InlayParameterHintsProvider myHintsProvider; - - public ParameterNameHintsConfigurable(@NotNull Project project, @NotNull InlayParameterHintsProvider provider) { + private final Set myDefaultBlackList; + private final Language myLanguage; + + public ParameterNameHintsConfigurable(@NotNull Project project, + @NotNull Set defaultBlackList, + @NotNull Language language) { super(project); myProject = project; - myHintsProvider = provider; + myDefaultBlackList = defaultBlackList; + myLanguage = language; setTitle("Configure Parameter Name Hints Blacklist"); init(); } @@ -70,7 +74,8 @@ public class ParameterNameHintsConfigurable extends DialogWrapper { .filter((e) -> !e.trim().isEmpty()) .collect(Collectors.toSet()); - ParameterNameHintsSettings.getInstance().setIgnorePatternSet(myHintsProvider, updatedBlackList); + Diff diff = Diff.Builder.build(myDefaultBlackList, updatedBlackList); + ParameterNameHintsSettings.getInstance().setBlackListDiff(myLanguage, diff); } @Nullable @@ -85,10 +90,11 @@ public class ParameterNameHintsConfigurable extends DialogWrapper { private void createUIComponents() { EditorTextFieldProvider service = ServiceManager.getService(myProject, EditorTextFieldProvider.class); myEditorTextField = service.getEditorField(PlainTextLanguage.INSTANCE, myProject, ContainerUtil.emptyIterable()); - - Set blacklist = ParameterNameHintsSettings.getInstance().getIgnorePatternSet(myHintsProvider); + + Diff diff = ParameterNameHintsSettings.getInstance().getBlackListDiff(myLanguage); + Set blacklist = diff.applyOn(myDefaultBlackList); + String text = StringUtil.join(blacklist, "\n"); - myEditorTextField.setText(text); myEditorTextField.addDocumentListener(new DocumentAdapter() { @Override diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hints/settings/ParameterNameHintsSettings.kt b/platform/lang-impl/src/com/intellij/codeInsight/hints/settings/ParameterNameHintsSettings.kt index e0362885e391..1a941281117d 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hints/settings/ParameterNameHintsSettings.kt +++ b/platform/lang-impl/src/com/intellij/codeInsight/hints/settings/ParameterNameHintsSettings.kt @@ -1,6 +1,5 @@ package com.intellij.codeInsight.hints.settings -import com.intellij.codeInsight.hints.InlayParameterHintsProvider import com.intellij.lang.Language import com.intellij.openapi.components.PersistentStateComponent import com.intellij.openapi.components.State @@ -19,11 +18,52 @@ private object XmlTagHelper { } +class Diff(val added: Set, val removed: Set) { + + fun applyOn(base: Set): Set { + val baseSet = base.toMutableSet() + added.forEach { baseSet.add(it) } + removed.forEach { baseSet.remove(it) } + return baseSet + } + + companion object Builder { + fun build(base: Set, updated: Set): Diff { + val removed = base.toMutableSet() + removed.removeAll(updated) + + val added = updated.toMutableSet() + added.removeAll(base) + + return Diff(added, removed) + } + } + +} + + @State(name = "ParameterNameHintsSettings", storages = arrayOf(Storage("parameter.hints.xml"))) class ParameterNameHintsSettings : PersistentStateComponent { - private val myRemovedPatterns = hashMapOf>() - private val myAddedPatterns = hashMapOf>() + private val myRemovedPatterns = hashMapOf>() + private val myAddedPatterns = hashMapOf>() + fun addIgnorePattern(language: Language, pattern: String) { + val patternsBefore = getAddedPatterns(language) + setAddedPatterns(language, patternsBefore + pattern) + } + + fun getBlackListDiff(language: Language): Diff { + val added = getAddedPatterns(language) + val removed = getRemovedPatterns(language) + + return Diff(added, removed) + } + + fun setBlackListDiff(language: Language, diff: Diff) { + setAddedPatterns(language, diff.added) + setRemovedPatterns(language, diff.removed) + } + override fun getState(): Element { val root = Element("settings") val blacklists = root.getOrCreateChild(XmlTagHelper.BLACKLISTS) @@ -47,73 +87,43 @@ class ParameterNameHintsSettings : PersistentStateComponent { myRemovedPatterns[language] = it.extractPatterns(XmlTagHelper.REMOVED) } } - - fun addIgnorePattern(language: Language, pattern: String) { - val patternsBefore = getAddedPatterns(language) - setAddedPatterns(language, patternsBefore + pattern) - } - - fun getIgnorePatternSet(hintsProvider: InlayParameterHintsProvider): Set { - val added = getAddedPatterns(hintsProvider.language) - val removed = getRemovedPatterns(hintsProvider.language) - - val updated = hintsProvider.defaultBlackList.toMutableSet() - updated.removeAll(removed) - updated.addAll(added) - - return updated - } - - fun setIgnorePatternSet(provider: InlayParameterHintsProvider, updatedBlackList: Set) { - val defaultBlackList = provider.defaultBlackList - - val removed = defaultBlackList.toMutableSet() - removed.removeAll(updatedBlackList) - - val added = updatedBlackList.toMutableSet() - added.removeAll(defaultBlackList) - - val language = provider.language - setRemovedPatterns(language, removed) - setAddedPatterns(language, added) - } companion object { @JvmStatic fun getInstance() = service() } - private fun getAddedPatterns(language: Language): List { + private fun getAddedPatterns(language: Language): Set { val key = language.displayName - return myAddedPatterns[key] ?: emptyList() + return myAddedPatterns[key] ?: emptySet() } - private fun getRemovedPatterns(language: Language): List { + private fun getRemovedPatterns(language: Language): Set { val key = language.displayName - return myRemovedPatterns[key] ?: emptyList() + return myRemovedPatterns[key] ?: emptySet() } - private fun setRemovedPatterns(language: Language, removed: Collection) { + private fun setRemovedPatterns(language: Language, removed: Set) { val key = language.displayName - myRemovedPatterns[key] = removed.toList() + myRemovedPatterns[key] = removed } - private fun setAddedPatterns(language: Language, added: Collection) { + private fun setAddedPatterns(language: Language, added: Set) { val key = language.displayName - myAddedPatterns[key] = added.toList() + myAddedPatterns[key] = added } } -private fun Element.addLanguagePatternElements(language: String, patterns: List, tag: String) { +private fun Element.addLanguagePatternElements(language: String, patterns: Set, tag: String) { val list = getOrCreateChild(XmlTagHelper.LANGUAGE_LIST) list.setAttribute(XmlTagHelper.LANGUAGE, language) val elements = patterns.map { it.toPatternElement(tag) } list.addContent(elements) } -private fun Element.extractPatterns(tag: String): List { - return getChildren(tag).mapNotNull { it.attributeValue(XmlTagHelper.PATTERN) } +private fun Element.extractPatterns(tag: String): Set { + return getChildren(tag).mapNotNull { it.attributeValue(XmlTagHelper.PATTERN) }.toSet() } private fun Element.attributeValue(attr: String): String? = this.getAttribute(attr)?.value diff --git a/platform/lang-impl/testSources/com/intellij/codeInsight/hints/settings/ParameterNameSettingsTest.kt b/platform/lang-impl/testSources/com/intellij/codeInsight/hints/settings/ParameterNameSettingsTest.kt index 83bd177c73be..b46d1dc63c5b 100644 --- a/platform/lang-impl/testSources/com/intellij/codeInsight/hints/settings/ParameterNameSettingsTest.kt +++ b/platform/lang-impl/testSources/com/intellij/codeInsight/hints/settings/ParameterNameSettingsTest.kt @@ -16,14 +16,12 @@ package com.intellij.codeInsight.hints.settings import com.intellij.codeInsight.hints.InlayParameterHintsProvider -import com.intellij.lang.Language import com.intellij.openapi.fileTypes.PlainTextLanguage import junit.framework.TestCase -class MockInlayProvider(override val defaultBlackList: Set): InlayParameterHintsProvider { - override val language: Language = PlainTextLanguage.INSTANCE -} +class MockInlayProvider(override val defaultBlackList: Set): InlayParameterHintsProvider + class ParameterNameSettingsTest : TestCase() { @@ -40,14 +38,20 @@ class ParameterNameSettingsTest : TestCase() { } fun addIgnorePattern(newPattern: String) { - settings.addIgnorePattern(inlayProvider.language, newPattern) + settings.addIgnorePattern(PlainTextLanguage.INSTANCE, newPattern) } fun setIgnorePattern(vararg newPatternSet: String) { - settings.setIgnorePatternSet(inlayProvider, setOf(*newPatternSet)) + val base = inlayProvider.defaultBlackList + val diff = Diff.build(base, setOf(*newPatternSet)) + + settings.setBlackListDiff(PlainTextLanguage.INSTANCE, diff) } - fun getIgnoreSet(): Set = settings.getIgnorePatternSet(inlayProvider) + fun getIgnoreSet(): Set { + val diff = settings.getBlackListDiff(PlainTextLanguage.INSTANCE) + return diff.applyOn(inlayProvider.defaultBlackList) + } fun `test ignore pattern is added`() { defaultSettingsUpdated("xxx")