IKVM11  11
Java SE 11 Virtual Machine for .NET
Loading...
Searching...
No Matches
ComposableModuleFinder.cs
Go to the documentation of this file.
1using System.Collections.Generic;
2using System.Collections.Immutable;
3using System.Threading;
4
6{
7
11 class ComposableModuleFinder : ModuleFinder
12 {
13
14 readonly ImmutableArray<IModuleFinder> _finders;
15 readonly Dictionary<string, ModuleReference> _nameToModule = new();
16
17 ImmutableHashSet<ModuleReference>? _all;
18
23 public ComposableModuleFinder(ImmutableArray<IModuleFinder> finders)
24 {
25 _finders = finders;
26 }
27
29 public override ModuleReference? Find(string name)
30 {
31 // already cached
32 if (_nameToModule.TryGetValue(name, out var mref))
33 return mref;
34
35 // scan finders
36 foreach (var finder in _finders)
37 if (finder.Find(name) is { } mref2)
38 return _nameToModule[name] = mref2;
39
40 return null;
41 }
42
44 public override ImmutableHashSet<ModuleReference> FindAll()
45 {
46 if (_all == null)
47 {
48 // start with existing cache
49 var all = ImmutableHashSet.CreateBuilder<ModuleReference>();
50 foreach (var mref in _nameToModule.Values)
51 all.Add(mref);
52
53 // add any missing items
54 foreach (var finder in _finders)
55 foreach (var mref in finder.FindAll())
56 if (_nameToModule.TryAdd(mref.Descriptor.Name, mref))
57 all.Add(mref);
58
59 // set result
60 Interlocked.CompareExchange(ref _all, all.ToImmutable(), null);
61 }
62
63 return _all;
64 }
65
66 }
67
68}
System.Threading.Interlocked Interlocked
IModuleFinder implementation that combines multiple IModuleFinders in order.
override ImmutableHashSet< ModuleReference > FindAll()
override? ModuleReference Find(string name)
ComposableModuleFinder(ImmutableArray< IModuleFinder > finders)
Initializes a new instance.