From cd58b46aefd15dfb68117b851de9bc998f09a14d Mon Sep 17 00:00:00 2001 From: Piotr Tomiak Date: Mon, 13 May 2024 16:48:34 +0200 Subject: [PATCH] Web Symbols: refactor DisablementRules and EnablementRules to interfaces and introduce builders. GitOrigin-RevId: bc2d0b920960dbd8082644a03f7faf7f2dd39b41 --- platform/webSymbols/api-dump-unreviewed.txt | 64 +++++----- .../context/WebSymbolsContextKindRules.kt | 71 +++++++++-- .../WebSymbolsContextKindRulesBuilderImpl.kt | 110 ++++++++++++++++++ .../webTypes/json/WebTypesJsonUtils.kt | 24 ++-- 4 files changed, 223 insertions(+), 46 deletions(-) create mode 100644 platform/webSymbols/src/com/intellij/webSymbols/context/impl/WebSymbolsContextKindRulesBuilderImpl.kt diff --git a/platform/webSymbols/api-dump-unreviewed.txt b/platform/webSymbols/api-dump-unreviewed.txt index e1a7b92b0aae..976fa006f0da 100644 --- a/platform/webSymbols/api-dump-unreviewed.txt +++ b/platform/webSymbols/api-dump-unreviewed.txt @@ -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 -- (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 -- (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 diff --git a/platform/webSymbols/src/com/intellij/webSymbols/context/WebSymbolsContextKindRules.kt b/platform/webSymbols/src/com/intellij/webSymbols/context/WebSymbolsContextKindRules.kt index a3d7fb829c9b..bb0d6555f304 100644 --- a/platform/webSymbols/src/com/intellij/webSymbols/context/WebSymbolsContextKindRules.kt +++ b/platform/webSymbols/src/com/intellij/webSymbols/context/WebSymbolsContextKindRules.kt @@ -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> val disable: Map> - data class DisablementRules(val fileExtensions: List, - val fileNamePatterns: List) + @ApiStatus.NonExtendable + interface DisablementRules { + val fileExtensions: List + val fileNamePatterns: List + } - data class EnablementRules(val pkgManagerDependencies: Map>, - val projectToolExecutables: List, - val fileExtensions: List, - val ideLibraries: List, - val fileNamePatterns: List) + @ApiStatus.NonExtendable + interface EnablementRules { + val pkgManagerDependencies: Map> + val projectToolExecutables: List + val fileExtensions: List + val ideLibraries: List + val fileNamePatterns: List + } + + @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): DisablementRulesBuilder + fun fileNamePatterns(filenamePatterns: List): DisablementRulesBuilder + fun build(): DisablementRules + } + + @ApiStatus.NonExtendable + interface EnablementRulesBuilder { + fun fileExtensions(fileExtensions: List): EnablementRulesBuilder + fun fileNamePatterns(filenamePatterns: List): EnablementRulesBuilder + fun ideLibraries(ideLibraries: List): EnablementRulesBuilder + fun projectToolExecutables(projectToolExecutables: List): EnablementRulesBuilder + fun pkgManagerDependencies(packageManager: String, dependencies: List): EnablementRulesBuilder + fun pkgManagerDependencies(dependencies: Map>): EnablementRulesBuilder + fun build(): EnablementRules + } companion object { @@ -25,6 +62,26 @@ interface WebSymbolsContextKindRules { disable: Map>): 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() } } diff --git a/platform/webSymbols/src/com/intellij/webSymbols/context/impl/WebSymbolsContextKindRulesBuilderImpl.kt b/platform/webSymbols/src/com/intellij/webSymbols/context/impl/WebSymbolsContextKindRulesBuilderImpl.kt new file mode 100644 index 000000000000..5aa6e30b2d49 --- /dev/null +++ b/platform/webSymbols/src/com/intellij/webSymbols/context/impl/WebSymbolsContextKindRulesBuilderImpl.kt @@ -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() + + 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() + private val fileNamePatterns = SmartList() + private val ideLibraries = SmartList() + private val projectToolExecutables = SmartList() + private val pkgManagerDependencies = HashMap>() + + override fun fileExtensions(fileExtensions: List): WebSymbolsContextKindRules.EnablementRulesBuilder = apply { + this.fileExtensions.addAll(fileExtensions) + } + + override fun fileNamePatterns(filenamePatterns: List): WebSymbolsContextKindRules.EnablementRulesBuilder = apply { + this.fileNamePatterns.addAll(filenamePatterns) + } + + override fun ideLibraries(ideLibraries: List): WebSymbolsContextKindRules.EnablementRulesBuilder = apply { + this.ideLibraries.addAll(ideLibraries) + } + + override fun projectToolExecutables(projectToolExecutables: List): WebSymbolsContextKindRules.EnablementRulesBuilder = apply { + this.projectToolExecutables.addAll(projectToolExecutables) + } + + override fun pkgManagerDependencies(packageManager: String, dependencies: List): WebSymbolsContextKindRules.EnablementRulesBuilder = apply { + pkgManagerDependencies.computeIfAbsent(packageManager) { SmartList() }.addAll(dependencies) + } + + override fun pkgManagerDependencies(dependencies: Map>): 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() + private val fileNamePatterns = SmartList() + + override fun fileExtensions(fileExtensions: List): WebSymbolsContextKindRules.DisablementRulesBuilder = apply { + this.fileExtensions.addAll(fileExtensions) + } + + override fun fileNamePatterns(filenamePatterns: List): 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>, + override val projectToolExecutables: List, + override val fileExtensions: List, + override val ideLibraries: List, + override val fileNamePatterns: List +) : WebSymbolsContextKindRules.EnablementRules + +private data class DisablementRulesData( + override val fileExtensions: List, + override val fileNamePatterns: List +) : WebSymbolsContextKindRules.DisablementRules diff --git a/platform/webSymbols/src/com/intellij/webSymbols/webTypes/json/WebTypesJsonUtils.kt b/platform/webSymbols/src/com/intellij/webSymbols/webTypes/json/WebTypesJsonUtils.kt index 29ab5394a7ab..9747f95a7cbf 100644 --- a/platform/webSymbols/src/com/intellij/webSymbols/webTypes/json/WebTypesJsonUtils.kt +++ b/platform/webSymbols/src/com/intellij/webSymbols/webTypes/json/WebTypesJsonUtils.kt @@ -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]