2using System.Collections.Generic;
3using System.Collections.Immutable;
4using System.Diagnostics;
11 internal readonly
partial struct ModuleDescriptor
20 public static Builder CreateModule(
string name, ModuleFlag modifiers)
22 return new Builder(name, modifiers);
30 public static Builder CreateModule(
string name)
32 return new Builder(name,
false);
40 public static Builder CreateAutomaticModule(
string name)
42 return new Builder(name,
true);
51 readonly
string _name;
52 readonly ModuleFlag _modifiers;
53 readonly
bool _automatic;
54 ModuleVersion _version;
55 HashSet<string>? _requiresKeys;
56 ImmutableHashSet<ModuleRequires>.Builder? _requires;
57 HashSet<string>? _exportsKeys;
58 ImmutableHashSet<ModuleExports>.Builder? _exports;
59 HashSet<string>? _opensKeys;
60 ImmutableHashSet<ModuleOpens>.Builder? _opens;
61 ImmutableHashSet<string>.Builder? _uses;
62 HashSet<string>? _providesKeys;
63 ImmutableHashSet<ModuleProvides>.Builder? _provides;
64 ImmutableHashSet<string>.Builder? _packages;
70 internal Builder(
string name,
bool automatic)
74 _automatic = automatic;
82 internal Builder(
string name, ModuleFlag modifiers)
85 _modifiers = modifiers;
94 public string Name => _name;
109 public bool IsOpen => (_modifiers & ModuleFlag.Open) != 0;
121 throw new InvalidOperationException(
"Automatic modules cannot declare dependences");
122 if (_name.Equals(
requires.Name))
123 throw new ArgumentException(
"Dependence on self.");
124 if (_requiresKeys !=
null && _requiresKeys.Contains(
requires.Name))
125 throw new InvalidOperationException($
"Dependence upon {requires.Name} already declared.");
127 _requiresKeys ??=
new HashSet<string>();
128 _requiresKeys.Add(
requires.
Name);
129 _requires ??= ImmutableHashSet.CreateBuilder<ModuleRequires>();
130 _requires.Add(
requires);
143 public Builder Requires(ModuleRequiresFlag modifiers,
string name, ModuleVersion version)
145 return Requires(
new ModuleRequires(modifiers, name, version));
158 var v =
default(ModuleVersion);
159 if (version is not
null)
160 ModuleVersion.TryParse(version, out v);
162 return Requires(
new ModuleRequires(modifiers, name, v));
174 return Requires(
new ModuleRequires(modifiers, name,
default));
185 return Requires(
new ModuleRequires(
default, name,
default));
198 throw new InvalidOperationException(
"Automatic modules cannot declare dependences.");
199 if (_exportsKeys !=
null && _exportsKeys.Contains(exports.Source))
200 throw new InvalidOperationException($
"Exported package {exports.Source} already declared.");
202 _exportsKeys ??=
new HashSet<string>();
203 _exportsKeys.Add(exports.Source);
204 _exports ??= ImmutableHashSet.CreateBuilder<ModuleExports>();
205 _exports.Add(exports);
217 public Builder Exports(ModuleExportsFlag modifiers,
string name, ImmutableHashSet<string> targets)
219 return Exports(
new ModuleExports(modifiers, name, targets));
230 return Exports(modifiers, name, []);
241 return Exports(
default, name, targets);
251 return Exports(
default, name, []);
264 throw new InvalidOperationException(
"Open or automatic modules cannot declare open packages.");
265 if (_opensKeys !=
null && _opensKeys.Contains(opens.Source))
266 throw new InvalidOperationException($
"Open package {opens.Source} already declared.");
268 _opensKeys ??=
new HashSet<string>();
269 _opensKeys.Add(opens.Source);
270 _opens ??= ImmutableHashSet.CreateBuilder<ModuleOpens>();
272 _packages ??= ImmutableHashSet.CreateBuilder<
string>();
273 _packages.Add(opens.Source);
285 public Builder Opens(ModuleOpensFlag modifiers,
string packageName, ImmutableHashSet<string> targets)
287 return Opens(
new ModuleOpens(modifiers, packageName, targets));
298 return Opens(modifiers, packageName, []);
307 public Builder Opens(
string packageName, ImmutableHashSet<string> targets)
309 return Opens(
default, packageName, targets);
319 return Opens(
default, packageName, []);
332 throw new ArgumentNullException(nameof(service));
335 throw new InvalidOperationException(
"Automatic modules cannot declare service dependencies.");
336 if (_uses !=
null && _uses.Contains(service))
337 throw new InvalidOperationException($
"Dependence upon service {service} already declared.");
339 _uses ??= ImmutableHashSet.CreateBuilder<
string>();
354 if (_providesKeys !=
null && _providesKeys.Contains(provides.Service))
355 throw new InvalidOperationException($
"Providers of service {provides.Service} already declared.");
357 _providesKeys ??=
new HashSet<string>();
358 _providesKeys.Add(provides.Service);
359 _provides ??= ImmutableHashSet.CreateBuilder<ModuleProvides>();
360 _provides.Add(provides);
362 _packages ??= ImmutableHashSet.CreateBuilder<
string>();
363 foreach (var p
in provides.Providers)
364 _packages.Add(GetPackageName(p));
377 return Provides(
new ModuleProvides(service, providers));
385 string GetPackageName(
string cn)
388 throw new ArgumentNullException(nameof(cn));
390 int index = cn.LastIndexOf(
'.');
391 return (index == -1) ?
"" : cn[..index];
402 throw new ArgumentNullException(nameof(name));
404 _packages ??= ImmutableHashSet.CreateBuilder<
string>();
427 if (value is not
null && ModuleVersion.TryParse(value.AsSpan(), out _version))
444 var packageName = GetPackageName(mainClass);
445 if (
string.IsNullOrEmpty(packageName))
446 throw new ArgumentException($
"{mainClass}: unnamed package", nameof(mainClass));
448 _packages ??= ImmutableHashSet.CreateBuilder<
string>();
449 _packages.Add(packageName);
450 _mainClass = mainClass;
461 return new ModuleDescriptor(
466 _requires?.ToImmutable() ?? [],
467 _exports?.ToImmutable() ?? [],
468 _opens?.ToImmutable() ?? [],
469 _uses?.ToImmutable() ?? [],
470 _provides?.ToImmutable() ?? [],
471 _packages?.ToImmutable() ?? [],
global::java.lang.invoke.LambdaForm.Name Name
A builder for building ModuleDescriptor objects.
bool IsAutomatic
Gets whether this is an automatic module or not.
ModuleFlag Modifiers
Gets the modifiers.
Builder Exports(string name, ImmutableHashSet< string > targets)
Adds an exported package. The package is exported to a set of target modules.
Builder Requires(ModuleRequires requires)
Adds a dependence on a module.
Builder Requires(ModuleRequiresFlag modifiers, string name, ModuleVersion version)
Adds a dependence on a module with the given (and possibly empty) set of modifiers....
Builder Exports(string name)
Adds an exported package. The package is exported to all modules.
bool IsOpen
Gets whether this is an open module or not.
Builder Uses(string service)
Adds a service dependence.
Builder Package(string name)
Adds a package to the module.
Builder Provides(string service, ImmutableArray< string > providers)
Provides implementations of a service. The package for each provider (or provider factory) is added t...
Builder Requires(string name)
Adds a dependence on a module with the given (and possibly empty) set of modifiers....
Builder Opens(ModuleOpens opens)
Adds an open package.
Builder Requires(ModuleRequiresFlag modifiers, string name, string? version)
Adds a dependence on a module with the given (and possibly empty) set of modifiers....
Builder Opens(ModuleOpensFlag modifiers, string packageName, ImmutableHashSet< string > targets)
Adds an open package with the given(and possibly empty) set of modifiers. The package is open to a se...
Builder Version(string value)
Sets the module version.
ModuleDescriptor Build()
Builds and returns a ModuleDescriptor from its components.
Builder Exports(ModuleExportsFlag modifiers, string name, ImmutableHashSet< string > targets)
Adds an exported package with the given (and possibly empty) set of modifiers. The package is exporte...
Builder Requires(ModuleRequiresFlag modifiers, string name)
Adds a dependence on a module with the given (and possibly empty) set of modifiers....
Builder MainClass(string mainClass)
Sets the module main class. The package for the main class is added to the module if not already adde...
Builder Exports(ModuleExportsFlag modifiers, string name)
Adds an exported package with the given (and possibly empty) set of modifiers.The package is exported...
Builder Provides(ModuleProvides provides)
Provides a service with one or more implementations. The package for each ModuleProvides (or provider...
Builder Exports(ModuleExports exports)
Adds an exported package.
Builder Version(ModuleVersion version)
Sets the module version.
Builder Opens(ModuleOpensFlag modifiers, string packageName)
Adds an open package with the given (and possibly empty) set of modifiers. The package is open to all...
Builder Opens(string packageName, ImmutableHashSet< string > targets)
Adds an open package. The package is open to a set of target modules.
Builder Opens(string packageName)
Adds an open package. The package is open to all modules.