2using System.Collections.Generic;
3using System.Collections.Immutable;
22 internal class ModuleConfiguration
45 public static ModuleConfiguration Resolve(IModuleFinder before, ImmutableArray<ModuleConfiguration> parents, IModuleFinder after, ImmutableArray<string> roots)
48 throw new ArgumentNullException(nameof(before));
50 throw new ArgumentNullException(nameof(after));
52 var resolver =
new ModuleResolver(before, parents, after);
53 resolver.Resolve(roots);
54 return new ModuleConfiguration(parents, resolver);
57 readonly ImmutableArray<ModuleConfiguration> _parents;
58 readonly ImmutableDictionary<ResolvedModule, ImmutableHashSet<ResolvedModule>> _graph;
59 readonly ImmutableHashSet<ResolvedModule> _modules;
60 readonly ImmutableDictionary<string, ResolvedModule> _nameToModule;
61 readonly
string? _targetPlatform;
63 ImmutableArray<ModuleConfiguration> _all;
68 public ModuleConfiguration(ImmutableArray<ModuleConfiguration> parents, ModuleResolver resolver)
70 var graph = resolver.Finish(
this);
72 var nameEntries =
new KeyValuePair<string, ResolvedModule>[graph.Count];
73 var moduleArray =
new ResolvedModule[graph.Count];
76 foreach (var resolvedModule
in graph.Keys)
78 moduleArray[i] = resolvedModule;
79 nameEntries[i] =
new KeyValuePair<string, ResolvedModule>(resolvedModule.Name, resolvedModule);
85 _modules = moduleArray.ToImmutableHashSet();
86 _nameToModule = nameEntries.ToImmutableDictionary();
87 _targetPlatform = resolver.TargetPlatform;
93 public ImmutableArray<ModuleConfiguration> Parents => _parents;
98 public ImmutableHashSet<ResolvedModule> Modules => _modules;
103 public string? TargetPlatform => _targetPlatform;
121 public ModuleConfiguration Resolve(IModuleFinder before, IModuleFinder after, ImmutableArray<string> roots)
124 throw new ArgumentNullException(nameof(before));
126 throw new ArgumentNullException(nameof(after));
128 return Resolve(before, [
this], after, roots);
136 public ResolvedModule? FindModule(
string name)
139 throw new ArgumentNullException(nameof(name));
141 if (_nameToModule.TryGetValue(name, out var r))
144 if (Parents.IsEmpty ==
false)
147 for (
int i = 1; i < all.Length; i++)
148 if (all[i]._nameToModule.TryGetValue(name, out var r2))
160 internal ImmutableHashSet<ResolvedModule> GetReads(ResolvedModule module)
162 return _graph.TryGetValue(module, out var result) ? result : [];
170 internal ImmutableArray<ModuleConfiguration> All()
173 _all = CalculateAll();
182 ImmutableArray<ModuleConfiguration> CalculateAll()
184 var all = ImmutableArray.CreateBuilder<ModuleConfiguration>(1);
186 var v =
new HashSet<ModuleConfiguration>();
187 var s =
new ArrayDeque<ModuleConfiguration>();
191 while (s.IsEmpty ==
false)
193 var layer = s.RemoveFirst();
197 for (
int i = layer._parents.Length - 1; i >= 0; i--)
199 var parent = layer._parents[i];
201 s.InsertFirst(parent);
205 return all.DrainToImmutable();
209 public override string? ToString()
211 return string.Join(
", ", _modules.Select(i => i.Name));