Skip to content

Commit

Permalink
Improved unique tag name
Browse files Browse the repository at this point in the history
  • Loading branch information
NikolayPianikov committed Mar 18, 2024
1 parent 25f7926 commit 2c3609c
Show file tree
Hide file tree
Showing 11 changed files with 51 additions and 81 deletions.
16 changes: 8 additions & 8 deletions readme/tag-unique.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,11 @@ classDiagram
+ object Resolve(Type type, object? tag)
}
class IEnumerableᐸIDependencyᐸStringᐳᐳ
AbcDependencyᐸStringᐳ --|> IDependencyᐸStringᐳ : cf28a5f5-c0c6-4d80-9869-561448e661e1
AbcDependencyᐸStringᐳ --|> IDependencyᐸStringᐳ : Unique tag 1
class AbcDependencyᐸStringᐳ {
+AbcDependency()
}
XyzDependencyᐸStringᐳ --|> IDependencyᐸStringᐳ : 0c31c79e-0327-4b14-9fc1-166a5a5aa440
XyzDependencyᐸStringᐳ --|> IDependencyᐸStringᐳ : Unique tag 2
class XyzDependencyᐸStringᐳ {
+XyzDependency()
}
Expand All @@ -64,8 +64,8 @@ classDiagram
class IServiceᐸStringᐳ {
<<abstract>>
}
IEnumerableᐸIDependencyᐸStringᐳᐳ *-- AbcDependencyᐸStringᐳ : cf28a5f5-c0c6-4d80-9869-561448e661e1 IDependencyᐸStringᐳ
IEnumerableᐸIDependencyᐸStringᐳᐳ *-- XyzDependencyᐸStringᐳ : 0c31c79e-0327-4b14-9fc1-166a5a5aa440 IDependencyᐸStringᐳ
IEnumerableᐸIDependencyᐸStringᐳᐳ *-- AbcDependencyᐸStringᐳ : Unique tag 1 IDependencyᐸStringᐳ
IEnumerableᐸIDependencyᐸStringᐳᐳ *-- XyzDependencyᐸStringᐳ : Unique tag 2 IDependencyᐸStringᐳ
Composition ..> ServiceᐸStringᐳ : IServiceᐸStringᐳ Root
ServiceᐸStringᐳ o-- "PerBlock" IEnumerableᐸIDependencyᐸStringᐳᐳ : IEnumerableᐸIDependencyᐸStringᐳᐳ
```
Expand Down Expand Up @@ -157,11 +157,11 @@ partial class Composition
" + object Resolve(Type type, object? tag)\n" +
" }\n" +
" class IEnumerableᐸIDependencyᐸStringᐳᐳ\n" +
" AbcDependencyᐸStringᐳ --|> IDependencyᐸStringᐳ : cf28a5f5-c0c6-4d80-9869-561448e661e1 \n" +
" AbcDependencyᐸStringᐳ --|> IDependencyᐸStringᐳ : Unique tag 1 \n" +
" class AbcDependencyᐸStringᐳ {\n" +
" +AbcDependency()\n" +
" }\n" +
" XyzDependencyᐸStringᐳ --|> IDependencyᐸStringᐳ : 0c31c79e-0327-4b14-9fc1-166a5a5aa440 \n" +
" XyzDependencyᐸStringᐳ --|> IDependencyᐸStringᐳ : Unique tag 2 \n" +
" class XyzDependencyᐸStringᐳ {\n" +
" +XyzDependency()\n" +
" }\n" +
Expand All @@ -175,8 +175,8 @@ partial class Composition
" class IServiceᐸStringᐳ {\n" +
" <<abstract>>\n" +
" }\n" +
" IEnumerableᐸIDependencyᐸStringᐳᐳ *-- AbcDependencyᐸStringᐳ : cf28a5f5-c0c6-4d80-9869-561448e661e1 IDependencyᐸStringᐳ\n" +
" IEnumerableᐸIDependencyᐸStringᐳᐳ *-- XyzDependencyᐸStringᐳ : 0c31c79e-0327-4b14-9fc1-166a5a5aa440 IDependencyᐸStringᐳ\n" +
" IEnumerableᐸIDependencyᐸStringᐳᐳ *-- AbcDependencyᐸStringᐳ : Unique tag 1 IDependencyᐸStringᐳ\n" +
" IEnumerableᐸIDependencyᐸStringᐳᐳ *-- XyzDependencyᐸStringᐳ : Unique tag 2 IDependencyᐸStringᐳ\n" +
" Composition ..> ServiceᐸStringᐳ : IServiceᐸStringᐳ Root\n" +
" ServiceᐸStringᐳ o-- \"PerBlock\" IEnumerableᐸIDependencyᐸStringᐳᐳ : IEnumerableᐸIDependencyᐸStringᐳᐳ";
}
Expand Down
64 changes: 1 addition & 63 deletions readme/tracking-disposable-instances-per-a-composition-root.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ partial class Composition

.Bind().To(ctx =>
{
ctx.Inject(out TT value);
ctx.Inject(ctx.Tag, out TT value);
var disposables = _disposables;
_disposables = [];
return new Owned<TT>(value, disposables);
Expand Down Expand Up @@ -188,31 +188,11 @@ partial class Composition

public object Resolve(global::System.Type type)
{
var index = (int)(_bucketSizeM03D18di * ((uint)global::System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(type) % 1));
var finish = index + _bucketSizeM03D18di;
do {
ref var pair = ref _bucketsM03D18di[index];
if (ReferenceEquals(pair.Key, type))
{
return pair.Value.Resolve(this);
}
} while (++index < finish);

throw new global::System.InvalidOperationException($"Cannot resolve composition root of type {type}.");
}

public object Resolve(global::System.Type type, object? tag)
{
var index = (int)(_bucketSizeM03D18di * ((uint)global::System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(type) % 1));
var finish = index + _bucketSizeM03D18di;
do {
ref var pair = ref _bucketsM03D18di[index];
if (ReferenceEquals(pair.Key, type))
{
return pair.Value.ResolveByTag(this, tag);
}
} while (++index < finish);

throw new global::System.InvalidOperationException($"Cannot resolve composition root \"{tag}\" of type {type}.");
}

Expand Down Expand Up @@ -248,21 +228,6 @@ partial class Composition
" OwnedᐸIServiceᐳ *-- Service : IService";
}

private readonly static int _bucketSizeM03D18di;
private readonly static global::Pure.DI.Pair<global::System.Type, global::Pure.DI.IResolver<Composition, object>>[] _bucketsM03D18di;

static Composition()
{
var valResolverM03D18di_0000 = new ResolverM03D18di_0000();
ResolverM03D18di<Pure.DI.UsageTests.Hints.TrackingDisposableInstancesPerRootScenario.Owned<Pure.DI.UsageTests.Hints.TrackingDisposableInstancesPerRootScenario.IService>>.Value = valResolverM03D18di_0000;
_bucketsM03D18di = global::Pure.DI.Buckets<global::System.Type, global::Pure.DI.IResolver<Composition, object>>.Create(
1,
out _bucketSizeM03D18di,
new global::Pure.DI.Pair<global::System.Type, global::Pure.DI.IResolver<Composition, object>>[1]
{
new global::Pure.DI.Pair<global::System.Type, global::Pure.DI.IResolver<Composition, object>>(typeof(Pure.DI.UsageTests.Hints.TrackingDisposableInstancesPerRootScenario.Owned<Pure.DI.UsageTests.Hints.TrackingDisposableInstancesPerRootScenario.IService>), valResolverM03D18di_0000)
});
}

private sealed class ResolverM03D18di<T>: global::Pure.DI.IResolver<Composition, T>
{
Expand All @@ -278,33 +243,6 @@ partial class Composition
throw new global::System.InvalidOperationException($"Cannot resolve composition root \"{tag}\" of type {typeof(T)}.");
}
}

private sealed class ResolverM03D18di_0000: global::Pure.DI.IResolver<Composition, Pure.DI.UsageTests.Hints.TrackingDisposableInstancesPerRootScenario.Owned<Pure.DI.UsageTests.Hints.TrackingDisposableInstancesPerRootScenario.IService>>, global::Pure.DI.IResolver<Composition, object>
{
public Pure.DI.UsageTests.Hints.TrackingDisposableInstancesPerRootScenario.Owned<Pure.DI.UsageTests.Hints.TrackingDisposableInstancesPerRootScenario.IService> Resolve(Composition composition)
{
return composition.Root;
}

public Pure.DI.UsageTests.Hints.TrackingDisposableInstancesPerRootScenario.Owned<Pure.DI.UsageTests.Hints.TrackingDisposableInstancesPerRootScenario.IService> ResolveByTag(Composition composition, object tag)
{
switch (tag)
{
case null:
return composition.Root;
}
throw new global::System.InvalidOperationException($"Cannot resolve composition root \"{tag}\" of type Pure.DI.UsageTests.Hints.TrackingDisposableInstancesPerRootScenario.Owned<Pure.DI.UsageTests.Hints.TrackingDisposableInstancesPerRootScenario.IService>.");
}
object global::Pure.DI.IResolver<Composition, object>.Resolve(Composition composition)
{
return Resolve(composition);
}

object global::Pure.DI.IResolver<Composition, object>.ResolveByTag(Composition composition, object tag)
{
return ResolveByTag(composition, tag);
}
}
}
```

Expand Down
6 changes: 4 additions & 2 deletions src/Pure.DI.Core/Core/BindingBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
namespace Pure.DI.Core;

internal class BindingBuilder(
[Tag("UniqueTags")] IIdGenerator idGenerator,
IBaseSymbolsProvider baseSymbolsProvider)
: IBindingBuilder
{
private MdDefaultLifetime? _defaultLifetime;
private SemanticModel? _semanticModel;
Expand Down Expand Up @@ -138,7 +140,7 @@ public MdBinding Build(MdSetup setup)
}
}

private static MdTag BuildTag(MdTag tag, ITypeSymbol? type)
private MdTag BuildTag(MdTag tag, ITypeSymbol? type)
{
if (type is null || tag.Value is null)
{
Expand All @@ -154,7 +156,7 @@ private static MdTag BuildTag(MdTag tag, ITypeSymbol? type)
return tag with { Value = type };

case Tag.Unique:
return tag with { Value = Guid.NewGuid() };
return tag with { Value = new UniqueTag(idGenerator.Generate()) };
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/Pure.DI.Core/Core/Code/BuildTools.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public void AddPureHeader(LinesBuilder code)
code.AppendLine("#endif");
}

public string GetDeclaration(Variable variable, bool typeIsRequired = false) =>
public string GetDeclaration(Variable variable) =>
variable.IsDeclared ? "" : $"{typeResolver.Resolve(variable.InstanceType)} ";

public string OnInjected(BuildContext ctx, Variable variable)
Expand Down
2 changes: 1 addition & 1 deletion src/Pure.DI.Core/Core/Code/ConstructCodeBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ private static void BuildSpan(BuildContext ctx, in DpConstruct span)
&& span.Binding.SemanticModel.Compilation.GetLanguageVersion() >= LanguageVersion.CSharp7_3;

var createInstance = isStackalloc ? $"stackalloc {createArray}" : $"new {Names.SystemNamespace}Span<{span.Source.ElementType}>(new {createArray})";
ctx.Code.AppendLine($"{ctx.BuildTools.GetDeclaration(variable, isStackalloc)}{variable.VariableName} = {createInstance};");
ctx.Code.AppendLine($"{ctx.BuildTools.GetDeclaration(variable)}{variable.VariableName} = {createInstance};");
ctx.Code.AppendLines(ctx.BuildTools.OnCreated(ctx, variable));
}

Expand Down
4 changes: 2 additions & 2 deletions src/Pure.DI.Core/Core/Code/FactoryCodeBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@ public void Build(BuildContext ctx, in DpFactory factory)
SyntaxNode syntaxNode = lambda.Block is not null ? lambda.Block : SyntaxFactory.ExpressionStatement((ExpressionSyntax)lambda.Body);
if (syntaxNode is not BlockSyntax)
{
code.Append($"{ctx.BuildTools.GetDeclaration(variable, true)}{variable.VariableName} = ");
code.Append($"{ctx.BuildTools.GetDeclaration(variable)}{variable.VariableName} = ");
}
else
{
if (!variable.IsDeclared)
{
code.AppendLine($"{ctx.BuildTools.GetDeclaration(variable, true)}{variable.VariableName};");
code.AppendLine($"{ctx.BuildTools.GetDeclaration(variable)}{variable.VariableName};");
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/Pure.DI.Core/Core/Code/IBuildTools.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ internal interface IBuildTools
{
void AddPureHeader(LinesBuilder code);

string GetDeclaration(Variable variable, bool typeIsRequired = false);
string GetDeclaration(Variable variable);

string OnInjected(BuildContext ctx, Variable variable);

Expand Down
20 changes: 20 additions & 0 deletions src/Pure.DI.Core/Core/IBindingBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace Pure.DI.Core;

internal interface IBindingBuilder
{
MdDefaultLifetime DefaultLifetime { set; }

MdLifetime Lifetime { set; }

MdImplementation Implementation { set; }

MdFactory Factory { set; }

MdArg Arg { set; }

void AddContract(in MdContract contract);

void AddTag(in MdTag tag);

MdBinding Build(MdSetup setup);
}
6 changes: 3 additions & 3 deletions src/Pure.DI.Core/Core/SetupsBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace Pure.DI.Core;
internal sealed class SetupsBuilder(
Func<IMetadataSyntaxWalker> metadataSyntaxWalkerFactory,
ICache<ImmutableArray<byte>, bool> setupCache,
IBaseSymbolsProvider baseSymbolsProvider)
Func<IBindingBuilder> bindingBuilderFactory)
: IBuilder<SyntaxUpdate, IEnumerable<MdSetup>>, IMetadataVisitor
{
private readonly List<MdSetup> _setups = [];
Expand All @@ -15,7 +15,7 @@ internal sealed class SetupsBuilder(
private readonly List<MdTagAttribute> _tagAttributes = [];
private readonly List<MdOrdinalAttribute> _ordinalAttributes = [];
private readonly List<MdUsingDirectives> _usingDirectives = [];
private BindingBuilder _bindingBuilder = new(baseSymbolsProvider);
private IBindingBuilder _bindingBuilder = bindingBuilderFactory();
private MdSetup? _setup;

public IEnumerable<MdSetup> Build(SyntaxUpdate update)
Expand Down Expand Up @@ -127,6 +127,6 @@ setup with
_ordinalAttributes.Clear();
_usingDirectives.Clear();
_setup = default;
_bindingBuilder = new BindingBuilder(baseSymbolsProvider);
_bindingBuilder = bindingBuilderFactory();
}
}
8 changes: 8 additions & 0 deletions src/Pure.DI.Core/Core/UniqueTag.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// ReSharper disable NotAccessedPositionalProperty.Global
namespace Pure.DI.Core;

internal record UniqueTag(int Id)
{
public override string ToString() =>
$"Unique tag {Id}";
}
2 changes: 2 additions & 0 deletions src/Pure.DI.Core/Generator.Composition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ private static void Setup() => DI.Setup(nameof(Generator))
.Bind().To<DependencyGraphBuilder>()
.Bind().To<TypeConstructor>()
.Bind<IEqualityComparer<string>>().To(_ => StringComparer.InvariantCultureIgnoreCase)
.Bind().To<BindingBuilder>()

// Singleton
.DefaultLifetime(Singleton)
Expand Down Expand Up @@ -118,5 +119,6 @@ private static void Setup() => DI.Setup(nameof(Generator))
.Bind().To<TypeResolver>()
.Bind().To<LogObserver>()
.Bind().To<Filter>()
.Bind("UniqueTags").To<IdGenerator>()
.Bind().To<IdGenerator>();
}

0 comments on commit 2c3609c

Please sign in to comment.