[workspace model] Optimize OrderEnumeratorBase usage of the workspace model

GitOrigin-RevId: 14f5e88d8dbfeacabbb29d1301e5db58ca3a96da
This commit is contained in:
Lev Leontev
2024-08-26 17:53:13 +02:00
committed by intellij-monorepo-bot
parent cf5ebf1514
commit cce78ecfbd
7 changed files with 43 additions and 9 deletions

View File

@@ -1,6 +1,7 @@
// 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.openapi.module.impl
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Pair
@@ -20,6 +21,8 @@ abstract class ModuleManagerEx : ModuleManager() {
open fun updateUnloadedStorage(modulesToLoad: List<String>, modulesToUnload: List<String>) {}
abstract val modulesByNameMap: Map<String, Module>
companion object {
const val IML_EXTENSION: String = ".iml"
const val MODULE_GROUP_SEPARATOR: String = "/"

View File

@@ -20,7 +20,7 @@ public final class ModuleOrderEnumerator extends OrderEnumeratorBase {
@ApiStatus.Internal
public ModuleOrderEnumerator(@NotNull ModuleRootModel rootModel, @Nullable OrderRootsCache cache) {
super(cache);
super(rootModel.getModule().getProject(), cache);
myRootModel = rootModel;
}

View File

@@ -2,6 +2,7 @@
package com.intellij.openapi.roots.impl;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootModel;
import com.intellij.openapi.roots.OrderEntry;
import com.intellij.openapi.roots.OrderEnumerationHandler;
@@ -19,8 +20,8 @@ import java.util.Set;
public final class ModulesOrderEnumerator extends OrderEnumeratorBase {
private final Collection<? extends Module> myModules;
public ModulesOrderEnumerator(@NotNull Collection<? extends Module> modules) {
super(null);
public ModulesOrderEnumerator(@NotNull Project project, @NotNull Collection<? extends Module> modules) {
super(project, null);
myModules = modules;
}

View File

@@ -3,7 +3,9 @@ package com.intellij.openapi.roots.impl;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.impl.ModuleManagerEx;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.util.Condition;
@@ -33,9 +35,13 @@ abstract class OrderEnumeratorBase extends OrderEnumerator implements OrderEnume
private boolean myExportedOnly;
private Condition<? super OrderEntry> myCondition;
RootModelProvider myModulesProvider;
private final Project myProject;
private final OrderRootsCache myCache;
// A map is quicker than querying the workspace model repeatedly.
private Map<String, Module> myModulesByNameMap;
OrderEnumeratorBase(@Nullable OrderRootsCache cache) {
OrderEnumeratorBase(@NotNull Project project, @Nullable OrderRootsCache cache) {
myProject = project;
myCache = cache;
}
@@ -200,6 +206,7 @@ abstract class OrderEnumeratorBase extends OrderEnumerator implements OrderEnume
@Override
public boolean shouldRecurse(@NotNull ModuleOrderEntry entry, @NotNull List<? extends OrderEnumerationHandler> handlers) {
updateModulesByNameMap();
ProcessEntryAction action = shouldAddOrRecurse(entry, true, handlers);
return action.type == ProcessEntryActionType.RECURSE;
}
@@ -278,7 +285,7 @@ abstract class OrderEnumeratorBase extends OrderEnumerator implements OrderEnume
if (myRecursivelyExportedOnly && !firstLevel) return ProcessEntryAction.SKIP;
}
if (myRecursively && entry instanceof ModuleOrderEntry moduleOrderEntry) {
final Module depModule = moduleOrderEntry.getModule();
final Module depModule = myModulesByNameMap.get(moduleOrderEntry.getModuleName());
if (depModule != null && shouldProcessRecursively(customHandlers)) {
return ProcessEntryAction.RECURSE(depModule);
}
@@ -292,6 +299,20 @@ abstract class OrderEnumeratorBase extends OrderEnumerator implements OrderEnume
boolean firstLevel,
@NotNull List<? extends OrderEnumerationHandler> customHandlers,
@NotNull PairProcessor<? super OrderEntry, ? super List<? extends OrderEnumerationHandler>> processor) {
updateModulesByNameMap();
doProcessEntries(rootModel, processed, firstLevel, customHandlers, processor);
}
private void updateModulesByNameMap() {
final ModuleManagerEx moduleManager = ModuleManagerEx.getInstanceEx(myProject);
myModulesByNameMap = moduleManager.getModulesByNameMap();
}
private void doProcessEntries(@NotNull ModuleRootModel rootModel,
@Nullable Set<? super Module> processed,
boolean firstLevel,
@NotNull List<? extends OrderEnumerationHandler> customHandlers,
@NotNull PairProcessor<? super OrderEntry, ? super List<? extends OrderEnumerationHandler>> processor) {
ProgressManager.checkCanceled();
if (processed != null && !processed.add(rootModel.getModule())) return;
@@ -301,7 +322,7 @@ abstract class OrderEnumeratorBase extends OrderEnumerator implements OrderEnume
continue;
}
if (action.type == ProcessEntryActionType.RECURSE) {
processEntries(getRootModel(action.recurseOnModule), processed, false, customHandlers, processor);
doProcessEntries(getRootModel(action.recurseOnModule), processed, false, customHandlers, processor);
continue;
}
assert action.type == ProcessEntryActionType.PROCESS;
@@ -351,13 +372,15 @@ abstract class OrderEnumeratorBase extends OrderEnumerator implements OrderEnume
@Override
public void forEachModule(@NotNull final Processor<? super Module> processor) {
updateModulesByNameMap();
forEach((orderEntry, customHandlers) -> {
if (myRecursively && orderEntry instanceof ModuleSourceOrderEntry) {
final Module module = ((ModuleSourceOrderEntry)orderEntry).getRootModel().getModule();
return processor.process(module);
}
if (orderEntry instanceof ModuleOrderEntry && (!myRecursively || !shouldProcessRecursively(customHandlers))) {
final Module module = ((ModuleOrderEntry)orderEntry).getModule();
final String moduleName = ((ModuleOrderEntry)orderEntry).getModuleName();
final Module module = myModulesByNameMap.get(moduleName);
if (module != null) {
return processor.process(module);
}

View File

@@ -20,7 +20,7 @@ final class ProjectOrderEnumerator extends OrderEnumeratorBase {
private final Project myProject;
ProjectOrderEnumerator(@NotNull Project project, @Nullable OrderRootsCache rootsCache) {
super(rootsCache);
super(project, rootsCache);
myProject = project;
}

View File

@@ -235,7 +235,7 @@ open class ProjectRootManagerImpl(val project: Project,
override fun orderEntries(): OrderEnumerator = ProjectOrderEnumerator(project, rootCache)
@ApiStatus.Internal
override fun orderEntries(modules: Collection<Module>): OrderEnumerator = ModulesOrderEnumerator(modules)
override fun orderEntries(modules: Collection<Module>): OrderEnumerator = ModulesOrderEnumerator(project, modules)
@ApiStatus.Internal
override fun getContentRootsFromAllModules(): Array<VirtualFile> {

View File

@@ -335,6 +335,13 @@ abstract class ModuleManagerBridgeImpl(private val project: Project,
override val sortedModules: Array<Module>
get() = entityStore.cachedValue(sortedModulesValue)
private val modulesByNameMapValue = CachedValue<Map<String, Module>> { storage ->
modules(storage).associateByTo(hashMapOf()) { it.name }
}
override val modulesByNameMap: Map<String, Module>
get() = entityStore.cachedValue(modulesByNameMapValue)
override fun findModuleByName(name: String): Module? {
return entityStore.current.resolve(ModuleId(name))?.findModule(entityStore.current)
}