protected override CakeMethodAliasGenerator CreateGenerator()
        {
            var typeEmitter      = new TypeEmitter();
            var parameterEmitter = new ParameterEmitter(typeEmitter);

            return(new CakeMethodAliasGenerator(typeEmitter, parameterEmitter));
        }
Example #2
0
        public CakeScriptGenerator(
            IBufferedFileSystem fileSystem,
            ICakeEnvironment environment,
            IGlobber globber,
            ICakeConfiguration configuration,
            IScriptProcessor processor,
            IScriptAliasFinder aliasFinder,
            ICakeLog log,
            IEnumerable <ILoadDirectiveProvider> loadDirectiveProviders = null)
        {
            _fileSystem    = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
            _environment   = environment ?? throw new ArgumentNullException(nameof(environment));
            _globber       = globber ?? throw new ArgumentNullException(nameof(globber));
            _log           = log ?? throw new ArgumentNullException(nameof(log));
            _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
            _processor     = processor ?? throw new ArgumentNullException(nameof(processor));
            _aliasFinder   = aliasFinder ?? throw new ArgumentNullException(nameof(fileSystem));

            _analyzer = new ScriptAnalyzer(_fileSystem, _environment, _log, loadDirectiveProviders);

            var typeEmitter      = new TypeEmitter();
            var parameterEmitter = new ParameterEmitter(typeEmitter);

            _methodGenerator   = new CakeMethodAliasGenerator(typeEmitter, parameterEmitter);
            _propertyGenerator = new CakePropertyAliasGenerator(typeEmitter);
        }
Example #3
0
        public CakeAliasGenerator()
        {
            var typeEmitter      = new TypeEmitter();
            var parameterEmitter = new ParameterEmitter(typeEmitter);

            _methodGenerator   = new CakeMethodAliasGenerator(typeEmitter, parameterEmitter);
            _propertyGenerator = new CakePropertyAliasGenerator(typeEmitter);
        }
        public void Should_Return_Correct_Generated_Code_For_Method_Parameters(string methodName, string expected)
        {
            // Given
            var method    = typeof(ParameterFixture).GetMethod(methodName, BindingFlags.Static | BindingFlags.Public);
            var parameter = method.GetParameters().FirstOrDefault();

            // When
            var result = ParameterEmitter.Emit(parameter, true);

            // Then
            Assert.Equal(expected, result);
        }
Example #5
0
 public CakeMethodAliasGenerator(TypeEmitter typeEmitter, ParameterEmitter parameterEmitter)
 {
     _typeEmitter      = typeEmitter ?? throw new ArgumentNullException(nameof(typeEmitter));
     _parameterEmitter = parameterEmitter ?? throw new ArgumentNullException(nameof(parameterEmitter));
 }
        private ServiceDescriptor ResolveIsClass()
        {
            string name = string.Concat(serviceType.Name, "Proxy");

            var interfaces = implementationType.GetInterfaces();

            var classEmitter = moduleEmitter.DefineType(name, TypeAttributes.Public | TypeAttributes.Class, implementationType, interfaces);

            foreach (var constructorInfo in implementationType.GetConstructors(BindingFlags.Public | BindingFlags.Instance))
            {
                var constructorEmitter = classEmitter.DefineConstructor(constructorInfo.Attributes);

                var parameterInfos   = constructorInfo.GetParameters();
                var parameterEmiters = new ParameterEmitter[parameterInfos.Length];

                for (int i = 0; i < parameterInfos.Length; i++)
                {
                    parameterEmiters[i] = constructorEmitter.DefineParameter(parameterInfos[i]);
                }

                constructorEmitter.InvokeBaseConstructor(constructorInfo, parameterEmiters);
            }

            var interceptMethods = new Dictionary <MethodInfo, IList <CustomAttributeData> >(MethodInfoEqualityComparer.Instance);

            foreach (var type in interfaces)
            {
                bool flag = type.IsDefined(InterceptAttributeType, false);

                var attributes = flag
                    ? type.GetCustomAttributesData()
                    : new CustomAttributeData[0];

                foreach (var methodInfo in type.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly))
                {
                    var interceptAttributes = methodInfo.IsDefined(InterceptAttributeType, false)
                        ? Merge(attributes, methodInfo.GetCustomAttributesData())
                        : attributes;

                    if (interceptAttributes.Count == 0)
                    {
                        continue;
                    }

                    if (interceptMethods.TryGetValue(methodInfo, out var intercepts))
                    {
                        interceptMethods[methodInfo] = Merge(intercepts, interceptAttributes);
                    }
                    else
                    {
                        interceptMethods.Add(methodInfo, interceptAttributes);
                    }
                }
            }

            var iterationType = serviceType;

            do
            {
                if (iterationType.IsDefined(InterceptAttributeType, false))
                {
                    var intercepts = iterationType.GetCustomAttributesData();

                    foreach (var methodInfo in iterationType.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly))
                    {
                        if (interceptMethods.TryGetValue(methodInfo, out var attributes))
                        {
                            interceptMethods[methodInfo] = Merge(intercepts, attributes);
                        }
                        else
                        {
                            interceptMethods.Add(methodInfo, intercepts);
                        }
                    }
                }

                iterationType = iterationType.BaseType;
            } while (iterationType != null && iterationType != typeof(object));

            foreach (var methodInfo in serviceType.GetMethods())
            {
                if (interceptMethods.TryGetValue(methodInfo, out var interceptAttributes))
                {
                    InterceptCore.DefineMethodOverride(This, classEmitter, methodInfo, interceptAttributes);
                }
            }

            interceptMethods.Clear();

            return(new ServiceDescriptor(serviceType, classEmitter.CreateType(), lifetime));
        }