Revert "[workspace model] IDEA-372530: add WorkspaceFileIndexContributor.registerFileSetByCondition"

This reverts commit fc83a24b78e726c551d4ae29fac9dafa02226826.

GitOrigin-RevId: d123ca00f3cc8cc771550fcc5988cf97a2ea35eb
This commit is contained in:
Lev Leontev
2025-06-02 21:03:21 +02:00
committed by intellij-monorepo-bot
parent d5a0831d7c
commit a7f20db1b2
9 changed files with 28 additions and 197 deletions

View File

@@ -523,11 +523,6 @@ private class MyWorkspaceFileSetRegistrar<E : WorkspaceEntity>(contributor: Work
@Suppress("UNCHECKED_CAST")
rootData.registerFileSet(file, kind, entity as E, customData, false)
}
override fun registerFileSetByCondition(root: VirtualFileUrl, kind: WorkspaceFileKind, entity: WorkspaceEntity, customData: WorkspaceFileSetData?, condition: (VirtualFile) -> Boolean) {
@Suppress("UNCHECKED_CAST")
rootData.registerFileSet(root, kind, entity as E, customData, true)
}
}

View File

@@ -1,74 +0,0 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.workspaceModel.core.fileIndex
import com.intellij.openapi.Disposable
import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.ModuleRootModificationUtil
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.platform.workspace.jps.entities.ExcludeUrlEntity
import com.intellij.platform.workspace.storage.EntityStorage
import com.intellij.testFramework.PsiTestUtil
import com.intellij.testFramework.junit5.RunInEdt
import com.intellij.testFramework.junit5.TestApplication
import com.intellij.testFramework.junit5.TestDisposable
import com.intellij.testFramework.rules.ProjectModelExtension
import com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexImpl
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.RegisterExtension
@TestApplication
@RunInEdt(writeIntent = true)
class RegisterFileSetByConditionTest {
@JvmField
@RegisterExtension
val projectModel: ProjectModelExtension = ProjectModelExtension()
private val fileIndex
get() = WorkspaceFileIndex.getInstance(projectModel.project)
private lateinit var module: Module
private lateinit var excludedRoot: VirtualFile
@BeforeEach
fun setUp() {
module = projectModel.createModule()
excludedRoot = projectModel.baseProjectDir.newVirtualDirectory("root/exc")
ModuleRootModificationUtil.addContentRoot(module, excludedRoot.parent)
PsiTestUtil.addExcludedRoot(module, excludedRoot)
}
@Test
fun `register file set by condition`(@TestDisposable testDisposable: Disposable) {
val file = projectModel.baseProjectDir.newVirtualFile("root/a.txt")
val fileTxt = projectModel.baseProjectDir.newVirtualFile("root/exc/root/b.txt")
val fileJava = projectModel.baseProjectDir.newVirtualFile("root/exc/root/b.java")
val fileExe = projectModel.baseProjectDir.newVirtualFile("root/exc/root/b.exe")
val excludedRoot = fileTxt.parent
assertTrue(fileIndex.isInContent(file))
assertFalse(fileIndex.isInContent(excludedRoot))
assertFalse(fileIndex.isInContent(fileTxt))
assertFalse(fileIndex.isInContent(fileJava))
assertFalse(fileIndex.isInContent(fileExe))
WorkspaceFileIndexImpl.EP_NAME.point.registerExtension(FileByConditionContributor(), testDisposable)
assertTrue(fileIndex.isInContent(file))
assertFalse(fileIndex.isInContent(excludedRoot))
assertTrue(fileIndex.isInContent(fileTxt))
assertTrue(fileIndex.isInContent(fileJava))
assertFalse(fileIndex.isInContent(fileExe))
}
private class FileByConditionContributor : WorkspaceFileIndexContributor<ExcludeUrlEntity> {
override val entityClass: Class<ExcludeUrlEntity>
get() = ExcludeUrlEntity::class.java
override fun registerFileSets(entity: ExcludeUrlEntity, registrar: WorkspaceFileSetRegistrar, storage: EntityStorage) {
registrar.registerFileSetByCondition(entity.url.append("root"), WorkspaceFileKind.CONTENT, entity, null) { file ->
file.extension == "txt" || file.extension == "java"
}
}
}
}

View File

@@ -69,7 +69,6 @@
- a:registerExclusionPatterns(com.intellij.platform.workspace.storage.url.VirtualFileUrl,java.util.List,com.intellij.platform.workspace.storage.WorkspaceEntity):V
- a:registerFileSet(com.intellij.openapi.vfs.VirtualFile,com.intellij.workspaceModel.core.fileIndex.WorkspaceFileKind,com.intellij.platform.workspace.storage.WorkspaceEntity,com.intellij.workspaceModel.core.fileIndex.WorkspaceFileSetData):V
- a:registerFileSet(com.intellij.platform.workspace.storage.url.VirtualFileUrl,com.intellij.workspaceModel.core.fileIndex.WorkspaceFileKind,com.intellij.platform.workspace.storage.WorkspaceEntity,com.intellij.workspaceModel.core.fileIndex.WorkspaceFileSetData):V
- a:registerFileSetByCondition(com.intellij.platform.workspace.storage.url.VirtualFileUrl,com.intellij.workspaceModel.core.fileIndex.WorkspaceFileKind,com.intellij.platform.workspace.storage.WorkspaceEntity,com.intellij.workspaceModel.core.fileIndex.WorkspaceFileSetData,kotlin.jvm.functions.Function1):V
- a:registerNonRecursiveFileSet(com.intellij.platform.workspace.storage.url.VirtualFileUrl,com.intellij.workspaceModel.core.fileIndex.WorkspaceFileKind,com.intellij.platform.workspace.storage.WorkspaceEntity,com.intellij.workspaceModel.core.fileIndex.WorkspaceFileSetData):V
*:com.intellij.workspaceModel.core.fileIndex.WorkspaceFileSetWithCustomData
- com.intellij.workspaceModel.core.fileIndex.WorkspaceFileSet

View File

@@ -219,18 +219,4 @@ interface WorkspaceFileSetRegistrar {
entity: WorkspaceEntity,
customData: WorkspaceFileSetData?,
)
/**
* Includes [root] and all files under it which satisfy [condition].
* @param kind specify kind which will be assigned to the files
* @param entity first parameter of [WorkspaceFileIndexContributor.registerFileSets] must be passed here
* @param customData optional custom data which will be associated with the root and can be accessed via [WorkspaceFileSetWithCustomData].
*/
fun registerFileSetByCondition(
root: VirtualFileUrl,
kind: WorkspaceFileKind,
entity: WorkspaceEntity,
customData: WorkspaceFileSetData?,
condition: (VirtualFile) -> Boolean,
)
}

View File

@@ -73,7 +73,7 @@ internal class NonIncrementalContributors(private val project: Project) {
newFileSets.forEach { (root, sets) ->
sets.forEach { set ->
fileSets.putValue(root, set)
val fileSet = set as? StoredWorkspaceFileSet
val fileSet = set as? WorkspaceFileSetImpl
if (fileSet != null && fileSet.data is JvmPackageRootDataInternal) {
fileSetsByPackagePrefix.addFileSet("", fileSet)
}
@@ -187,7 +187,7 @@ internal class NonIncrementalContributors(private val project: Project) {
companion object {
internal fun isFromAdditionalLibraryRootsProvider(fileSet: WorkspaceFileSet): Boolean {
return fileSet.asSafely<StoredWorkspaceFileSet>()?.entityPointer is NonIncrementalMarker
return fileSet.asSafely<WorkspaceFileSetImpl>()?.entityPointer is NonIncrementalMarker
}
fun isPlaceholderReference(entityPointer: EntityPointer<WorkspaceEntity>): Boolean {

View File

@@ -139,12 +139,12 @@ internal class WorkspaceFileIndexDataImpl(
if (storedKindMask == StoredFileSetKindMask.ACCEPTED_FILE_SET) {
return@addMeasuredTime storedFileSets as WorkspaceFileInternalInfo
}
val acceptedFileSets = ArrayList<StoredWorkspaceFileSet>()
val acceptedFileSets = ArrayList<WorkspaceFileSetImpl>()
//copy a mutable variable used from lambda to a 'val' to ensure that kotlinc won't wrap it into IntRef
val currentKindMask = acceptedKindsMask
//this should be a rare case, so it's ok to use less optimal code here and check 'isUnloaded' again
storedFileSets.forEach { fileSet ->
if (fileSet is StoredWorkspaceFileSet && fileSet.accepts(currentKindMask, project, file)) {
if (fileSet is WorkspaceFileSetImpl && fileSet.accepts(currentKindMask, project, file)) {
acceptedFileSets.add(fileSet)
}
}
@@ -184,7 +184,7 @@ internal class WorkspaceFileIndexDataImpl(
//forEach call below isn't inlined, so the lambda is stored in a variable to prevent creation of many identical instances (IJPL-14542)
val action = { storedFileSet: StoredFileSet ->
when (storedFileSet) {
is StoredWorkspaceFileSet -> {
is WorkspaceFileSetImpl -> {
visitor.visitIncludedRoot(storedFileSet, storedFileSet.entityPointer)
}
is ExcludedFileSet -> Unit
@@ -437,20 +437,16 @@ internal class WorkspaceFileIndexDataImpl(
kind: WorkspaceFileKind,
entity: WorkspaceEntity,
customData: WorkspaceFileSetData?) {
registerFileSet(root, kind, entity, customData, recursive = true, condition = null)
registerFileSet(root, kind, entity, customData, recursive = true)
}
private fun registerFileSet(
root: VirtualFileUrl,
kind: WorkspaceFileKind,
entity: WorkspaceEntity,
customData: WorkspaceFileSetData?,
root: VirtualFileUrl, kind: WorkspaceFileKind, entity: WorkspaceEntity, customData: WorkspaceFileSetData?,
recursive: Boolean,
condition: ((VirtualFile) -> Boolean)?,
) {
val rootFile = root.virtualFile
if (rootFile != null) {
registerFileSet(rootFile, kind, entity, customData, recursive, condition)
registerFileSet(rootFile, kind, entity, customData, recursive)
}
else {
nonExistingFilesRegistry.registerUrl(root, entity, storageKind,
@@ -459,25 +455,15 @@ internal class WorkspaceFileIndexDataImpl(
}
override fun registerFileSet(root: VirtualFile, kind: WorkspaceFileKind, entity: WorkspaceEntity, customData: WorkspaceFileSetData?) {
registerFileSet(root, kind, entity, customData, recursive = true, condition = null)
registerFileSet(root, kind, entity, customData, recursive = true)
}
private fun registerFileSet(
root: VirtualFile,
kind: WorkspaceFileKind,
entity: WorkspaceEntity,
customData: WorkspaceFileSetData?,
root: VirtualFile, kind: WorkspaceFileKind, entity: WorkspaceEntity, customData: WorkspaceFileSetData?,
recursive: Boolean,
condition: ((VirtualFile) -> Boolean)?,
) {
val fileSet = if (condition == null) {
WorkspaceFileSetImpl(root, kind, entity.createPointer(), storageKind, customData ?: DummyWorkspaceFileSetData,
recursive)
}
else {
WorkspaceFileSetByCondition(root, kind, entity.createPointer(), storageKind, customData ?: DummyWorkspaceFileSetData,
condition)
}
val fileSet = WorkspaceFileSetImpl(root, kind, entity.createPointer(), storageKind, customData ?: DummyWorkspaceFileSetData,
recursive)
fileSets.putValue(root, fileSet)
if (customData is JvmPackageRootDataInternal) {
fileSetsByPackagePrefix.addFileSet(customData.packagePrefix, fileSet)
@@ -488,11 +474,7 @@ internal class WorkspaceFileIndexDataImpl(
kind: WorkspaceFileKind,
entity: WorkspaceEntity,
customData: WorkspaceFileSetData?) {
registerFileSet(file, kind, entity, customData, recursive = false, condition = null)
}
override fun registerFileSetByCondition(root: VirtualFileUrl, kind: WorkspaceFileKind, entity: WorkspaceEntity, customData: WorkspaceFileSetData?, condition: (VirtualFile) -> Boolean) {
registerFileSet(root, kind, entity, customData, recursive = true, condition)
registerFileSet(file, kind, entity, customData, recursive = false)
}
override fun registerExcludedRoot(excludedRoot: VirtualFileUrl, entity: WorkspaceEntity) {
@@ -565,7 +547,7 @@ internal class WorkspaceFileIndexDataImpl(
kind: WorkspaceFileKind,
entity: WorkspaceEntity,
customData: WorkspaceFileSetData?) {
fileSets.removeValueIf(root) { it is StoredWorkspaceFileSet && isOriginatedFrom(it, entity) }
fileSets.removeValueIf(root) { it is WorkspaceFileSetImpl && isOriginatedFrom(it, entity) }
if (customData is JvmPackageRootDataInternal) {
fileSetsByPackagePrefix.removeByPrefixAndPointer(customData.packagePrefix, entity.createPointer())
}
@@ -578,10 +560,6 @@ internal class WorkspaceFileIndexDataImpl(
registerFileSet(file, kind, entity, customData)
}
override fun registerFileSetByCondition(root: VirtualFileUrl, kind: WorkspaceFileKind, entity: WorkspaceEntity, customData: WorkspaceFileSetData?, condition: (VirtualFile) -> Boolean) {
registerFileSet(root, kind, entity, customData)
}
private fun isOriginatedFrom(fileSet: StoredFileSet, entity: WorkspaceEntity): Boolean {
return fileSet.entityStorageKind == storageKind && fileSet.entityPointer.isPointerTo(entity)
}

View File

@@ -247,7 +247,7 @@ class WorkspaceFileIndexImpl(private val project: Project) : WorkspaceFileIndexE
includeCustomKindSets: Boolean,
): WorkspaceFileSet? {
return when (val info = getFileInfo(file, honorExclusion, includeContentSets, includeContentNonIndexableSets, includeExternalSets, includeExternalSourceSets, includeCustomKindSets)) {
is StoredWorkspaceFileSet -> info
is WorkspaceFileSetImpl -> info
is MultipleWorkspaceFileSets -> info.find(null)
else -> null
}
@@ -272,7 +272,7 @@ class WorkspaceFileIndexImpl(private val project: Project) : WorkspaceFileIndexE
includeCustomKindSets = includeCustomKindSets
)
return when (info) {
is StoredWorkspaceFileSet -> listOf(info)
is WorkspaceFileSetImpl -> listOf(info)
is MultipleWorkspaceFileSets -> info.fileSets
else -> emptyList()
}
@@ -352,7 +352,7 @@ class WorkspaceFileIndexImpl(private val project: Project) : WorkspaceFileIndexE
override fun findContainingEntities(file: VirtualFile, honorExclusion: Boolean, includeContentSets: Boolean, includeContentNonIndexableSets: Boolean, includeExternalSets: Boolean, includeExternalSourceSets: Boolean, includeCustomKindSets: Boolean): Collection<WorkspaceEntity> {
return when (val fileInfo = getFileInfo(file, honorExclusion, includeContentSets, includeContentNonIndexableSets, includeExternalSets, includeExternalSourceSets, includeCustomKindSets)) {
is StoredWorkspaceFileSet -> listOfNotNull(resolveEntity(fileInfo))
is WorkspaceFileSetImpl -> listOfNotNull(resolveEntity(fileInfo))
is MultipleWorkspaceFileSets -> fileInfo.fileSets.mapNotNull { fileSet ->
(fileSet as? StoredFileSet?)?.let { resolveEntity(it) }
}

View File

@@ -23,7 +23,7 @@ object WorkspaceFileSetRecognizer {
}
fun getEntityPointer(fileSet: WorkspaceFileSet): EntityPointer<*>? {
val entityReference = fileSet.asSafely<StoredWorkspaceFileSet>()?.entityPointer
val entityReference = fileSet.asSafely<WorkspaceFileSetImpl>()?.entityPointer
if (entityReference == null) return null
if (!Registry.`is`("ide.workspace.model.sdk.remove.custom.processing") && LibrariesAndSdkContributors.isPlaceholderReference(entityReference)) return null
if (NonIncrementalContributors.isPlaceholderReference(entityReference)) return null
@@ -31,7 +31,7 @@ object WorkspaceFileSetRecognizer {
}
fun getLibraryId(fileSet: WorkspaceFileSet, storage: EntityStorage): LibraryId? {
val fileSetImpl = fileSet as? StoredWorkspaceFileSet
val fileSetImpl = fileSet as? WorkspaceFileSetImpl
if (fileSetImpl == null) return null
val libraryRootFileSetData = fileSetImpl.data as? LibraryRootFileSetData
@@ -62,7 +62,7 @@ object WorkspaceFileSetRecognizer {
fun getSdkId(fileSet: WorkspaceFileSet): SdkId? {
return if (Registry.`is`("ide.workspace.model.sdk.remove.custom.processing")) {
fileSet.asSafely<StoredWorkspaceFileSet>()?.data?.asSafely<SdkRootFileSetData>()?.sdkId
fileSet.asSafely<WorkspaceFileSetImpl>()?.data?.asSafely<SdkRootFileSetData>()?.sdkId
}
else {
LibrariesAndSdkContributors.getSdk(fileSet)?.let { SdkId(it.name, it.sdkType.name) }
@@ -74,6 +74,6 @@ object WorkspaceFileSetRecognizer {
}
fun isSourceRoot(fileSet: WorkspaceFileSet): Boolean {
return (fileSet as? StoredWorkspaceFileSet)?.data is ModuleSourceRootData
return (fileSet as? WorkspaceFileSetImpl)?.data is ModuleSourceRootData
}
}

View File

@@ -91,13 +91,6 @@ internal sealed interface StoredFileSet : StoredFileSetCollection {
abstract override fun toString(): String
}
internal sealed interface StoredWorkspaceFileSet : StoredFileSet, WorkspaceFileSetWithCustomData<WorkspaceFileSetData>, WorkspaceFileInternalInfo {
fun isUnloaded(project: Project): Boolean
fun accepts(acceptedKindMask: Int, project: Project, file: VirtualFile?): Boolean {
return acceptedKindMask and kind.toMask() != 0 && !isUnloaded(project)
}
}
/**
* Represents an actual set of files registered in [WorkspaceFileIndexData].
*/
@@ -108,11 +101,11 @@ internal class WorkspaceFileSetImpl(
override val entityStorageKind: EntityStorageKind,
override val data: WorkspaceFileSetData,
override val recursive: Boolean = true,
) : StoredWorkspaceFileSet {
) : WorkspaceFileSetWithCustomData<WorkspaceFileSetData>, StoredFileSet, WorkspaceFileInternalInfo {
override val fileSets: List<WorkspaceFileSetWithCustomData<*>> get() = listOf(this)
override fun isUnloaded(project: Project): Boolean {
fun isUnloaded(project: Project): Boolean {
return (data as? UnloadableFileSetData)?.isUnloaded(project) == true
}
@@ -131,7 +124,7 @@ internal class WorkspaceFileSetImpl(
return currentMasks or update
}
override fun accepts(acceptedKindMask: Int, project: Project, file: VirtualFile?): Boolean {
fun accepts(acceptedKindMask: Int, project: Project, file: VirtualFile?): Boolean {
return acceptedKindMask and kind.toMask() != 0 && !isUnloaded(project) && (recursive || root == file)
}
@@ -211,52 +204,6 @@ private data class TwoWorkspaceFileSets(private val first: WorkspaceFileSetImpl,
}
}
internal class WorkspaceFileSetByCondition(
override val root: VirtualFile,
override val kind: WorkspaceFileKind,
override val entityPointer: EntityPointer<WorkspaceEntity>,
override val entityStorageKind: EntityStorageKind,
override val data: WorkspaceFileSetData,
private val condition: (VirtualFile) -> Boolean,
) : StoredWorkspaceFileSet {
override val recursive: Boolean
get() = true
override val fileSets: List<WorkspaceFileSetWithCustomData<*>> get() = listOf(this)
override fun isUnloaded(project: Project): Boolean {
return (data as? UnloadableFileSetData)?.isUnloaded(project) == true
}
override fun add(fileSet: StoredFileSet): StoredFileSetCollection {
return MultipleStoredWorkspaceFileSets(mutableListOf(fileSet, this))
}
override fun computeMasks(currentMasks: Int, project: Project, honorExclusion: Boolean, file: VirtualFile): Int {
val acceptedKindMask = (currentMasks shr ACCEPTED_KINDS_MASK_SHIFT) and WorkspaceFileKindMask.ALL
val update = if (acceptedKindMask and kind.toMask() != 0 && !isUnloaded(project) && condition(file)) {
StoredFileSetKindMask.ACCEPTED_FILE_SET
}
else {
StoredFileSetKindMask.IRRELEVANT_FILE_SET
}
return currentMasks or update
}
override fun findFileSet(condition: (WorkspaceFileSetWithCustomData<*>) -> Boolean): WorkspaceFileSetWithCustomData<*>? {
return this.takeIf(condition)
}
override fun findFileSets(condition: (WorkspaceFileSetWithCustomData<*>) -> Boolean): List<WorkspaceFileSetWithCustomData<*>> {
return listOfNotNull(findFileSet(condition))
}
override fun toString(): String {
return "WorkspaceFileSetByCondition{root=$root, kind=$kind}"
}
}
/**
* Represents a generic case with multiple elements in [StoredFileSetCollection].
*/
@@ -326,8 +273,8 @@ internal class MultipleStoredWorkspaceFileSets(private val storedFileSets: Mutab
}
}
internal class MultipleWorkspaceFileSetsImpl(override val fileSets: List<StoredWorkspaceFileSet>) : MultipleWorkspaceFileSets {
override fun find(acceptedCustomDataClass: Class<out WorkspaceFileSetData>?): StoredWorkspaceFileSet? {
internal class MultipleWorkspaceFileSetsImpl(override val fileSets: List<WorkspaceFileSetImpl>) : MultipleWorkspaceFileSets {
override fun find(acceptedCustomDataClass: Class<out WorkspaceFileSetData>?): WorkspaceFileSetImpl? {
return fileSets.find { acceptedCustomDataClass == null || acceptedCustomDataClass.isInstance(it.data) }
}
@@ -452,9 +399,9 @@ internal fun <K> MutableMap<K, StoredFileSetCollection>.removeValueIf(key: K, va
}
}
internal typealias PackagePrefixStorage = HashMap<String, MultiMap<EntityPointer<WorkspaceEntity>, StoredWorkspaceFileSet>>
internal typealias PackagePrefixStorage = HashMap<String, MultiMap<EntityPointer<WorkspaceEntity>, WorkspaceFileSetImpl>>
internal fun PackagePrefixStorage.addFileSet(packagePrefix: String, fileSet: StoredWorkspaceFileSet) {
internal fun PackagePrefixStorage.addFileSet(packagePrefix: String, fileSet: WorkspaceFileSetImpl) {
val entityRef2FileSet = getOrPut(packagePrefix) { MultiMap(LinkedHashMap()) }
entityRef2FileSet.putValue(fileSet.entityPointer, fileSet)
}