mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-07 22:09:38 +07:00
[workspace model] Optimize OrderEnumeratorBase usage of the workspace model
GitOrigin-RevId: 14f5e88d8dbfeacabbb29d1301e5db58ca3a96da
This commit is contained in:
committed by
intellij-monorepo-bot
parent
cf5ebf1514
commit
cce78ecfbd
@@ -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 = "/"
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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> {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user