public InstanceProduct Produce() { IMethodProduct?predicateMethod = null; if (_bindingExtender.BindingContainer.IsConditional) { predicateMethod = MethodProductFactory.Create( $"CheckPredicate_{_bindingExtender.BindingContainer.BindToType.Name}_{_bindingExtender.BindingContainer.GetStableSuffix()}", new TypeMethodResult(_typeInfoProvider.Bool()), (methodName, returnType) => $@" {GN.AggressiveInlining} private {returnType} {methodName}({GN.IResolutionTarget} resolutionTarget) {{ global::System.Func<{GN.IResolutionTarget}, bool> predicate = {_bindingExtender.BindingContainer.WhenArgumentClause} ; var result = predicate(resolutionTarget); return result; }} "); } var retrieveObjectMethod = MethodProductFactory.Create( $"GetInstance_{_bindingExtender.BindingContainer.BindToType.Name}_{_bindingExtender.BindingContainer.GetStableSuffix()}", new TypeMethodResult(_bindingExtender.BindingContainer.BindToType), (methodName, returnType) => $@" {GN.AggressiveInlining} private {returnType} {methodName}( {GN.IResolutionTarget} resolutionTarget ) {{ return {_bindingExtender.BindingContainer.ConstantSyntax!.GetText()}; }} "); var funcMethod = MethodProductFactory.Create( $"GetInstance_{_bindingExtender.BindingContainer.BindToType.Name}_{_bindingExtender.BindingContainer.GetStableSuffix()}{DpdtArgumentWrapperTypeEnum.Func.GetPostfix()}", new TypeMethodResult(_typeInfoProvider.Func(_bindingExtender.BindingContainer.BindToType)), (methodName, returnType) => $@" {GN.AggressiveInlining} private {returnType} {methodName}( {GN.IResolutionTarget} resolutionTarget ) {{ return () => {retrieveObjectMethod.GetWrappedMethodName(DpdtArgumentWrapperTypeEnum.None)}(resolutionTarget); }} "); var product = new InstanceProduct( _bindingExtender, predicateMethod, retrieveObjectMethod, funcMethod, null, null ); return(product); }
public static IEnumerable <(DpdtArgumentWrapperTypeEnum, ITypeSymbol)> GenerateWrapperTypes( this ITypeSymbol type, ITypeInfoProvider typeInfoProvider, bool includeNone ) { foreach (DpdtArgumentWrapperTypeEnum wrapperType in Enum.GetValues(typeof(DpdtArgumentWrapperTypeEnum))) { ITypeSymbol wrapperSymbol; switch (wrapperType) { case DpdtArgumentWrapperTypeEnum.None: if (!includeNone) { continue; } wrapperSymbol = type; break; case DpdtArgumentWrapperTypeEnum.Func: wrapperSymbol = typeInfoProvider.Func(type); break; default: throw new ArgumentOutOfRangeException(wrapperType.ToString()); } yield return(wrapperType, wrapperSymbol); } }
public static ITypeSymbol GenerateWrapperTypes( this ITypeSymbol type, ITypeInfoProvider typeInfoProvider, DpdtArgumentWrapperTypeEnum wrapperType ) { ITypeSymbol wrapperSymbol; switch (wrapperType) { case DpdtArgumentWrapperTypeEnum.None: wrapperSymbol = type; break; case DpdtArgumentWrapperTypeEnum.Func: wrapperSymbol = typeInfoProvider.Func(type); break; default: throw new ArgumentOutOfRangeException(wrapperType.ToString()); } return(wrapperSymbol); }
public InstanceProduct Produce() { var constructorArgumentProducers = _bindingExtender.BindingContainer.ConstructorArguments.ConvertAll( bft => new ConstructorArgumentProducer( _clusterBindings, _bindingExtender, bft ) ); var constructorArgumentProducts = constructorArgumentProducers .ConvertAll(p => p.Produce()) .FindAll(s => !ReferenceEquals(s, ConstructorArgumentProduct.Empty)) ; MethodProduct?predicateMethod = null; if (_bindingExtender.BindingContainer.IsConditional) { predicateMethod = new MethodProduct( $"CheckPredicate_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _typeInfoProvider.Bool(), (methodName, returnType) => $@" [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}(IResolutionTarget resolutionTarget) {{ Func<IResolutionTarget, bool> predicate = {_bindingExtender.BindingContainer.WhenArgumentClause} ; var result = predicate(resolutionTarget); return result; }} "); } var singletonInstanceName = $"_singletonInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}"; var lockerName = $"_locker_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}"; var retrieveObjectMethod = new MethodProduct( $"GetInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _bindingExtender.BindingContainer.BindToType, (methodName, returnType) => $@" private volatile {_bindingExtender.BindingContainer.BindToType.ToDisplayString()} {singletonInstanceName} = null; private readonly System.Object {lockerName} = new System.Object(); [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}( IResolutionTarget resolutionTarget ) {{ if({singletonInstanceName} is null) {{ lock({lockerName}) {{ if({singletonInstanceName} is null) {{ {singletonInstanceName} = new {_bindingExtender.BindingContainer.BindToType.ToDisplayString()}( {constructorArgumentProducts.Join(p => p.ResolveConstructorArgumentClause, ",")} ); }} }} }} return {singletonInstanceName}; }} "); var funcMethod = new MethodProduct( $"GetInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}{DpdtArgumentWrapperTypeEnum.Func.GetPostfix()}", _typeInfoProvider.Func(_bindingExtender.BindingContainer.BindToType), (methodName, returnType) => $@" [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}( IResolutionTarget resolutionTarget ) {{ return () => {retrieveObjectMethod.GetMethodName(DpdtArgumentWrapperTypeEnum.None)}(resolutionTarget); }} "); var disposeMethodInvoke = new MethodProduct( $"DisposeInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _typeInfoProvider.Void(), (methodName, returnType) => $@" private {returnType.ToDisplayString()} {methodName}( ) {{ if({singletonInstanceName} is {nameof(IDisposable)} d) {{ d.{nameof(IDisposable.Dispose)}(); }} }} "); var product = new InstanceProduct( _bindingExtender, predicateMethod, retrieveObjectMethod, funcMethod, disposeMethodInvoke ); return(product); }
public InstanceProduct Produce() { var constructorArgumentProducers = _bindingExtender.BindingContainer.ConstructorArguments.ConvertAll( bft => new ConstructorArgumentProducer( _clusterBindings, _bindingExtender, bft ) ); var constructorArgumentProducts = constructorArgumentProducers .ConvertAll(p => p.Produce()) .FindAll(s => !ReferenceEquals(s, ConstructorArgumentProduct.Empty)) ; MethodProduct?predicateMethod = null; if (_bindingExtender.BindingContainer.IsConditional) { predicateMethod = new MethodProduct( $"CheckPredicate_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _typeInfoProvider.Bool(), (methodName, returnType) => $@" [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}(IResolutionTarget resolutionTarget) {{ Func<IResolutionTarget, bool> predicate = {_bindingExtender.BindingContainer.WhenArgumentClause} ; var result = predicate(resolutionTarget); return result; }} "); } var constantInstanceName = $"_constantInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}"; var retrieveObjectMethod = new MethodProduct( $"GetInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _bindingExtender.BindingContainer.BindToType, (methodName, returnType) => $@" private readonly {_bindingExtender.BindingContainer.BindToType.ToDisplayString()} {constantInstanceName} = {_bindingExtender.BindingContainer.ConstantSyntax!.GetText()}; [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}( IResolutionTarget resolutionTarget ) {{ return {constantInstanceName}; }} "); var funcMethod = new MethodProduct( $"GetInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}{DpdtArgumentWrapperTypeEnum.Func.GetPostfix()}", _typeInfoProvider.Func(_bindingExtender.BindingContainer.BindToType), (methodName, returnType) => $@" [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}( IResolutionTarget resolutionTarget ) {{ return () => {retrieveObjectMethod.GetMethodName(DpdtArgumentWrapperTypeEnum.None)}(resolutionTarget); }} "); var product = new InstanceProduct( _bindingExtender, predicateMethod, retrieveObjectMethod, funcMethod, null ); return(product); }
public InstanceProduct Produce() { var constructorArgumentProducers = _bindingExtender.BindingContainer.ConstructorArguments.ConvertAll( bft => new ConstructorArgumentProducer( _clusterBindings, _bindingExtender, bft ) ); var constructorArgumentProducts = constructorArgumentProducers .ConvertAll(p => p.Produce()) .FindAll(s => !ReferenceEquals(s, ConstructorArgumentProduct.Empty)) ; MethodProduct?predicateMethod = null; if (_bindingExtender.BindingContainer.IsConditional) { predicateMethod = new MethodProduct( $"CheckPredicate_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _typeInfoProvider.Bool(), (methodName, returnType) => $@" [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}(IResolutionTarget resolutionTarget) {{ Func<IResolutionTarget, bool> predicate = {_bindingExtender.BindingContainer.WhenArgumentClause} ; var result = predicate(resolutionTarget); return result; }} "); } var scopeGuidName = $"_customScopeUniqueId_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}"; var retrieveObjectMethod = new MethodProduct( $"GetInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}", _bindingExtender.BindingContainer.BindToType, (methodName, returnType) => $@" private readonly System.Guid {scopeGuidName} = new System.Guid(""{Guid.NewGuid()}""); [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}( IResolutionTarget resolutionTarget ) {{ if(resolutionTarget.ScopeObject is null) {{ RaiseNoCustomScopeObject<{_bindingExtender.BindingContainer.BindToType.ToDisplayString()}>(); }} var result = ({_bindingExtender.BindingContainer.BindToType.ToDisplayString()}) resolutionTarget.ScopeObject.GetOrAdd( {scopeGuidName}, () => new {_bindingExtender.BindingContainer.BindToType.ToDisplayString()}( {constructorArgumentProducts.Join(p => p.ResolveConstructorArgumentClause, ",")} ) ); return result; }} "); var funcMethod = new MethodProduct( $"GetInstance_{_bindingExtender.BindingContainer.GetStableSuffix()}_{ _bindingExtender.BindingContainer.BindToType.ToDisplayString().EscapeSpecialTypeSymbols()}{DpdtArgumentWrapperTypeEnum.Func.GetPostfix()}", _typeInfoProvider.Func(_bindingExtender.BindingContainer.BindToType), (methodName, returnType) => $@" [MethodImpl(MethodImplOptions.AggressiveInlining)] private {returnType.ToDisplayString()} {methodName}( IResolutionTarget resolutionTarget ) {{ return () => {retrieveObjectMethod.GetMethodName(DpdtArgumentWrapperTypeEnum.None)}(resolutionTarget); }} "); var product = new InstanceProduct( _bindingExtender, predicateMethod, retrieveObjectMethod, funcMethod, null ); return(product); }
public InstanceProduct Produce() { var constructorArgumentProducers = _bindingExtender.BindingContainer.ConstructorArguments.ConvertToProducers( _clusterBindings, _bindingExtender ); var(caps, utps) = constructorArgumentProducers.Produce(); IMethodProduct?predicateMethod = null; if (_bindingExtender.BindingContainer.IsConditional) { predicateMethod = MethodProductFactory.Create( $"CheckPredicate_{_bindingExtender.BindingContainer.BindToType.Name}_{_bindingExtender.BindingContainer.GetStableSuffix()}", new TypeMethodResult(_typeInfoProvider.Bool()), (methodName, returnType) => $@" {GN.AggressiveInlining} private {returnType} {methodName}({GN.IResolutionTarget} resolutionTarget) {{ global::System.Func<{GN.IResolutionTarget}, bool> predicate = {_bindingExtender.BindingContainer.WhenArgumentClause} ; var result = predicate(resolutionTarget); return result; }} "); } var retrieveObjectMethod = MethodProductFactory.Create( $"GetInstance_{_bindingExtender.BindingContainer.BindToType.Name}_{_bindingExtender.BindingContainer.GetStableSuffix()}", new TypeMethodResult(_bindingExtender.BindingContainer.BindToType), (methodName, returnType) => $@" {GN.AggressiveInlining} private {returnType} {methodName}( {GN.IResolutionTarget} resolutionTarget ) {{ return new {_bindingExtender.BindingContainer.BindToType.ToGlobalDisplayString()}( {caps.Join(p => p.ResolveConstructorArgumentClause, ",")} ); }} "); var funcMethod = MethodProductFactory.Create( $"GetInstance_{_bindingExtender.BindingContainer.BindToType.Name}_{_bindingExtender.BindingContainer.GetStableSuffix()}{DpdtArgumentWrapperTypeEnum.Func.GetPostfix()}", new TypeMethodResult(_typeInfoProvider.Func(_bindingExtender.BindingContainer.BindToType)), (methodName, returnType) => $@" {GN.AggressiveInlining} private {returnType} {methodName}( {GN.IResolutionTarget} resolutionTarget ) {{ return () => {retrieveObjectMethod.GetWrappedMethodName(DpdtArgumentWrapperTypeEnum.None)}(resolutionTarget); }} "); var product = new InstanceProduct( _bindingExtender, predicateMethod, retrieveObjectMethod, funcMethod, null, utps ); return(product); }
public InstanceProduct Produce() { var constructorArgumentProducers = _bindingExtender.BindingContainer.ConstructorArguments.ConvertToProducers( _clusterBindings, _bindingExtender ); var(caps, utps) = constructorArgumentProducers.Produce(); IMethodProduct?predicateMethod = null; if (_bindingExtender.BindingContainer.IsConditional) { predicateMethod = MethodProductFactory.Create( $"CheckPredicate_{_bindingExtender.BindingContainer.BindToType.Name}_{_bindingExtender.BindingContainer.GetStableSuffix()}", new TypeMethodResult(_typeInfoProvider.Bool()), (methodName, returnType) => $@" {GN.AggressiveInlining} private {returnType} {methodName}({GN.IResolutionTarget} resolutionTarget) {{ global::System.Func<{GN.IResolutionTarget}, bool> predicate = {_bindingExtender.BindingContainer.WhenArgumentClause} ; var result = predicate(resolutionTarget); return result; }} "); } var singletonInstanceName = $"_singletonInstance__{_bindingExtender.BindingContainer.BindToType.Name}__{_bindingExtender.BindingContainer.GetStableSuffix()}"; var lockerName = $"_locker_{_bindingExtender.BindingContainer.BindToType.Name}_{_bindingExtender.BindingContainer.GetStableSuffix()}"; var retrieveObjectMethod = MethodProductFactory.Create( $"GetInstance_{_bindingExtender.BindingContainer.BindToType.Name}_{_bindingExtender.BindingContainer.GetStableSuffix()}", new TypeMethodResult(_bindingExtender.BindingContainer.BindToType), (methodName, returnType) => $@" private volatile {_bindingExtender.BindingContainer.BindToType.ToGlobalDisplayString()} {singletonInstanceName} = null; private readonly global::System.Object {lockerName} = new global::System.Object(); {GN.AggressiveInlining} private {returnType} {methodName}( {GN.IResolutionTarget} resolutionTarget ) {{ if({singletonInstanceName} is null) {{ lock({lockerName}) {{ if({singletonInstanceName} is null) {{ {singletonInstanceName} = new {_bindingExtender.BindingContainer.BindToType.ToGlobalDisplayString()}( {caps.Join(p => p.ResolveConstructorArgumentClause, ",")} ); }} }} }} return {singletonInstanceName}; }} "); var funcMethod = MethodProductFactory.Create( $"GetInstance_{ _bindingExtender.BindingContainer.BindToType.Name}_{_bindingExtender.BindingContainer.GetStableSuffix()}{DpdtArgumentWrapperTypeEnum.Func.GetPostfix()}", new TypeMethodResult(_typeInfoProvider.Func(_bindingExtender.BindingContainer.BindToType)), (methodName, returnType) => $@" {GN.AggressiveInlining} private {returnType} {methodName}( {GN.IResolutionTarget} resolutionTarget ) {{ return () => {retrieveObjectMethod.GetWrappedMethodName(DpdtArgumentWrapperTypeEnum.None)}(resolutionTarget); }} "); var disposeMethodInvoke = MethodProductFactory.Create( $"DisposeInstance_{_bindingExtender.BindingContainer.BindToType.Name}_{_bindingExtender.BindingContainer.GetStableSuffix()}", new TypeMethodResult(_typeInfoProvider.Void()), (methodName, returnType) => $@" private {returnType} {methodName}( ) {{ if({singletonInstanceName} is {GN.IDisposable} d) {{ d.{nameof(IDisposable.Dispose)}(); }} }} "); var product = new InstanceProduct( _bindingExtender, predicateMethod, retrieveObjectMethod, funcMethod, disposeMethodInvoke, utps ); return(product); }