Skip to content

Commit fd8603d

Browse files
Refactor: Simplify composition model by replacing Source.Source usage with Setup. Adjust builders and resolvers accordingly for cleaner code.
1 parent f60ca98 commit fd8603d

23 files changed

Lines changed: 107 additions & 100 deletions

src/Pure.DI.Core/Core/Code/ClassCommenter.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ sealed class ClassCommenter(
1212
{
1313
public void AddComments(CompositionCode composition, Unit unit)
1414
{
15-
var hints = composition.Source.Source.Hints;
15+
var hints = composition.Hints;
1616
if (!hints.IsCommentsEnabled)
1717
{
1818
return;
1919
}
2020

21-
var classComments = composition.Source.Source.Comments;
21+
var classComments = composition.Setup.Comments;
2222
var code = composition.Code;
2323
if (classComments.Count <= 0 && composition.PublicRoots.Length <= 0)
2424
{
@@ -72,7 +72,7 @@ IReadOnlyCollection<string> CreateRootTerms(Root root)
7272
{
7373
term.Append(formatter.FormatRef(root.Injection.Type));
7474
term.Append(' ');
75-
term.Append(formatter.FormatRef(composition.Source.Source, root));
75+
term.Append(formatter.FormatRef(composition.Setup, root));
7676
}
7777
else
7878
{
@@ -86,7 +86,7 @@ IReadOnlyCollection<string> CreateRootTerms(Root root)
8686
return [term.ToString()];
8787
}
8888

89-
var resolvers = resolversBuilder.Build(new RootsContext(composition.Source.Source, ImmutableArray.Create(root)));
89+
var resolvers = resolversBuilder.Build(new RootsContext(composition.Setup, ImmutableArray.Create(root)));
9090
if (!resolvers.Any())
9191
{
9292
return [term.ToString()];
@@ -132,13 +132,13 @@ IReadOnlyCollection<string> CreateRootDescriptions(Root root) =>
132132
if (root is not null)
133133
{
134134
code.AppendLine("/// <example>");
135-
code.AppendLine($"/// This example shows how to get an instance of type {formatter.FormatRef(root.Node.Type)} using the composition root {formatter.FormatRef(composition.Source.Source, root)}:");
135+
code.AppendLine($"/// This example shows how to get an instance of type {formatter.FormatRef(root.Node.Type)} using the composition root {formatter.FormatRef(composition.Setup, root)}:");
136136
code.AppendLine("/// <code>");
137137
var args = composition.ClassArgs
138138
.Where(i => i.Node.Arg?.Source.Kind == ArgKind.Composition)
139139
.Select(arg => arg.Name)
140140
.Concat(composition.SetupContextArgs.Where(arg => arg.Kind == SetupContextKind.Argument).Select(arg => arg.Name));
141-
code.AppendLine($"/// {(composition.TotalDisposablesCount == 0 ? "" : "using ")}var composition = new {composition.Source.Source.Name.ClassName}({string.Join(", ", args)});");
141+
code.AppendLine($"/// {(composition.TotalDisposablesCount == 0 ? "" : "using ")}var composition = new {composition.Name.ClassName}({string.Join(", ", args)});");
142142
code.AppendLine($"/// var instance = composition.{formatter.Format(root)};");
143143
code.AppendLine("/// </code>");
144144
code.AppendLine("/// See also:");

src/Pure.DI.Core/Core/Code/ClassDiagramBuilder.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public Lines Build(CompositionCode composition)
2727
return new Lines();
2828
}
2929

30-
var setup = composition.Source.Source;
30+
var setup = composition.Setup;
3131
var nullable = composition.Compilation.Options.NullableContextOptions == NullableContextOptions.Disable ? "" : "?";
3232
var lines = new Lines();
3333
lines.AppendLine("---");
@@ -41,12 +41,13 @@ public Lines Build(CompositionCode composition)
4141
using (lines.Indent())
4242
{
4343
var classes = new List<Class>();
44-
var hasResolveMethods = composition.Source.Source.Hints.IsResolveEnabled;
44+
var hints = composition.Hints;
45+
var hasResolveMethods = hints.IsResolveEnabled;
4546
var rootProperties = composition.PublicRoots.ToDictionary(i => i.Injection, i => i);
4647
var compositionLines = new Lines();
4748
if (hasResolveMethods || rootProperties.Count > 0)
4849
{
49-
compositionLines.AppendLine($"class {composition.Source.Source.Name.ClassName} {BlockStart}");
50+
compositionLines.AppendLine($"class {composition.Setup.Name.ClassName} {BlockStart}");
5051
using (lines.Indent())
5152
{
5253
compositionLines.AppendLine("<<partial>>");
@@ -57,7 +58,6 @@ public Lines Build(CompositionCode composition)
5758

5859
if (hasResolveMethods)
5960
{
60-
var hints = composition.Source.Source.Hints;
6161
var genericParameterT = $"{DefaultFormatOptions.StartGenericArgsSymbol}T{DefaultFormatOptions.FinishGenericArgsSymbol}";
6262
compositionLines.AppendLine($"{(hints.ResolveMethodModifiers == Names.DefaultApiMethodModifiers ? "+ " : "")}T {hints.ResolveMethodName}{genericParameterT}()");
6363
compositionLines.AppendLine($"{(hints.ResolveByTagMethodModifiers == Names.DefaultApiMethodModifiers ? "+ " : "")}T {hints.ResolveByTagMethodName}{genericParameterT}(object{nullable} tag)");
@@ -70,22 +70,22 @@ public Lines Build(CompositionCode composition)
7070
}
7171
else
7272
{
73-
compositionLines.AppendLine($"class {composition.Source.Source.Name.ClassName}");
73+
compositionLines.AppendLine($"class {composition.Name.ClassName}");
7474
}
7575

76-
var compositionClass = new Class(composition.Source.Source.Name.Namespace, composition.Source.Source.Name.ClassName, "", null, compositionLines);
76+
var compositionClass = new Class(composition.Name.Namespace, composition.Name.ClassName, "", null, compositionLines);
7777
classes.Add(compositionClass);
7878

7979
if (composition.TotalDisposablesCount > 0)
8080
{
8181
classes.Add(new Class(nameof(System), "IDisposable", "abstract", null, new Lines()));
82-
lines.AppendLine($"{composition.Source.Source.Name.ClassName} --|> IDisposable");
82+
lines.AppendLine($"{composition.Name.ClassName} --|> IDisposable");
8383
}
8484

8585
if (composition.AsyncDisposableCount > 0)
8686
{
8787
classes.Add(new Class(nameof(System), "IAsyncDisposable", "abstract", null, new Lines()));
88-
lines.AppendLine($"{composition.Source.Source.Name.ClassName} --|> IAsyncDisposable");
88+
lines.AppendLine($"{composition.Name.ClassName} --|> IAsyncDisposable");
8989
}
9090

9191
var typeSymbols = new HashSet<ITypeSymbol>(SymbolEqualityComparer.Default);
@@ -135,7 +135,7 @@ public Lines Build(CompositionCode composition)
135135

136136
if (dependency.Target.Root is not null && rootProperties.TryGetValue(dependency.Injection, out var root))
137137
{
138-
lines.AppendLine($"{composition.Source.Source.Name.ClassName} ..> {sourceType} : {FormatRoot(setup, root)}");
138+
lines.AppendLine($"{composition.Name.ClassName} ..> {sourceType} : {FormatRoot(setup, root)}");
139139
}
140140
else
141141
{

src/Pure.DI.Core/Core/Code/CompositionClassBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public CompositionCode Build(CompositionCode composition)
3131
composition = usingDeclarations.Build(composition);
3232

3333
var nsIndent = Disposables.Empty;
34-
var name = composition.Source.Source.Name;
34+
var name = composition.Name;
3535
if (!string.IsNullOrWhiteSpace(name.Namespace))
3636
{
3737
code.AppendLine($"namespace {name.Namespace}");

src/Pure.DI.Core/Core/Code/ParameterizedConstructorCommenter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ sealed class ParameterizedConstructorCommenter(
66
{
77
public void AddComments(CompositionCode composition, Unit unit)
88
{
9-
if (!composition.Source.Source.Hints.IsCommentsEnabled)
9+
if (!composition.Hints.IsCommentsEnabled)
1010
{
1111
return;
1212
}
1313

1414
var code = composition.Code;
1515
code.AppendLine("/// <summary>");
16-
code.AppendLine($"/// This parameterized constructor creates a new instance of <see cref=\"{composition.Source.Source.Name.ClassName}\"/> with arguments.");
16+
code.AppendLine($"/// This parameterized constructor creates a new instance of <see cref=\"{composition.Name.ClassName}\"/> with arguments.");
1717
code.AppendLine("/// </summary>");
1818
foreach (var arg in composition.ClassArgs.GetArgsOfKind(ArgKind.Composition))
1919
{

src/Pure.DI.Core/Core/Code/Parts/ApiMembersBuilder.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ public CompositionCode Build(CompositionCode composition)
2121
{
2222
var code = composition.Code;
2323
var membersCounter = composition.MembersCount;
24-
var hints = composition.Source.Source.Hints;
24+
var hints = composition.Hints;
2525
var isCommentsEnabled = hints.IsCommentsEnabled;
2626
var apiCode = new Lines();
2727
var nullable = composition.Compilation.Options.NullableContextOptions == NullableContextOptions.Disable ? "" : "?";
2828
if (hints.IsResolveEnabled)
2929
{
30-
var resolveTypeParam = codeNameProvider.GetUniqueTypeParameterName(composition.Source.Source.Name.ClassName);
30+
var resolveTypeParam = codeNameProvider.GetUniqueTypeParameterName(composition.Name.ClassName);
3131
if (isCommentsEnabled)
3232
{
3333
apiCode.AppendLine(CommentSummaryStart);
@@ -69,7 +69,7 @@ public CompositionCode Build(CompositionCode composition)
6969
membersCounter++;
7070

7171
apiCode.AppendLine();
72-
var resolvers = resolversBuilder.Build(new RootsContext(composition.Source.Source, composition.PublicRoots)).ToList();
72+
var resolvers = resolversBuilder.Build(new RootsContext(composition.Setup, composition.PublicRoots)).ToList();
7373
if (isCommentsEnabled)
7474
{
7575
apiCode.AppendLine(CommentSummaryStart);
@@ -139,26 +139,26 @@ public CompositionCode Build(CompositionCode composition)
139139
}
140140
}
141141

142-
if (composition.Source.Source.Hints is { IsOnNewInstanceEnabled: true, IsOnNewInstancePartial: true })
142+
if (composition.Hints is { IsOnNewInstanceEnabled: true, IsOnNewInstancePartial: true })
143143
{
144144
apiCode.AppendLine();
145-
var typeParam = codeNameProvider.GetUniqueTypeParameterName(composition.Source.Source.Name.ClassName);
145+
var typeParam = codeNameProvider.GetUniqueTypeParameterName(composition.Name.ClassName);
146146
apiCode.AppendLine($"partial void {Names.OnNewInstanceMethodName}<{typeParam}>(ref {typeParam} value, object{nullable} tag, {Names.ApiNamespace}{nameof(Lifetime)} lifetime);");
147147
membersCounter++;
148148
}
149149

150-
if (composition.Source.Source.Hints is { IsOnDependencyInjectionEnabled: true, IsOnDependencyInjectionPartial: true })
150+
if (composition.Hints is { IsOnDependencyInjectionEnabled: true, IsOnDependencyInjectionPartial: true })
151151
{
152152
apiCode.AppendLine();
153-
var typeParam = codeNameProvider.GetUniqueTypeParameterName(composition.Source.Source.Name.ClassName);
153+
var typeParam = codeNameProvider.GetUniqueTypeParameterName(composition.Name.ClassName);
154154
apiCode.AppendLine($"private partial {typeParam} {Names.OnDependencyInjectionMethodName}<{typeParam}>(in {typeParam} value, object{nullable} tag, {Names.ApiNamespace}{nameof(Lifetime)} lifetime);");
155155
membersCounter++;
156156
}
157157

158-
if (composition.Source.Source.Hints is { IsOnCannotResolveEnabled: true, IsOnCannotResolvePartial: true })
158+
if (composition.Hints is { IsOnCannotResolveEnabled: true, IsOnCannotResolvePartial: true })
159159
{
160160
apiCode.AppendLine();
161-
var typeParam = codeNameProvider.GetUniqueTypeParameterName(composition.Source.Source.Name.ClassName);
161+
var typeParam = codeNameProvider.GetUniqueTypeParameterName(composition.Name.ClassName);
162162
apiCode.AppendLine($"private partial {typeParam} {Names.OnCannotResolve}<{typeParam}>(object{nullable} tag, {Names.ApiNamespace}{nameof(Lifetime)} lifetime);");
163163
membersCounter++;
164164
}

src/Pure.DI.Core/Core/Code/Parts/ArgFieldsBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public CompositionCode Build(CompositionCode composition)
1919
var membersCounter = composition.MembersCount;
2020
foreach (var arg in classArgs)
2121
{
22-
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private readonly {typeResolver.Resolve(composition.Source.Source, arg.InstanceType)} {arg.Name};");
22+
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private readonly {typeResolver.Resolve(composition.Setup, arg.InstanceType)} {arg.Name};");
2323
membersCounter++;
2424
}
2525

@@ -35,7 +35,7 @@ public CompositionCode Build(CompositionCode composition)
3535
switch (arg.Kind)
3636
{
3737
case SetupContextKind.Argument:
38-
var typeName = typeResolver.Resolve(composition.Source.Source, arg.Type);
38+
var typeName = typeResolver.Resolve(composition.Setup, arg.Type);
3939
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private readonly {typeName} {arg.Name};");
4040
membersCounter++;
4141
break;

src/Pure.DI.Core/Core/Code/Parts/DefaultConstructorBuilder.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ public CompositionCode Build(CompositionCode composition)
1818

1919
var code = composition.Code;
2020
var membersCounter = composition.MembersCount;
21-
var hints = composition.Source.Source.Hints;
21+
var hints = composition.Hints;
2222
var isCommentsEnabled = hints.IsCommentsEnabled;
2323
if (isCommentsEnabled)
2424
{
2525
code.AppendLine("/// <summary>");
26-
code.AppendLine($"/// This constructor creates a new instance of <see cref=\"{composition.Source.Source.Name.ClassName}\"/>. Typically used to create a root scope in scenarios where <see cref=\"Lifetime.Scoped\"/> lifetime might be used.");
26+
code.AppendLine($"/// This constructor creates a new instance of <see cref=\"{composition.Name.ClassName}\"/>. Typically used to create a root scope in scenarios where <see cref=\"Lifetime.Scoped\"/> lifetime might be used.");
2727
code.AppendLine("/// </summary>");
2828
}
2929

3030
code.AppendLine($"[{Names.OrdinalAttributeName}(256)]");
31-
var ctorName = codeNameProvider.GetConstructorName(composition.Source.Source.Name.ClassName);
31+
var ctorName = codeNameProvider.GetConstructorName(composition.Name.ClassName);
3232
code.AppendLine($"public {ctorName}()");
3333
using (code.CreateBlock())
3434
{

src/Pure.DI.Core/Core/Code/Parts/DisposeMethodBuilder.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public CompositionCode Build(CompositionCode composition)
2222

2323
var hasDisposable = composition.DisposablesCount > 0;
2424
var hasAsyncDisposable = composition.AsyncDisposableCount > 0;
25-
var hints = composition.Source.Source.Hints;
25+
var hints = composition.Hints;
2626
var isCommentsEnabled = hints.IsCommentsEnabled;
2727
if (isCommentsEnabled)
2828
{
@@ -31,7 +31,7 @@ public CompositionCode Build(CompositionCode composition)
3131
code.AppendLine("/// </summary>");
3232
}
3333

34-
code.AppendLine($"{composition.Source.Source.Hints.DisposeMethodModifiers} void Dispose()");
34+
code.AppendLine($"{composition.Hints.DisposeMethodModifiers} void Dispose()");
3535
using (code.CreateBlock())
3636
{
3737
AddSyncPart(composition, code, false);
@@ -83,7 +83,7 @@ public CompositionCode Build(CompositionCode composition)
8383
code.AppendLine("/// </summary>");
8484
}
8585

86-
code.AppendLine($"{composition.Source.Source.Hints.DisposeAsyncMethodModifiers} async {Names.ValueTaskTypeName} DisposeAsync()");
86+
code.AppendLine($"{composition.Hints.DisposeAsyncMethodModifiers} async {Names.ValueTaskTypeName} DisposeAsync()");
8787
using (code.CreateBlock())
8888
{
8989
AddSyncPart(composition, code, true);
@@ -202,7 +202,7 @@ private void AddSyncPart(CompositionCode composition, Lines code, bool isAsync)
202202
{
203203
if (singletonField.InstanceType.IsValueType)
204204
{
205-
code.AppendLine($"{singletonField.Name} = default({typeResolver.Resolve(composition.Source.Source, singletonField.InstanceType)});");
205+
code.AppendLine($"{singletonField.Name} = default({typeResolver.Resolve(composition.Setup, singletonField.InstanceType)});");
206206
code.AppendLine($"{singletonField.Name}{Names.CreatedValueNameSuffix} = false;");
207207
}
208208
else

src/Pure.DI.Core/Core/Code/Parts/FieldsBuilder.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@ public CompositionCode Build(CompositionCode composition)
2222
if (isAnyConstructorEnabled && composition.Singletons.Length > 0)
2323
{
2424
// _parent filed
25-
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private {composition.Source.Source.Name.ClassName} {Names.RootFieldName};");
25+
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private {composition.Name.ClassName} {Names.RootFieldName};");
2626
membersCounter++;
2727
}
2828

2929
if (composition.IsLockRequired)
3030
{
3131
// _lock field
3232
code.AppendLine(new Line(int.MinValue, "#if NET9_0_OR_GREATER"));
33-
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private {Names.LockTypeName} {Names.LockFieldName}{(skipFieldsInit ? "" : $" = new {Names.LockTypeName}()")};");
33+
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private {(composition.IsFactoryMethod ? "" : "readonly ")}{Names.LockTypeName} {Names.LockFieldName}{(skipFieldsInit ? "" : $" = new {Names.LockTypeName}()")};");
3434
code.AppendLine(new Line(int.MinValue, "#else"));
35-
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private {Names.ObjectTypeName} {Names.LockFieldName}{(skipFieldsInit ? "" : $" = new {Names.ObjectTypeName}()")};");
35+
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private {(composition.IsFactoryMethod ? "" : "readonly ")}{Names.ObjectTypeName} {Names.LockFieldName}{(skipFieldsInit ? "" : $" = new {Names.ObjectTypeName}()")};");
3636
code.AppendLine(new Line(int.MinValue, "#endif"));
3737
membersCounter++;
3838
}
@@ -56,14 +56,14 @@ public CompositionCode Build(CompositionCode composition)
5656
{
5757
if (singletonField.InstanceType.IsValueType)
5858
{
59-
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private {typeResolver.Resolve(composition.Source.Source, singletonField.InstanceType)} {singletonField.Name};");
59+
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private {typeResolver.Resolve(composition.Setup, singletonField.InstanceType)} {singletonField.Name};");
6060
membersCounter++;
6161

6262
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private bool {singletonField.Name}{Names.CreatedValueNameSuffix};");
6363
}
6464
else
6565
{
66-
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private {typeResolver.Resolve(composition.Source.Source, singletonField.InstanceType)}{nullable} {singletonField.Name};");
66+
code.AppendLine($"[{Names.NonSerializedAttributeTypeName}] private {typeResolver.Resolve(composition.Setup, singletonField.InstanceType)}{nullable} {singletonField.Name};");
6767
}
6868

6969
membersCounter++;

src/Pure.DI.Core/Core/Code/Parts/LightweightRootClassBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public CompositionCode Build(CompositionCode composition)
2626
foreach (var root in roots)
2727
{
2828
var mdRoot = root.Source;
29-
var rootType = typeResolver.Resolve(composition.Source.Source, mdRoot.RootType);
29+
var rootType = typeResolver.Resolve(composition.Setup, mdRoot.RootType);
3030
code.AppendLine($"[{Names.OrdinalAttributeName}()] public {Names.FuncTypeName}<{rootType}> {root.Source.UniqueName};");
3131
}
3232
}

0 commit comments

Comments
 (0)