Web Symbols: refactor DisablementRules and EnablementRules to interfaces and introduce builders.

GitOrigin-RevId: bc2d0b920960dbd8082644a03f7faf7f2dd39b41
This commit is contained in:
Piotr Tomiak
2024-05-14 10:14:13 +00:00
committed by intellij-monorepo-bot
parent 419a9628ee
commit cd58b46aef
4 changed files with 223 additions and 46 deletions
+36 -28
View File
@@ -432,38 +432,46 @@
*:com.intellij.webSymbols.context.WebSymbolsContextKindRules
- *sf:Companion:com.intellij.webSymbols.context.WebSymbolsContextKindRules$Companion
- s:create(java.util.Map,java.util.Map):com.intellij.webSymbols.context.WebSymbolsContextKindRules
- s:create(kotlin.jvm.functions.Function1):com.intellij.webSymbols.context.WebSymbolsContextKindRules
- s:createDisablementRules(kotlin.jvm.functions.Function1):com.intellij.webSymbols.context.WebSymbolsContextKindRules$DisablementRules
- s:createEnablementRules(kotlin.jvm.functions.Function1):com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRules
- s:disablementRulesBuilder():com.intellij.webSymbols.context.WebSymbolsContextKindRules$DisablementRulesBuilder
- s:enablementRulesBuilder():com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRulesBuilder
- a:getDisable():java.util.Map
- a:getEnable():java.util.Map
*:com.intellij.webSymbols.context.WebSymbolsContextKindRules$Builder
- a:contextName(java.lang.String,kotlin.jvm.functions.Function1):V
*f:com.intellij.webSymbols.context.WebSymbolsContextKindRules$Companion
- f:create(java.util.Map,java.util.Map):com.intellij.webSymbols.context.WebSymbolsContextKindRules
*f:com.intellij.webSymbols.context.WebSymbolsContextKindRules$DisablementRules
- <init>(java.util.List,java.util.List):V
- f:component1():java.util.List
- f:component2():java.util.List
- f:copy(java.util.List,java.util.List):com.intellij.webSymbols.context.WebSymbolsContextKindRules$DisablementRules
- bs:copy$default(com.intellij.webSymbols.context.WebSymbolsContextKindRules$DisablementRules,java.util.List,java.util.List,I,java.lang.Object):com.intellij.webSymbols.context.WebSymbolsContextKindRules$DisablementRules
- equals(java.lang.Object):Z
- f:getFileExtensions():java.util.List
- f:getFileNamePatterns():java.util.List
- hashCode():I
- toString():java.lang.String
*f:com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRules
- <init>(java.util.Map,java.util.List,java.util.List,java.util.List,java.util.List):V
- f:component1():java.util.Map
- f:component2():java.util.List
- f:component3():java.util.List
- f:component4():java.util.List
- f:component5():java.util.List
- f:copy(java.util.Map,java.util.List,java.util.List,java.util.List,java.util.List):com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRules
- bs:copy$default(com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRules,java.util.Map,java.util.List,java.util.List,java.util.List,java.util.List,I,java.lang.Object):com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRules
- equals(java.lang.Object):Z
- f:getFileExtensions():java.util.List
- f:getFileNamePatterns():java.util.List
- f:getIdeLibraries():java.util.List
- f:getPkgManagerDependencies():java.util.Map
- f:getProjectToolExecutables():java.util.List
- hashCode():I
- toString():java.lang.String
- f:create(kotlin.jvm.functions.Function1):com.intellij.webSymbols.context.WebSymbolsContextKindRules
- f:createDisablementRules(kotlin.jvm.functions.Function1):com.intellij.webSymbols.context.WebSymbolsContextKindRules$DisablementRules
- f:createEnablementRules(kotlin.jvm.functions.Function1):com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRules
- f:disablementRulesBuilder():com.intellij.webSymbols.context.WebSymbolsContextKindRules$DisablementRulesBuilder
- f:enablementRulesBuilder():com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRulesBuilder
*:com.intellij.webSymbols.context.WebSymbolsContextKindRules$ContextKindBuilder
- a:disableWhen(kotlin.jvm.functions.Function1):V
- a:enabledWhen(kotlin.jvm.functions.Function1):V
*:com.intellij.webSymbols.context.WebSymbolsContextKindRules$DisablementRules
- a:getFileExtensions():java.util.List
- a:getFileNamePatterns():java.util.List
*:com.intellij.webSymbols.context.WebSymbolsContextKindRules$DisablementRulesBuilder
- a:build():com.intellij.webSymbols.context.WebSymbolsContextKindRules$DisablementRules
- a:fileExtensions(java.util.List):com.intellij.webSymbols.context.WebSymbolsContextKindRules$DisablementRulesBuilder
- a:fileNamePatterns(java.util.List):com.intellij.webSymbols.context.WebSymbolsContextKindRules$DisablementRulesBuilder
*:com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRules
- a:getFileExtensions():java.util.List
- a:getFileNamePatterns():java.util.List
- a:getIdeLibraries():java.util.List
- a:getPkgManagerDependencies():java.util.Map
- a:getProjectToolExecutables():java.util.List
*:com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRulesBuilder
- a:build():com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRules
- a:fileExtensions(java.util.List):com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRulesBuilder
- a:fileNamePatterns(java.util.List):com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRulesBuilder
- a:ideLibraries(java.util.List):com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRulesBuilder
- a:pkgManagerDependencies(java.lang.String,java.util.List):com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRulesBuilder
- a:pkgManagerDependencies(java.util.Map):com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRulesBuilder
- a:projectToolExecutables(java.util.List):com.intellij.webSymbols.context.WebSymbolsContextKindRules$EnablementRulesBuilder
*:com.intellij.webSymbols.context.WebSymbolsContextProvider
- isEnabled(com.intellij.openapi.project.Project,com.intellij.openapi.vfs.VirtualFile):com.intellij.psi.util.CachedValueProvider$Result
- isEnabled(com.intellij.openapi.vfs.VirtualFile,com.intellij.openapi.project.Project):Z
@@ -2,21 +2,58 @@
package com.intellij.webSymbols.context
import com.intellij.webSymbols.ContextName
import com.intellij.webSymbols.context.impl.WebSymbolsContextKindRulesBuilderImpl
import com.intellij.webSymbols.context.impl.WebSymbolsContextKindRulesImpl
import org.jetbrains.annotations.ApiStatus
interface WebSymbolsContextKindRules {
val enable: Map<ContextName, List<EnablementRules>>
val disable: Map<ContextName, List<DisablementRules>>
data class DisablementRules(val fileExtensions: List<String>,
val fileNamePatterns: List<Regex>)
@ApiStatus.NonExtendable
interface DisablementRules {
val fileExtensions: List<String>
val fileNamePatterns: List<Regex>
}
data class EnablementRules(val pkgManagerDependencies: Map<String, List<String>>,
val projectToolExecutables: List<String>,
val fileExtensions: List<String>,
val ideLibraries: List<String>,
val fileNamePatterns: List<Regex>)
@ApiStatus.NonExtendable
interface EnablementRules {
val pkgManagerDependencies: Map<String, List<String>>
val projectToolExecutables: List<String>
val fileExtensions: List<String>
val ideLibraries: List<String>
val fileNamePatterns: List<Regex>
}
@ApiStatus.NonExtendable
interface Builder {
fun contextName(name: ContextName, builder: ContextKindBuilder.() -> Unit)
}
@ApiStatus.NonExtendable
interface ContextKindBuilder {
fun enabledWhen(builder: EnablementRulesBuilder.() -> Unit)
fun disableWhen(builder: DisablementRulesBuilder.() -> Unit)
}
@ApiStatus.NonExtendable
interface DisablementRulesBuilder {
fun fileExtensions(fileExtensions: List<String>): DisablementRulesBuilder
fun fileNamePatterns(filenamePatterns: List<Regex>): DisablementRulesBuilder
fun build(): DisablementRules
}
@ApiStatus.NonExtendable
interface EnablementRulesBuilder {
fun fileExtensions(fileExtensions: List<String>): EnablementRulesBuilder
fun fileNamePatterns(filenamePatterns: List<Regex>): EnablementRulesBuilder
fun ideLibraries(ideLibraries: List<String>): EnablementRulesBuilder
fun projectToolExecutables(projectToolExecutables: List<String>): EnablementRulesBuilder
fun pkgManagerDependencies(packageManager: String, dependencies: List<String>): EnablementRulesBuilder
fun pkgManagerDependencies(dependencies: Map<String, List<String>>): EnablementRulesBuilder
fun build(): EnablementRules
}
companion object {
@@ -25,6 +62,26 @@ interface WebSymbolsContextKindRules {
disable: Map<ContextName, List<DisablementRules>>): WebSymbolsContextKindRules =
WebSymbolsContextKindRulesImpl(enable, disable)
@JvmStatic
fun create(builder: Builder.() -> Unit): WebSymbolsContextKindRules =
WebSymbolsContextKindRulesBuilderImpl().apply(builder).build()
@JvmStatic
fun createEnablementRules(builder: EnablementRulesBuilder.() -> Unit): EnablementRules =
WebSymbolsContextKindRulesBuilderImpl.EnablementRulesBuilderImpl().apply(builder).build()
@JvmStatic
fun createDisablementRules(builder: DisablementRulesBuilder.() -> Unit): DisablementRules =
WebSymbolsContextKindRulesBuilderImpl.DisablementRulesBuilderImpl().apply(builder).build()
@JvmStatic
fun enablementRulesBuilder(): EnablementRulesBuilder =
WebSymbolsContextKindRulesBuilderImpl.EnablementRulesBuilderImpl()
@JvmStatic
fun disablementRulesBuilder(): DisablementRulesBuilder =
WebSymbolsContextKindRulesBuilderImpl.DisablementRulesBuilderImpl()
}
}
@@ -0,0 +1,110 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.webSymbols.context.impl
import com.intellij.util.SmartList
import com.intellij.webSymbols.ContextName
import com.intellij.webSymbols.context.WebSymbolsContextKindRules
import java.util.Collections.unmodifiableList
class WebSymbolsContextKindRulesBuilderImpl : WebSymbolsContextKindRules.Builder {
private val contextNames = mutableMapOf<ContextName, ContextKindBuilderImpl>()
override fun contextName(name: ContextName, builder: WebSymbolsContextKindRules.ContextKindBuilder.() -> Unit) {
contextNames.computeIfAbsent(name) { ContextKindBuilderImpl() }.apply(builder)
}
fun build(): WebSymbolsContextKindRules =
WebSymbolsContextKindRulesImpl(
contextNames.mapValues { listOf(it.value.enableWhen.build()) },
contextNames.mapValues { listOf(it.value.disableWhen.build()) },
)
private class ContextKindBuilderImpl : WebSymbolsContextKindRules.ContextKindBuilder {
val enableWhen = EnablementRulesBuilderImpl()
val disableWhen = DisablementRulesBuilderImpl()
override fun enabledWhen(builder: WebSymbolsContextKindRules.EnablementRulesBuilder.() -> Unit) {
enableWhen.apply(builder)
}
override fun disableWhen(builder: WebSymbolsContextKindRules.DisablementRulesBuilder.() -> Unit) {
disableWhen.apply(builder)
}
}
class EnablementRulesBuilderImpl : WebSymbolsContextKindRules.EnablementRulesBuilder {
private val fileExtensions = SmartList<String>()
private val fileNamePatterns = SmartList<Regex>()
private val ideLibraries = SmartList<String>()
private val projectToolExecutables = SmartList<String>()
private val pkgManagerDependencies = HashMap<String, MutableList<String>>()
override fun fileExtensions(fileExtensions: List<String>): WebSymbolsContextKindRules.EnablementRulesBuilder = apply {
this.fileExtensions.addAll(fileExtensions)
}
override fun fileNamePatterns(filenamePatterns: List<Regex>): WebSymbolsContextKindRules.EnablementRulesBuilder = apply {
this.fileNamePatterns.addAll(filenamePatterns)
}
override fun ideLibraries(ideLibraries: List<String>): WebSymbolsContextKindRules.EnablementRulesBuilder = apply {
this.ideLibraries.addAll(ideLibraries)
}
override fun projectToolExecutables(projectToolExecutables: List<String>): WebSymbolsContextKindRules.EnablementRulesBuilder = apply {
this.projectToolExecutables.addAll(projectToolExecutables)
}
override fun pkgManagerDependencies(packageManager: String, dependencies: List<String>): WebSymbolsContextKindRules.EnablementRulesBuilder = apply {
pkgManagerDependencies.computeIfAbsent(packageManager) { SmartList() }.addAll(dependencies)
}
override fun pkgManagerDependencies(dependencies: Map<String, List<String>>): WebSymbolsContextKindRules.EnablementRulesBuilder = apply {
dependencies.forEach {
pkgManagerDependencies(it.key, it.value)
}
}
override fun build(): WebSymbolsContextKindRules.EnablementRules = EnablementRulesData(
pkgManagerDependencies = pkgManagerDependencies.mapValues { unmodifiableList(it.value) },
projectToolExecutables = unmodifiableList(projectToolExecutables),
fileExtensions = unmodifiableList(fileExtensions),
ideLibraries = unmodifiableList(ideLibraries),
fileNamePatterns = unmodifiableList(fileNamePatterns),
)
}
class DisablementRulesBuilderImpl : WebSymbolsContextKindRules.DisablementRulesBuilder {
private val fileExtensions = SmartList<String>()
private val fileNamePatterns = SmartList<Regex>()
override fun fileExtensions(fileExtensions: List<String>): WebSymbolsContextKindRules.DisablementRulesBuilder = apply {
this.fileExtensions.addAll(fileExtensions)
}
override fun fileNamePatterns(filenamePatterns: List<Regex>): WebSymbolsContextKindRules.DisablementRulesBuilder = apply {
this.fileNamePatterns.addAll(filenamePatterns)
}
override fun build(): WebSymbolsContextKindRules.DisablementRules = DisablementRulesData(
fileExtensions = unmodifiableList(fileExtensions),
fileNamePatterns = unmodifiableList(fileNamePatterns),
)
}
}
private data class EnablementRulesData(
override val pkgManagerDependencies: Map<String, List<String>>,
override val projectToolExecutables: List<String>,
override val fileExtensions: List<String>,
override val ideLibraries: List<String>,
override val fileNamePatterns: List<Regex>
) : WebSymbolsContextKindRules.EnablementRules
private data class DisablementRulesData(
override val fileExtensions: List<String>,
override val fileNamePatterns: List<Regex>
) : WebSymbolsContextKindRules.DisablementRules
@@ -280,19 +280,21 @@ internal fun Reference.codeCompletion(name: String,
}
internal fun EnablementRules.wrap(): WebSymbolsContextKindRules.EnablementRules =
WebSymbolsContextKindRules.EnablementRules(
mapOf(PKG_MANAGER_NODE_PACKAGES to nodePackages, PKG_MANAGER_RUBY_GEMS to rubyGems) + additionalProperties,
projectToolExecutables,
fileExtensions,
ideLibraries,
fileNamePatterns.mapNotNull { it.toRegex() }
)
WebSymbolsContextKindRules.createEnablementRules {
pkgManagerDependencies(PKG_MANAGER_NODE_PACKAGES, nodePackages)
pkgManagerDependencies(PKG_MANAGER_RUBY_GEMS, rubyGems)
pkgManagerDependencies(additionalProperties)
projectToolExecutables(projectToolExecutables)
fileExtensions(fileExtensions)
ideLibraries(ideLibraries)
fileNamePatterns(fileNamePatterns.mapNotNull { it.toRegex() })
}
internal fun DisablementRules.wrap(): WebSymbolsContextKindRules.DisablementRules =
WebSymbolsContextKindRules.DisablementRules(
fileExtensions,
fileNamePatterns.mapNotNull { it.toRegex() },
)
WebSymbolsContextKindRules.createDisablementRules {
fileExtensions(fileExtensions)
fileNamePatterns(fileNamePatterns.mapNotNull { it.toRegex() })
}
internal fun BaseContribution.Priority.wrap() =
WebSymbol.Priority.values()[ordinal]