From 30a1c18fa9a75c10332247db4e8ecef0c55ebc85 Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Mon, 17 Oct 2016 20:04:47 +0300 Subject: [PATCH] [Parameter Name Hints] simplified, corrected xml structure --- .../settings/ParameterNameHintsSettings.kt | 99 +++++++++++++------ 1 file changed, 67 insertions(+), 32 deletions(-) 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 01797b3c939e..e0362885e391 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 @@ -10,7 +10,8 @@ import org.jdom.Element private object XmlTagHelper { - val BLACKLIST = "blacklist" + val BLACKLISTS = "blacklists" + val LANGUAGE_LIST = "blacklist" val LANGUAGE = "language" val ADDED = "added" val REMOVED = "removed" @@ -20,33 +21,42 @@ private object XmlTagHelper { @State(name = "ParameterNameHintsSettings", storages = arrayOf(Storage("parameter.hints.xml"))) class ParameterNameHintsSettings : PersistentStateComponent { - private var myState: Element = Element("settings") - - override fun getState(): Element = myState + private val myRemovedPatterns = hashMapOf>() + private val myAddedPatterns = hashMapOf>() + + override fun getState(): Element { + val root = Element("settings") + val blacklists = root.getOrCreateChild(XmlTagHelper.BLACKLISTS) + + myRemovedPatterns.forEach { language, patterns -> + blacklists.addLanguagePatternElements(language, patterns, XmlTagHelper.REMOVED) + } + + myAddedPatterns.forEach { language, patterns -> + blacklists.addLanguagePatternElements(language, patterns, XmlTagHelper.ADDED) + } + + return root + } override fun loadState(state: Element) { - myState = state - } - - private fun Language.toXmlName() = displayName.split(' ')[0] - - private fun getStoredLanguageBlackList(language: Language): Element { - val allLists = myState.getOrCreateChild(XmlTagHelper.BLACKLIST) - val languageTagName = language.toXmlName() - return allLists.getOrCreateChild(languageTagName) + val allBlackLists = state.getChild(XmlTagHelper.BLACKLISTS)?.getChildren(XmlTagHelper.LANGUAGE_LIST) ?: emptyList() + allBlackLists.mapNotNull { + val language = it.attributeValue(XmlTagHelper.LANGUAGE) ?: return@mapNotNull + myAddedPatterns[language] = it.extractPatterns(XmlTagHelper.ADDED) + myRemovedPatterns[language] = it.extractPatterns(XmlTagHelper.REMOVED) + } } fun addIgnorePattern(language: Language, pattern: String) { - val langBlackList = getStoredLanguageBlackList(language) - val addedPattern = pattern.toPatternElement(XmlTagHelper.ADDED) - langBlackList.addContent(addedPattern) + val patternsBefore = getAddedPatterns(language) + setAddedPatterns(language, patternsBefore + pattern) } fun getIgnorePatternSet(hintsProvider: InlayParameterHintsProvider): Set { - val forLanguage = getStoredLanguageBlackList(hintsProvider.language).children - val added = forLanguage.filter { it.name == XmlTagHelper.ADDED }.mapNotNull { it.getAttribute(XmlTagHelper.PATTERN)?.value } - val removed = forLanguage.filter { it.name == XmlTagHelper.REMOVED }.mapNotNull { it.getAttribute(XmlTagHelper.PATTERN)?.value } - + val added = getAddedPatterns(hintsProvider.language) + val removed = getRemovedPatterns(hintsProvider.language) + val updated = hintsProvider.defaultBlackList.toMutableSet() updated.removeAll(removed) updated.addAll(added) @@ -63,26 +73,51 @@ class ParameterNameHintsSettings : PersistentStateComponent { val added = updatedBlackList.toMutableSet() added.removeAll(defaultBlackList) - updateState(provider.language, added, removed) + val language = provider.language + setRemovedPatterns(language, removed) + setAddedPatterns(language, added) } - - private fun updateState(language: Language, added: MutableSet, removed: MutableSet) { - val languageBlackList = getStoredLanguageBlackList(language) - - removed.map { it.toPatternElement(XmlTagHelper.REMOVED) } - .forEach { languageBlackList.addContent(it) } - - added.map { it.toPatternElement(XmlTagHelper.ADDED) } - .forEach { languageBlackList.addContent(it) } - } - + companion object { @JvmStatic fun getInstance() = service() } + private fun getAddedPatterns(language: Language): List { + val key = language.displayName + return myAddedPatterns[key] ?: emptyList() + } + + private fun getRemovedPatterns(language: Language): List { + val key = language.displayName + return myRemovedPatterns[key] ?: emptyList() + } + + private fun setRemovedPatterns(language: Language, removed: Collection) { + val key = language.displayName + myRemovedPatterns[key] = removed.toList() + } + + private fun setAddedPatterns(language: Language, added: Collection) { + val key = language.displayName + myAddedPatterns[key] = added.toList() + } + } +private fun Element.addLanguagePatternElements(language: String, patterns: List, 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.attributeValue(attr: String): String? = this.getAttribute(attr)?.value + private fun Element.getOrCreateChild(name: String): Element { var child = getChild(name) if (child == null) {