IKVM11  11
Java SE 11 Virtual Machine for .NET
Loading...
Searching...
No Matches
ModuleConfiguration.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Collections.Immutable;
4using System.Linq;
5
7
9{
10
22 internal class ModuleConfiguration
23 {
24
45 public static ModuleConfiguration Resolve(IModuleFinder before, ImmutableArray<ModuleConfiguration> parents, IModuleFinder after, ImmutableArray<string> roots)
46 {
47 if (before is null)
48 throw new ArgumentNullException(nameof(before));
49 if (after is null)
50 throw new ArgumentNullException(nameof(after));
51
52 var resolver = new ModuleResolver(before, parents, after);
53 resolver.Resolve(roots);
54 return new ModuleConfiguration(parents, resolver);
55 }
56
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;
62
63 ImmutableArray<ModuleConfiguration> _all;
64
68 public ModuleConfiguration(ImmutableArray<ModuleConfiguration> parents, ModuleResolver resolver)
69 {
70 var graph = resolver.Finish(this);
71
72 var nameEntries = new KeyValuePair<string, ResolvedModule>[graph.Count];
73 var moduleArray = new ResolvedModule[graph.Count];
74
75 int i = 0;
76 foreach (var resolvedModule in graph.Keys)
77 {
78 moduleArray[i] = resolvedModule;
79 nameEntries[i] = new KeyValuePair<string, ResolvedModule>(resolvedModule.Name, resolvedModule);
80 i++;
81 }
82
83 _parents = parents;
84 _graph = graph;
85 _modules = moduleArray.ToImmutableHashSet();
86 _nameToModule = nameEntries.ToImmutableDictionary();
87 _targetPlatform = resolver.TargetPlatform;
88 }
89
93 public ImmutableArray<ModuleConfiguration> Parents => _parents;
94
98 public ImmutableHashSet<ResolvedModule> Modules => _modules;
99
103 public string? TargetPlatform => _targetPlatform;
104
121 public ModuleConfiguration Resolve(IModuleFinder before, IModuleFinder after, ImmutableArray<string> roots)
122 {
123 if (before is null)
124 throw new ArgumentNullException(nameof(before));
125 if (after is null)
126 throw new ArgumentNullException(nameof(after));
127
128 return Resolve(before, [this], after, roots);
129 }
130
136 public ResolvedModule? FindModule(string name)
137 {
138 if (name is null)
139 throw new ArgumentNullException(nameof(name));
140
141 if (_nameToModule.TryGetValue(name, out var r))
142 return r;
143
144 if (Parents.IsEmpty == false)
145 {
146 var all = All();
147 for (int i = 1; i < all.Length; i++)
148 if (all[i]._nameToModule.TryGetValue(name, out var r2))
149 return r2;
150 }
151
152 return null;
153 }
154
160 internal ImmutableHashSet<ResolvedModule> GetReads(ResolvedModule module)
161 {
162 return _graph.TryGetValue(module, out var result) ? result : [];
163 }
164
170 internal ImmutableArray<ModuleConfiguration> All()
171 {
172 if (_all.IsDefault)
173 _all = CalculateAll();
174
175 return _all;
176 }
177
182 ImmutableArray<ModuleConfiguration> CalculateAll()
183 {
184 var all = ImmutableArray.CreateBuilder<ModuleConfiguration>(1);
185
186 var v = new HashSet<ModuleConfiguration>();
187 var s = new ArrayDeque<ModuleConfiguration>();
188 v.Add(this);
189 s.InsertFirst(this);
190
191 while (s.IsEmpty == false)
192 {
193 var layer = s.RemoveFirst();
194 all.Add(layer);
195
196 // push in reverse order
197 for (int i = layer._parents.Length - 1; i >= 0; i--)
198 {
199 var parent = layer._parents[i];
200 if (v.Add(parent))
201 s.InsertFirst(parent);
202 }
203 }
204
205 return all.DrainToImmutable();
206 }
207
209 public override string? ToString()
210 {
211 return string.Join(", ", _modules.Select(i => i.Name));
212 }
213
214 }
215
216}