Exemple #1
0
 public CodeGenerator(INameMangler nameMangler, ILogger <CodeGenerator> logger, ICodeGeneratorFactory codeGeneratorFactory, IConfiguration configuration)
 {
     _nameMangler          = nameMangler;
     _logger               = logger;
     _codeGeneratorFactory = codeGeneratorFactory;
     _configuration        = configuration;
 }
Exemple #2
0
        private void InvokeGenerator(GeneratorContext context, ICodeGeneratorFactory factory, ClassDeclarationSyntax node)
        {
            var generatedCount = 0;

            CompilationUnit unit = default;

            foreach (var generator in factory.GetGenerators())
            {
                context.CancellationToken.ThrowIfCancellationRequested();

                if (_generatorCache.AddNew(node, generator.GetGeneratedMemberName()))
                {
                    if (generatedCount == 0)
                    {
                        unit = new CompilationUnit(node);
                    }
                    else
                    {
                        unit.Output.AppendLine();
                    }

                    generator.GenerateMemberDeclaration(unit.Output);

                    generatedCount++;
                }
            }

            context.CancellationToken.ThrowIfCancellationRequested();
            if (generatedCount > 0)
            {
                var source = unit.GetSourceText();
                context.AddOutput(node, factory.GetHintName(), source);
            }
        }
 public InterceptableProxyFactoryCache(
     ICodeGeneratorFactory codeGeneratorFactory,
     IInterceptorResolver interceptorResolver)
 {
     _codeGeneratorFactory = codeGeneratorFactory;
     _interceptorResolver  = interceptorResolver;
     _instanceFactories    = new Dictionary <Tuple <Type, Type>, Func <object, object> >();
     _typeFactories        = new Dictionary <Type, Func <IServiceProvider, object> >();
 }
 public ServiceDescriptorConverter(
     Type serviceType,
     Type implementationType,
     ServiceLifetime lifetime,
     IInterceptorResolver interceptorResolver,
     IInterceptableProxyFactoryCache factoryCache,
     ICodeGeneratorFactory codeGeneratorFactory)
     : this(new ServiceDescriptor(serviceType, implementationType, lifetime), interceptorResolver, factoryCache, codeGeneratorFactory)
 {
 }
Exemple #5
0
 /// <summary>
 /// Create a new <see cref="GenericInterceptableServiceDescriptor"/>.
 /// </summary>
 /// <param name="codeGeneratorFactory">The <see cref="ICodeGeneratorFactory"/> used to get <see cref="ICodeGenerator"/>.</param>
 /// <param name="interceptorResolver">The <see cref="IInterceptorResolver"/> used to resolve registered interceptors.</param>
 /// <param name="serviceType">The service type.</param>
 /// <param name="implementationType">The <see cref="Type"/> service implements.</param>
 /// <param name="lifetime">The <see cref="ServiceLifetime"/> of the service registration.</param>
 public GenericInterceptableServiceDescriptor(
     ICodeGeneratorFactory codeGeneratorFactory,
     IInterceptorResolver interceptorResolver,
     Type serviceType, Type implementationType, ServiceLifetime lifetime)
     : base(serviceType, GetInterceptableProxyType(codeGeneratorFactory, interceptorResolver, serviceType, implementationType), lifetime)
 {
     if (!serviceType.IsGenericTypeDefinition)
     {
         throw new ArgumentException("Non-open-generic type (generic type definition) is not support", nameof(serviceType));
     }
     _targetType = implementationType;
 }
        public void GenerateCode(CodeObject codeObject, ICodeGeneratorFactory factory)
        {
            var ns     = (NamespaceDeclaration)codeObject;
            var writer = factory.Writer;

            writer.Indention().Write(CSharpKeyword.Namespace).Space().Write(ns.Name)
            .BlockStart().IncreaseIndention();

            ns.Types.ForEach(t => factory.GetCodeGenerator(t).GenerateCode(t, factory));

            writer.DecreaseIndention().BlockEnd();
        }
Exemple #7
0
        private void InvokeGenerator(
            GeneratorContext context,
            ICodeGeneratorFactory factory,
            ClassDeclarationSyntax node,
            Logger logger)
        {
            if (!factory.Validate(logger))
            {
                return;
            }

            var contract = new ContractDescription(factory.ServiceType);

            ShowWarnings(logger, contract, factory.ServiceType);

            var unit = new CompilationUnit(node);

            var generatedCount = 0;
            var imports        = new HashSet <string>(StringComparer.Ordinal);

            foreach (var generator in factory.GetGenerators(contract, node).Concat(GetSharedGenerators(contract)))
            {
                context.CancellationToken.ThrowIfCancellationRequested();

                if (_generatorCache.AddNew(node, generator.GetGeneratedMemberName()))
                {
                    if (generatedCount > 0)
                    {
                        unit.Output.AppendLine();
                    }

                    generator.GenerateMemberDeclaration(unit.Output);

                    foreach (var i in generator.GetUsing())
                    {
                        imports.Add(i);
                    }

                    generatedCount++;
                }
            }

            context.CancellationToken.ThrowIfCancellationRequested();
            if (generatedCount > 0)
            {
                var source = unit.GetSourceText(GetSharedUsing().Concat(imports));
                context.AddOutput(node, factory.GetHintName(contract), source);
            }
        }
Exemple #8
0
        private static Type GetInterceptableProxyType(
            ICodeGeneratorFactory codeGeneratorFactory,
            IInterceptorResolver interceptorResolver,
            Type serviceType,
            Type implementationType)
        {
            var interceptors = serviceType.IsInterface
                ? interceptorResolver.GetInterceptors(serviceType, implementationType)
                : interceptorResolver.GetInterceptors(implementationType);
            var codeGenerator = codeGeneratorFactory.Create();
            var context       = new CodeGenerationContext(serviceType, implementationType, interceptors);
            var proxyType     = codeGenerator.GenerateInterceptableProxyClass(context);

            return(proxyType);
        }
Exemple #9
0
        private static bool TryResolveFactory(AttributeData attribute, out ICodeGeneratorFactory factory)
        {
            if (CSharpClientCodeGeneratorFactory.Math(attribute))
            {
                factory = new CSharpClientCodeGeneratorFactory(attribute);
                return(true);
            }

            if (CSharpServiceCodeGeneratorFactory.Math(attribute))
            {
                factory = new CSharpServiceCodeGeneratorFactory(attribute);
                return(true);
            }

            factory = null !;
            return(false);
        }
        public void GenerateCode(CodeObject codeObject, ICodeGeneratorFactory factory)
        {
            var writer           = factory.Writer;
            var classDeclaration = codeObject as ClassDeclaration;

            writer.Indention()
            .Scope(classDeclaration.Scope)
            .Space()
            .Write(CSharpKeyword.Class)
            .Space()
            .Write(classDeclaration.Name);

            writer.LineEnd().BlockStart().IncreaseIndention();

            bool isFirst = true;

            foreach (var property in classDeclaration.Properties)
            {
                if (!isFirst)
                {
                    writer.LineEnd();
                }

                writer.Indention()
                .Scope(property.Scope)
                .Space();
                _typeReferenceWriter.Write(writer, property.Type, property.Nullable);

                writer.Space().Write(property.Name);
                writer.Space().BlockStart(true);
                writer.Space().Write(CSharpKeyword.Get).StatementIdentifier();
                if (!property.ReadOnly)
                {
                    writer.Space().Write(CSharpKeyword.Set).StatementIdentifier();
                }
                writer.Space().BlockEnd(true);

                isFirst = false;
            }

            writer.DecreaseIndention();
            writer.BlockEnd();
        }
Exemple #11
0
        public void GenerateCode(CodeObject codeObject, ICodeGeneratorFactory factory)
        {
            var writer = factory.Writer;
            var enumerationDeclaration = codeObject as EnumerationDeclaration;

            writer.Indention()
            .Scope(enumerationDeclaration.Scope)
            .Space()
            .Write(CSharpKeyword.Enum)
            .Space()
            .Write(enumerationDeclaration.Name)
            .LineEnd()
            .BlockStart()
            .IncreaseIndention();

            var isFirst = true;

            foreach (var member in enumerationDeclaration.Values)
            {
                if (!isFirst)
                {
                    writer.Write(",");
                    writer.LineEnd();
                }

                writer.Indention().Write(member.Name);
                if (member.Value.HasValue)
                {
                    writer.Write(CSharpOperator.Assignment)
                    .Space()
                    .Write(member.Value.Value.ToString());
                }

                isFirst = false;
            }
            writer.DecreaseIndention()
            .BlockEnd();
        }
        private static IServiceCollection AddInterceptableCore(this IServiceCollection services, Type serviceType, Type implementationType, ServiceLifetime lifetime, AddKind kind)
        {
            Guard.ArgumentNotNull(services, nameof(services));
            Guard.ArgumentNotNull(serviceType, nameof(serviceType));
            Guard.ArgumentNotNull(implementationType, nameof(implementationType));

            if (serviceType.IsGenericTypeDefinition)
            {
                if (!services.Any(it => it.ServiceType == typeof(ICodeGeneratorFactory)))
                {
                    throw new InvalidOperationException("IServiceCollection's AddInterception method must be called before register open generic service type.");
                }
                if (_codeGeneratorFactory == null)
                {
                    var provider = services.BuildServiceProvider();
                    _codeGeneratorFactory = provider.GetRequiredService <ICodeGeneratorFactory>();
                    _interceptorResolver  = provider.GetRequiredService <IInterceptorResolver>();
                }
                if (serviceType != implementationType)
                {
                    services.AddTransient(implementationType, implementationType);
                }
            }
            switch (kind)
            {
            case AddKind.AlwaysAdd:
            {
                if (serviceType.IsGenericTypeDefinition)
                {
                    services.Add(new GenericInterceptableServiceDescriptor(_codeGeneratorFactory, _interceptorResolver, serviceType, implementationType, lifetime));
                }
                else
                {
                    services.Add(new InterceptableServiceDescriptor(serviceType, implementationType, lifetime));
                }
                break;
            }

            case AddKind.TryAdd:
            {
                if (serviceType.IsGenericTypeDefinition)
                {
                    services.TryAdd(new GenericInterceptableServiceDescriptor(_codeGeneratorFactory, _interceptorResolver, serviceType, implementationType, lifetime));
                }
                else
                {
                    services.TryAdd(new InterceptableServiceDescriptor(serviceType, implementationType, lifetime));
                }
                break;
            }

            case AddKind.TryAddEnumerable:
            {
                if (!services.OfType <IInterceptableServiceDescriptor>().Any(it => it.TargetType == implementationType))
                {
                    if (serviceType.IsGenericTypeDefinition)
                    {
                        services.TryAddEnumerable(new GenericInterceptableServiceDescriptor(_codeGeneratorFactory, _interceptorResolver, serviceType, implementationType, lifetime));
                    }
                    else
                    {
                        services.TryAddEnumerable(new InterceptableServiceDescriptor(serviceType, implementationType, lifetime));
                    }
                }
                break;
            }
            }
            return(services);
        }
        public void GenerateCode(CodeObject codeObject, ICodeGeneratorFactory factory)
        {
            var compileUnit = (CompileUnit)codeObject;

            compileUnit.Namespaces?.ForEach(ns => factory.GetCodeGenerator(ns).GenerateCode(ns, factory));
        }
 public bool Equals(ICodeGeneratorFactory <EnumSourceGeneratorState>?obj)
 {
     return(obj is NewtonsoftJsonSmartEnumCodeGeneratorFactory);
 }
Exemple #15
0
 public bool Equals(ICodeGeneratorFactory <EnumSourceGeneratorState>?obj)
 {
     return(obj is MessagePackSmartEnumCodeGeneratorFactory);
 }
Exemple #16
0
 public bool Equals(ICodeGeneratorFactory <ValueObjectSourceGeneratorState>?obj)
 {
     return(obj is ValueObjectCodeGeneratorFactory);
 }
        public ServiceDescriptorConverter(
            ServiceDescriptor serviceDescriptor,
            IInterceptorResolver interceptorResolver,
            IInterceptableProxyFactoryCache factoryCache,
            ICodeGeneratorFactory codeGeneratorFactory)
        {
            Guard.ArgumentNotNull(serviceDescriptor, nameof(serviceDescriptor));
            Guard.ArgumentNotNull(interceptorResolver, nameof(interceptorResolver));
            Guard.ArgumentNotNull(factoryCache, nameof(factoryCache));

            if (serviceDescriptor.ImplementationInstance != null || serviceDescriptor.ImplementationFactory != null || serviceDescriptor.IsInterceptable())
            {
                _primaryDescriptor = serviceDescriptor;
                return;
            }
            var serviceType        = serviceDescriptor.ServiceType;
            var implementationType = serviceDescriptor.ImplementationType;
            var lifetime           = serviceDescriptor.Lifetime;

            if (serviceType.IsInterface)
            {
                var interceptors = interceptorResolver.GetInterceptors(serviceType, implementationType);
                if (interceptors.IsEmpty)
                {
                    _primaryDescriptor = new ServiceDescriptor(serviceType, implementationType, lifetime);
                }
                else if (serviceType.IsGenericTypeDefinition)
                {
                    _secondaryDescriptor = new ServiceDescriptor(implementationType, implementationType, lifetime);
                    var codeGenerator = codeGeneratorFactory.Create();
                    var context       = new CodeGenerationContext(serviceType, implementationType, interceptors);
                    var proxyType     = codeGenerator.GenerateInterceptableProxyClass(context);
                    _primaryDescriptor = new ServiceDescriptor(serviceType, proxyType, lifetime);
                }
                else
                {
                    _primaryDescriptor = new ServiceDescriptor(serviceType, CreateOrGet, lifetime);
                    object CreateOrGet(IServiceProvider serviceProvider)
                    {
                        var target = ActivatorUtilities.CreateInstance(serviceProvider, implementationType);

                        return(factoryCache.GetInstanceFactory(serviceType, implementationType).Invoke(target));
                    }
                }
            }
            else
            {
                var interceptors = interceptorResolver.GetInterceptors(implementationType);
                if (interceptors.IsEmpty)
                {
                    _primaryDescriptor = new ServiceDescriptor(serviceType, implementationType, lifetime);
                }
                else
                {
                    var codeGenerator = codeGeneratorFactory.Create();
                    var context       = new CodeGenerationContext(implementationType, interceptors);
                    var proxyType     = codeGenerator.GenerateInterceptableProxyClass(context);
                    _primaryDescriptor = new ServiceDescriptor(serviceType, proxyType, lifetime);
                }
            }
        }