public object Parse(ITypeBuilderRegistry registry, ITypeBuilder builder, object instanceState)
        {
            SkipWhitespace();

            var c = Peek();
            switch (c)
            {
                case '{':
                    return ParseObject(registry, builder, instanceState);
                case '[':
                    return ParserArray(registry, builder, instanceState);
                case '\"':
                    return ParseString(registry, builder);
                case 't':
                    return ParseTrue(registry, builder);
                case 'f':
                    return ParseFalse(registry, builder);
                case 'n':
                    return ParseNull(registry, builder);
                default:
                    if (char.IsDigit((char) c) || (c == '-'))
                    {
                        return ParseNumber(registry, builder);
                    }
                    break;
            }
            throw CreateException("Expected Json at ({1},{2})", c, Line, Column);
        }
Exemple #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Poster"/> class.
 /// </summary>
 /// <param name="httpClientFactory">Http client factory.</param>
 /// <param name="contentSerializer">Content serializer.</param>
 /// <param name="httpClient">Http client.</param>
 internal Poster(
     IHttpClientFactory httpClientFactory,
     IContentSerializer contentSerializer,
     IHttpClient?httpClient = null)
 {
     _typeBuilder = new MockDynamicTypeBuilder(httpClientFactory, contentSerializer, httpClient);
 }
Exemple #3
0
        private IReadOnlyList <StatementSyntaxNode> GenerateClassFields(ITypeBuilder type, IReadOnlyList <FieldSyntaxNode> fields, CodeGenerationStore store,
                                                                        ISyntaxNode syntaxNode)
        {
            var definedFields   = new List <IFieldInfo>();
            var initExpressions = new List <StatementSyntaxNode>();

            store.Fields.Add(type, definedFields);
            foreach (var field in fields)
            {
                var fieldType = store.TypeDefLookup(field.Type);

                typeChecker !.AssertTypeIsNotVoid(fieldType);

                var definedField = type.DefineField(field.Name, fieldType, FieldAttributes.Public);
                definedFields.Add(definedField);
                if (field.Expression != null)
                {
                    initExpressions.Add(new ExpressionEqualsExpressionSyntaxNode(field, new VariableSyntaxNode(field, field.Name), field.Expression));
                }
            }

            initExpressions.Add(new BaseClassConstructorSyntax(syntaxNode));

            return(initExpressions);
        }
Exemple #4
0
        /// <summary>
        /// Adds a constructor to the mixin type.
        /// </summary>
        /// <param name="typeBuilder">The <see cref="TypeBuilder"/> use to construct the type.</param>
        /// <param name="mixinType">The mixin <see cref="Type"/> being created.</param>
        /// <param name="baseTypesField">The <see cref="FieldBuilder"/> which will hold the instances of the base types.</param>
        /// <param name="serviceProviderField">The <see cref="FieldBuilder"/> which will hold the instance of the dependency injection resolver.</param>
        private void EmitConstructor(
            ITypeBuilder typeBuilder,
            Type mixinType,
            IFieldBuilder baseTypesField,
            IFieldBuilder serviceProviderField)
        {
            var constructorBuilder = typeBuilder
                                     .NewConstructor()
                                     .Public()
                                     .HideBySig()
                                     .SpecialName()
                                     .RTSpecialName()
                                     .CallingConvention(CallingConventions.HasThis)
                                     .Param <object[]>("instances")
                                     .Param <IServiceProvider>("serviceProvider");

            constructorBuilder
            .Body()
            .LdArg0()
            .LdArg1()
            .StFld(baseTypesField)
            .LdArg0()
            .LdArg2()
            .StFld(serviceProviderField)
            .Ret();
        }
Exemple #5
0
        public virtual void SetUp()
        {
            _mockRepository = new MockRepository();

            _mutableType = MutableTypeObjectMother.Create();
            _nestedTypeCodeGeneratorFactoryMock = _mockRepository.StrictMock <IMutableNestedTypeCodeGeneratorFactory>();
            _codeGeneratorMock             = _mockRepository.StrictMock <IReflectionEmitCodeGenerator>();
            _emittableOperandProviderMock  = _mockRepository.StrictMock <IEmittableOperandProvider> ();
            _memberEmitterMock             = _mockRepository.StrictMock <IMemberEmitter>();
            _initializationBuilderMock     = _mockRepository.StrictMock <IInitializationBuilder>();
            _proxySerializationEnablerMock = _mockRepository.StrictMock <IProxySerializationEnabler>();

            _generator = new MutableTypeCodeGenerator(
                _mutableType,
                _nestedTypeCodeGeneratorFactoryMock,
                _codeGeneratorMock,
                _emittableOperandProviderMock,
                _memberEmitterMock,
                _initializationBuilderMock,
                _proxySerializationEnablerMock);

            _typeBuilderMock        = _mockRepository.StrictMock <ITypeBuilder>();
            _debugInfoGeneratorMock = _mockRepository.StrictMock <DebugInfoGenerator>();

            _fakeInitializationField   = ReflectionObjectMother.GetSomeField();
            _fakeInitializationMethod  = ReflectionObjectMother.GetSomeMethod();
            _fakeInitializationMembers = Tuple.Create(_fakeInitializationField, _fakeInitializationMethod);
        }
Exemple #6
0
        /// <summary>
        /// Adds a constructor to the mixin type.
        /// </summary>
        /// <param name="typeBuilder">The <see cref="TypeBuilder"/> use to construct the type.</param>
        /// <param name="baseType">The base <see cref="Type"/> being ducked.</param>
        /// <param name="baseTypeField">The <see cref="FieldBuilder"/> which will hold the instances of the base types.</param>
        /// <param name="serviceProviderField">The <see cref="FieldBuilder"/> which will hold the instance of the dependency injection resolver.</param>
        private void AddConstructor(
            ITypeBuilder typeBuilder,
            Type baseType,
            IFieldBuilder baseTypeField,
            IFieldBuilder serviceProviderField)
        {
            // Build Constructor.
            var constructorBuilder = typeBuilder
                                     .NewConstructor()
                                     .Public()
                                     .HideBySig()
                                     .SpecialName()
                                     .RTSpecialName()
                                     .CallingConvention(CallingConventions.HasThis)
                                     .Param(baseType, "target")
                                     .Param <IServiceProvider>("serviceProvider");

            constructorBuilder
            .Body()
            .LdArg0()
            .Call(baseType.GetConstructor(new Type[0]))

            .LdArg0()
            .LdArg1()
            .StFld(baseTypeField)

            .LdArg0()
            .LdArg2()
            .StFld(serviceProviderField)
            .Ret();
        }
Exemple #7
0
        /// <summary>
        /// Processes type builder attributes.
        /// </summary>
        /// <param name="typeBuilder">A type builder.</param>
        /// <param name="type">The type to process the attributes for.</param>
        /// <returns>The type builder instance.</returns>
        public static ITypeBuilder ProcessAttributes(
            this ITypeBuilder typeBuilder,
            Type type)
        {
            foreach (var attr in type.GetCustomAttributes())
            {
/*
 *              if (attr is SwaggerRequestHeaderParameterAttribute)
 *              {
 *                  typeBuilder.SetCustomAttribute(
 *                      AttributeUtility.BuildAttribute<string, SwaggerRequestHeaderParameterAttribute>(
 *                          ((SwaggerRequestHeaderParameterAttribute)attr).Header,
 *                          () => AttributeUtility.GetAttributePropertyValues<SwaggerRequestHeaderParameterAttribute>((SwaggerRequestHeaderParameterAttribute)attr, null)));
 *              }
 *              else
 */
                if (attr is ObsoleteAttribute)
                {
                    typeBuilder.SetCustomAttribute(
                        AttributeUtility.BuildAttribute <ObsoleteAttribute>(null));
                }
            }

            return(typeBuilder);
        }
        public void SetUp()
        {
            _innerMock       = MockRepository.GenerateStrictMock <ITypeBuilder> ();
            _operandProvider = MockRepository.GenerateStrictMock <IEmittableOperandProvider> ();

            _decorator = new TypeBuilderDecorator(_innerMock, _operandProvider);
        }
Exemple #9
0
        private void GenerateClassMethods(ITypeBuilder type, IReadOnlyList <MethodSyntaxNode> methods, CodeGenerationStore store,
                                          Dictionary <IMethodBuilder, MethodSyntaxNode> methodsDictionary, ref IMethodInfo?entryPoint)
        {
            var definedMethods = new List <IMethodInfo>();

            store.Methods.Add(type, definedMethods);

            foreach (var method in methods)
            {
                var methodAttributes = MethodAttributes.Public;
                if (method.IsStatic)
                {
                    methodAttributes |= MethodAttributes.Static;
                }

                var parameters = method.Parameters.Select(x =>
                {
                    var tpe = store.TypeDefLookup(x.Type);
                    if (x.IsRef)
                    {
                        throw new RefTypeException("Ref types are not supported");
                    }

                    typeChecker !.AssertTypeIsNotVoid(tpe);
                    return(tpe);
                }).ToArray();

                var arrType = typeof(int[]);

                var returnType = store.TypeDefLookup(method.ReturnType);

                var definedMethod = type.DefineMethod(method.Name, methodAttributes, returnType, parameters, method.IsEntryPoint);

                if (method.IsEntryPoint)
                {
                    if (entryPoint != null)
                    {
                        throw new EntryPointException("Can only have 1 entry point");
                    }
                    entryPoint = definedMethod;
                }

                definedMethods.Add(definedMethod);

                store.MethodParameters.Add(definedMethod, parameters);
                methodsDictionary.Add(definedMethod, method);

                int offset = 0;
                //if (!method.IsStatic)
                //{
                //    offset = 1;
                //}

                for (int i = 0; i < method.Parameters.Count; i++)
                {
                    definedMethod.DefineParameter(i + 1 + offset, ParameterAttributes.None, method.Parameters[i].Name);
                }
            }
        }
        public static Type?GetType(object hashKey, Type sourceType, ITypeBuilder typeBuilder)
        {
            if (hashKey == null)
            {
                throw new ArgumentNullException(nameof(hashKey));
            }
            if (sourceType == null)
            {
                throw new ArgumentNullException(nameof(sourceType));
            }
            if (typeBuilder == null)
            {
                throw new ArgumentNullException(nameof(typeBuilder));
            }

            try
            {
                lock (_builtTypes)
                {
                    Type?type;

                    if (_builtTypes.TryGetValue(typeBuilder.GetType(), out var builderTable))
                    {
                        if (builderTable.TryGetValue(hashKey, out type))
                        {
                            return(type);
                        }
                    }
                    else
                    {
                        _builtTypes.Add(typeBuilder.GetType(), builderTable = new Dictionary <object, Type>());
                    }

                    var assemblyBuilder = GetAssemblyBuilder(sourceType, typeBuilder.AssemblyNameSuffix);

                    type = typeBuilder.Build(assemblyBuilder);

                    if (type != null)
                    {
                        builderTable.Add(hashKey, type);
#if !NETCOREAPP2_0 && !NETCOREAPP2_1 && !NETCOREAPP2_2
                        SaveAssembly(assemblyBuilder, type);
#endif
                    }

                    return(type);
                }
            }
            catch (TypeBuilderException)
            {
                throw;
            }
            catch (Exception ex)
            {
                // Convert an Exception to TypeBuilderException.
                //
                throw new TypeBuilderException($"Could not build the '{sourceType.FullName}' type.", ex);
            }
        }
Exemple #11
0
 public MultiTypeBuilder(IEnumerable <SyntaxTree> syntaxTrees, Compilation compilation, ITypeBuilder typeBuilder, IPatchParametersWalker walker)
 {
     _typesToWrap = new Stack <ITypeSymbol>();
     _syntaxTrees = syntaxTrees ?? throw new ArgumentNullException(nameof(syntaxTrees));
     _compilation = compilation ?? throw new ArgumentNullException(nameof(compilation));
     _typeBuilder = typeBuilder ?? throw new ArgumentNullException(nameof(typeBuilder));
     _walker      = walker ?? throw new ArgumentNullException(nameof(walker));
 }
Exemple #12
0
 /// <summary>
 /// Creates a method.
 /// </summary>
 /// <param name="typeBuilder">A type builder.</param>
 /// <param name="name">The name of the method.</param>
 /// <returns>A method builder instance.</returns>
 public static IMethodBuilder NewMethod <TReturn>(this ITypeBuilder typeBuilder, string name)
 {
     return(typeBuilder.NewMethod(
                name,
                MethodAttributes.Public,
                CallingConventions.HasThis,
                typeof(TReturn)));
 }
Exemple #13
0
        private IReadOnlyList <ConstructorSyntaxNode> GenerateClassConstructors(ITypeBuilder type, IReadOnlyList <ConstructorSyntaxNode> constructors, CodeGenerationStore store,
                                                                                IReadOnlyList <StatementSyntaxNode> fieldInitializers,
                                                                                Dictionary <IConstructorBuilder, ConstructorSyntaxNode> constructorsDictionary, ISyntaxNode parent)
        {
            var initialConstructors = new List <ConstructorSyntaxNode>(constructors);
            var mutatedConstructors = new List <ConstructorSyntaxNode>();

            var definedConstructors = new List <IConstructorInfo>();

            store.Constructors.Add(type, definedConstructors);

            if (constructors.Count == 0)
            {
                var statementList = new List <StatementSyntaxNode>();
                initialConstructors.Add(new ConstructorSyntaxNode(parent, Array.Empty <ParameterDefinitionSyntaxNode>(), statementList));
            }

            foreach (var constructor in initialConstructors)
            {
                var newStatements = new List <StatementSyntaxNode>(fieldInitializers);
                foreach (var toAdd in constructor.Statements)
                {
                    newStatements.Add(toAdd);
                }

                var mutatedConstructor = constructor.MutateStatements(newStatements);
                mutatedConstructors.Add(mutatedConstructor);

                var methodAttributes = MethodAttributes.Public;

                var parameters = mutatedConstructor.Parameters.Select(x =>
                {
                    var tpe = store.TypeDefLookup(x.Type);
                    if (x.IsRef)
                    {
                        throw new RefTypeException("Ref types are not supported");
                    }
                    typeChecker !.AssertTypeIsNotVoid(tpe);
                    return(tpe);
                }).ToArray();

                var definedConstructor = type.DefineConstructor(methodAttributes, parameters);

                definedConstructors.Add(definedConstructor);

                store.ConstructorParameters.Add(definedConstructor, parameters);
                constructorsDictionary.Add(definedConstructor, mutatedConstructor);

                int offset = 0;

                for (int i = 0; i < mutatedConstructor.Parameters.Count; i++)
                {
                    definedConstructor.DefineParameter(i + 1 + offset, ParameterAttributes.None, mutatedConstructor.Parameters[i].Name);
                }
            }
            return(mutatedConstructors);
        }
Exemple #14
0
        public IQueryBuilder WithType(string key, Func <ITypeBuilder, ITypeBuilder> predicate)
        {
            ITypeBuilder builder = predicate(new GraphQLQueryTypeBuilder(key));

            if (builder.Types.Count == 0 && builder.Parameters.Count == 0)
            {
                return(WithObject(key));
            }
            return(WithType(builder.ToType()));
        }
Exemple #15
0
 /// <summary>
 /// Resolves an object based on the type specified
 /// </summary>
 /// <param name="Name">Name of the object to return</param>
 /// <param name="ObjectType">Object type</param>
 /// <param name="DefaultObject">Default value if type is not registered or error occurs</param>
 /// <returns>Object of the type specified</returns>
 public override object Resolve(Type ObjectType, string Name, object DefaultObject = null)
 {
     try
     {
         var          Key     = new Tuple <Type, string>(ObjectType, Name);
         ITypeBuilder Builder = null;
         return(_AppContainer.TryGetValue(Key, out Builder) ? Builder.Create() : DefaultObject);
     }
     catch { return(DefaultObject); }
 }
Exemple #16
0
        public CodeFileBuilder AddType(ITypeBuilder value)
        {
            if (value is null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            _types.Add(value);
            return(this);
        }
 private void Register(Type target, ITypeBuilder builder)
 {
     if (!_builders.ContainsKey(target))
     {
         _builders.Add(target, builder.Create);
     }
     else
     {
         throw new InvalidOperationException($"Duplicate registration for type {target.FullName}");
     }
 }
Exemple #18
0
 /// <summary>
 /// Initializes a new instance of the <see cref="TypeFactoryContext"/> class.
 /// </summary>
 /// <param name="typeBuilder">The <see cref="TypeBuilder"/> being use to create the type.</param>
 /// <param name="newType">The new type being built.</param>
 /// <param name="baseType">The base type being built on.</param>
 /// <param name="serviceProvider">The current dependency injection scope</param>
 /// <param name="baseObjectField">The <see cref="FieldBuilder"/> that holds the base type instance.</param>
 /// <param name="serviceProviderField">The <see cref="FieldBuilder"/> that holds the <see cref="IServiceProvider"/> instance.</param>
 /// <param name="ctorBuilder">The <see cref="ConstructorBuilder"/> for the types constructor.</param>
 public TypeFactoryContext(
     ITypeBuilder typeBuilder,
     Type newType,
     Type baseType,
     IServiceProvider serviceProvider,
     IFieldBuilder baseObjectField,
     IFieldBuilder serviceProviderField,
     IConstructorBuilder ctorBuilder = null)
     : this(typeBuilder, newType, new Type[] { baseType }, serviceProvider, baseObjectField, serviceProviderField, ctorBuilder)
 {
 }
Exemple #19
0
 /// <summary>
 /// Initialises a new instance of the <see cref="FluentPropertyBuilder"/> class.
 /// </summary>
 /// <param name="typeBuilder">A <see cref="ITypeBuilder"/> instance.</param>
 /// <param name="propertyName">The name of the property.</param>
 /// <param name="propertyType">The property type.</param>
 /// <param name="define">A function to define the property.</param>
 public FluentPropertyBuilder(
     ITypeBuilder typeBuilder,
     string propertyName,
     Type propertyType,
     Func <string, PropertyAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][], PropertyBuilder> define)
 {
     this.define             = define;
     this.typeBuilder        = typeBuilder;
     this.name               = propertyName;
     this.propertyType       = propertyType;
     this.PropertyAttributes = PropertyAttributes.None;
 }
Exemple #20
0
 public static CodeGenerationContext GetSomeContext(
     MutableType mutableType  = null,
     ITypeBuilder typeBuilder = null,
     DebugInfoGenerator debugInfoGenerator = null,
     IEmittableOperandProvider emittableOperandProvider = null)
 {
     return(new CodeGenerationContext(
                mutableType ?? MutableTypeObjectMother.Create(),
                typeBuilder ?? new Mock <ITypeBuilder>().Object,
                debugInfoGenerator ?? new Mock <DebugInfoGenerator>().Object,
                emittableOperandProvider ?? new Mock <IEmittableOperandProvider>().Object));
 }
Exemple #21
0
 public SynchronisationWrapper(
     ITypeBuilder typeBuilder,
     IMethodBuilder methodBuilder,
     ISynchronisationTypeTranslator synchronisationTypeTranslator,
     TypeDefinition type)
 {
     this.m_TypeBuilder = typeBuilder;
     this.m_MethodBuilder = methodBuilder;
     this.m_SynchronisationTypeTranslator = synchronisationTypeTranslator;
     this.m_Type = type;
     this.m_TraceSource = new TraceSource("SynchronisationWrapper");
 }
Exemple #22
0
 public SynchronisationWrapper(
     ITypeBuilder typeBuilder,
     IMethodBuilder methodBuilder,
     ISynchronisationTypeTranslator synchronisationTypeTranslator,
     TypeDefinition type)
 {
     this.m_TypeBuilder   = typeBuilder;
     this.m_MethodBuilder = methodBuilder;
     this.m_SynchronisationTypeTranslator = synchronisationTypeTranslator;
     this.m_Type        = type;
     this.m_TraceSource = new TraceSource("SynchronisationWrapper");
 }
        public CodeGenerationContext(
            MutableType mutableType, ITypeBuilder typeBuilder, DebugInfoGenerator debugInfoGeneratorOrNull, IEmittableOperandProvider emittableOperandProvider)
        {
            ArgumentUtility.CheckNotNull("mutableType", mutableType);
            ArgumentUtility.CheckNotNull("typeBuilder", typeBuilder);
            ArgumentUtility.CheckNotNull("emittableOperandProvider", emittableOperandProvider);

            _mutableType              = mutableType;
            _typeBuilder              = typeBuilder;
            _debugInfoGenerator       = debugInfoGeneratorOrNull;
            _emittableOperandProvider = emittableOperandProvider;
        }
Exemple #24
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ProxyBuilderContext"/> class.
 /// </summary>
 /// <param name="typeBuilder">The <see cref="TypeBuilder"/> being use to create the type.</param>
 /// <param name="newType">The new type being built.</param>
 /// <param name="baseType">The base type being built on.</param>
 /// <param name="baseObjectField">The <see cref="FieldBuilder"/> that holds the base type instance.</param>
 /// <param name="ctorBuilder">The <see cref="ConstructorBuilder"/> for the types constructor.</param>
 public ProxyBuilderContext(
     ITypeBuilder typeBuilder,
     Type newType,
     Type baseType,
     IFieldBuilder baseObjectField,
     IConstructorBuilder ctorBuilder = null)
     : this(typeBuilder,
            newType,
            new Type[] { baseType },
            baseObjectField,
            ctorBuilder)
 {
 }
Exemple #25
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ProxyBuilderContext"/> class.
 /// </summary>
 /// <param name="typeBuilder">The <see cref="TypeBuilder"/> being use to create the type.</param>
 /// <param name="newType">The new type being built.</param>
 /// <param name="baseTypes">The base types being built on.</param>
 /// <param name="baseObjectField">The <see cref="FieldBuilder"/> that holds the base type instance.</param>
 /// <param name="ctorBuilder">The <see cref="ConstructorBuilder"/> for the types constructor.</param>
 public ProxyBuilderContext(
     ITypeBuilder typeBuilder,
     Type newType,
     Type[] baseTypes,
     IFieldBuilder baseObjectField,
     IConstructorBuilder ctorBuilder = null)
 {
     this.TypeBuilder        = typeBuilder;
     this.NewType            = newType;
     this.BaseTypes          = baseTypes;
     this.BaseObjectField    = baseObjectField;
     this.ConstructorBuilder = ctorBuilder;
 }
        /// <summary>
        /// Implements the interface and any of it descendent interfaces.
        /// </summary>
        /// <param name="typeBuilder">A type builder.</param>
        /// <param name="interfaceType">The interface type.</param>
        /// <returns>The type builder.</returns>
        public static ITypeBuilder ImplementsInterfaces(this ITypeBuilder typeBuilder, Type interfaceType)
        {
            typeBuilder.Implements(interfaceType);

            Type[] implementedInterfaces = interfaceType.GetInterfaces();
            if (implementedInterfaces.IsNullOrEmpty() == false)
            {
                foreach (Type type in implementedInterfaces)
                {
                    typeBuilder.ImplementsInterfaces(type);
                }
            }

            return(typeBuilder);
        }
        public IMutableTypeCodeGenerator Create(ITypeBuilder enclosingTypeBuilder, MutableType nestedType)
        {
            ArgumentUtility.CheckNotNull("enclosingTypeBuilder", enclosingTypeBuilder);
            ArgumentUtility.CheckNotNull("nestedType", nestedType);

            return(new MutableNestedTypeCodeGenerator(
                       enclosingTypeBuilder,
                       nestedType,
                       this,
                       _reflectionEmitCodeGenerator,
                       _emittableOperandProvider,
                       _memberEmitter,
                       _initializationBuilder,
                       _proxySerializationEnabler));
        }
Exemple #28
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ProxyGenerator"/> class.
        /// </summary>
        /// <param name="typeBuilder">The type builder.</param>
        /// <param name="interceptionFilter">The interception filter.</param>
        public ProxyGenerator(ITypeBuilder typeBuilder, IInterceptionFilter interceptionFilter)
        {
            if (typeBuilder == null)
                throw new ArgumentNullException("typeBuilder");

            if (interceptionFilter == null)
                throw new ArgumentNullException("interceptionFilter");

            _typeBuilder = typeBuilder;
            _interceptionFilter = interceptionFilter;

            _eventInfos = new List<EventInfo>();
            _propertyInfos = new List<PropertyInfo>();
            _methodInfos = new List<MethodInfo>();
        }
        /// <summary>
        /// Implements the interfaces and any of their descendent interfaces.
        /// </summary>
        /// <param name="typeBuilder">A type builder.</param>
        /// <param name="interfaceTypes">The interface type.</param>
        /// <returns>The type builder.</returns>
        public static ITypeBuilder ImplementsInterfaces(this ITypeBuilder typeBuilder, params Type[] interfaceTypes)
        {
            foreach (var interfaceType in interfaceTypes)
            {
                typeBuilder.Implements(interfaceType);

                Type[] baseTypes = interfaceType.GetInterfaces();
                if (baseTypes.IsNullOrEmpty() == false)
                {
                    typeBuilder.ImplementsInterfaces(baseTypes);
                }
            }

            return(typeBuilder);
        }
Exemple #30
0
        public void SetUp()
        {
            _expressionPreparerMock = MockRepository.GenerateStrictMock <IExpressionPreparer>();
            _ilGeneratorFactoryStub = MockRepository.GenerateStub <IILGeneratorFactory>();

            _emitter = new MemberEmitter(_expressionPreparerMock, _ilGeneratorFactoryStub);

            _typeBuilderMock = MockRepository.GenerateStrictMock <ITypeBuilder>();
            _emittableOperandProviderMock = MockRepository.GenerateStrictMock <IEmittableOperandProvider>();

            _context = CodeGenerationContextObjectMother.GetSomeContext(
                typeBuilder: _typeBuilderMock, emittableOperandProvider: _emittableOperandProviderMock);

            _fakeBody = ExpressionTreeObjectMother.GetSomeExpression();
        }
Exemple #31
0
        public void SetUp()
        {
            _enclosingTypeBuilderMock = MockRepository.GenerateStrictMock <ITypeBuilder>();
            _mutableType = MutableTypeObjectMother.Create();

            _generator = new MutableNestedTypeCodeGenerator
                         (
                _enclosingTypeBuilderMock,
                _mutableType,
                MockRepository.GenerateStub <IMutableNestedTypeCodeGeneratorFactory>(),
                MockRepository.GenerateStub <IReflectionEmitCodeGenerator>(),
                MockRepository.GenerateStub <IEmittableOperandProvider>(),
                MockRepository.GenerateStub <IMemberEmitter>(),
                MockRepository.GenerateStub <IInitializationBuilder>(),
                MockRepository.GenerateStub <IProxySerializationEnabler>());
        }
Exemple #32
0
 /// <summary>
 /// Initializes a new instance of the <see cref="TypeFactoryContext"/> class.
 /// </summary>
 /// <param name="typeBuilder">The <see cref="ITypeBuilder"/> being use to create the type.</param>
 /// <param name="newType">The new type being built.</param>
 /// <param name="baseTypes">The base types being built on.</param>
 /// <param name="serviceProvider">The current dependency injection scope</param>
 /// <param name="baseObjectField">The <see cref="IFieldBuilder"/> that holds the base type instance.</param>
 /// <param name="serviceProviderField">The <see cref="IFieldBuilder"/> that holds the <see cref="IServiceProvider"/> instance.</param>
 /// <param name="ctorBuilder">The <see cref="ConstructorBuilder"/> for the Itypes constructor.</param>
 public TypeFactoryContext(
     ITypeBuilder typeBuilder,
     Type newType,
     Type[] baseTypes,
     IServiceProvider serviceProvider,
     IFieldBuilder baseObjectField,
     IFieldBuilder serviceProviderField,
     IConstructorBuilder ctorBuilder = null)
 {
     this.TypeBuilder          = typeBuilder;
     this.NewType              = newType;
     this.BaseTypes            = baseTypes;
     this.ServiceProvider      = serviceProvider;
     this.BaseObjectField      = baseObjectField;
     this.ServiceProviderField = serviceProviderField;
     this.ConstructorBuilder   = ctorBuilder;
 }
Exemple #33
0
 /// <summary>
 /// Implements the <see cref="IMixinObject"/> interface on the mixin type.
 /// </summary>
 /// <param name="typeBuilder">The <see cref="TypeBuilder"/> use to construct the type.</param>
 /// <param name="baseTypeField">The <see cref="FieldBuilder"/> which will hold the instances of the types that make up the mixin.</param>
 private void EmitMixinObjectInterface(
     ITypeBuilder typeBuilder,
     IFieldBuilder baseTypeField)
 {
     var propertyMixinObjects = typeBuilder
                                .NewProperty <object[]>("MixinObjects")
                                .Getter(m => m
                                        .Public()
                                        .Virtual()
                                        .HideBySig()
                                        .NewSlot()
                                        .CallingConvention(CallingConventions.HasThis)
                                        .Body(il => il
                                              .LdArg0()
                                              .LdFld(baseTypeField)
                                              .Ret()));
 }
Exemple #34
0
            public Scope(CodeGenerator generator, ILBuilder il, bool isFunction, BoundBody body, BoundClosureField argumentsClosureField, ITypeBuilder typeBuilder, Scope parent)
            {
                IL = il;
                ArgumentsClosureField = argumentsClosureField;
                Generator = generator;
                _isFunction = isFunction;
                _body = body;
                if (argumentsClosureField != null)
                    ArgumentsEmitter = new ClosureFieldEmitter(generator, argumentsClosureField);
                TypeBuilder = typeBuilder;
                Parent = parent;

                _isStatic = TypeBuilder is IScriptBuilder;
                if (body.MappedArguments != null)
                    _arguments = body.MappedArguments.ToDictionary(p => p.Argument, p => p.Mapped);

                BreakTargets = new Stack<NamedLabel>();
                ContinueTargets = new Stack<NamedLabel>();
            }
 protected object ParseFalse(ITypeBuilderRegistry registry, ITypeBuilder builder)
 {
     Match("false");
     return builder.CreateBool(registry, false);
 }
Exemple #36
0
        private IFunctionBuilder DeclareFunction(BoundFunction function, ITypeBuilder typeBuilder, string sourceCode)
        {
            var method = typeBuilder.CreateFunction(typeof(JsFunction), function.Name, sourceCode);

            var argumentsReferenced = (function.Body.Flags & BoundBodyFlags.ArgumentsReferenced) != 0;
            BoundClosureField argumentsClosureField = null;

            var il = method.GetILBuilder();

            if (argumentsReferenced && function.Body.Closure != null)
                function.Body.Closure.Fields.TryGetValue(BoundClosure.ArgumentsFieldName, out argumentsClosureField);

            _scope = new Scope(
                this,
                il,
                true,
                function.Body,
                argumentsClosureField,
                typeBuilder,
                _scope
            );

            _scope.EmitLocals(function.Body.TypeManager);

            // Instantiate the closure if we own it.
            if (function.Body.Closure != null)
                EmitClosureSetup(function.Body);

            EmitInitializeArguments(function.Body);

            // Build the arguments object when we need it.

            if (argumentsReferenced)
            {
                // Initialize the arguments array.

                _scope.ArgumentsEmitter.EmitSetValue(new BoundEmitExpression(
                    BoundValueType.Object,
                    () =>
                    {
                        _scope.EmitLoad(SpecialLocal.Runtime);
                        _scope.EmitLoad(SpecialLocal.Callee);
                        _scope.EmitLoad(SpecialLocal.ArgumentsRaw);

                        IL.EmitCall(_runtimeCreateArguments);
                    }
                ));
            }

            // Emit the body.

            EmitStatements(function.Body.Body);

            // Ensure that we return something.

            EmitReturn(new BoundReturn(null, SourceLocation.Missing));

            // Emit the exceptional return block if we need it.

            EmitExceptionalReturn();

            // Put a debug location at the end of the function.

            if (function.Location != null)
            {
                IL.MarkSequencePoint(new SourceLocation(
                    function.Location.EndOffset,
                    function.Location.EndLine,
                    function.Location.EndColumn,
                    function.Location.EndOffset + 1,
                    function.Location.EndLine,
                    function.Location.EndColumn + 1,
                    null
                ));
            }

            _scope = _scope.Parent;

            return method;
        }
Exemple #37
0
 /// <summary>
 ///     Initializes a new instance of the <see cref="TypesRepository" /> class.
 /// </summary>
 internal TypesRepository(ITypeBuilder typeBuilder)
 {
     _typeBuilder = typeBuilder;
     _typeConstructor = new ConcurrentDictionary<Type, ConstructorInfo>();
 }
        /*
         * number = [ minus ] int [ frac ] [ exp ]
         * decimal-point = %x2E       ; .
         * digit1-9 = %x31-39         ; 1-9
         * e = %x65 / %x45            ; e E
         * exp = e [ minus / plus ] 1*DIGIT
         * frac = decimal-point 1*DIGIT
         * int = zero / ( digit1-9 *DIGIT )
         * minus = %x2D               ; -
         * plus = %x2B                ; +
         * zero = %x30                ; 0
         */

        private object ParseNumber(ITypeBuilderRegistry registry, ITypeBuilder builder)
        {
            var startLine = Line;
            var startColumn = Column;
            var sb = new StringBuilder();
            if (Peek() == '-')
            {
                sb.Append(Next());
            }
            var hasInteger = false;
            while (char.IsDigit((char) Peek()))
            {
                sb.Append(Next());
                hasInteger = true;
            }
            if (!hasInteger)
            {
                throw CreateExpectedNumberException(startLine, startColumn);
            }

            if (Peek() != '.')
            {
                long intValue;
                if (!long.TryParse(sb.ToString(), out intValue))
                {
                    throw CreateExpectedNumberException(startLine, startColumn);
                }
                return builder.CreateNumber(registry, intValue);
            }

            sb.Append(Next());
            var hasFrac = false;
            while (char.IsDigit((char) Peek()))
            {
                sb.Append(Next());
                hasFrac = true;
            }
            if (!hasFrac)
            {
                throw CreateExpectedNumberException(startLine, startColumn);
            }

            if ("eE".IndexOf((char) Peek()) >= 0)
            {
                sb.Append(Next());

                if ("+-".IndexOf((char) Peek()) >= 0)
                {
                    sb.Append(Next());
                }
                var hasExp = false;
                while (char.IsDigit((char) Peek()))
                {
                    sb.Append(Next());
                    hasExp = true;
                }
                if (!hasExp)
                {
                    throw CreateExpectedNumberException(startLine, startColumn);
                }
            }
            double doubleValue;

            if (!double.TryParse(sb.ToString(),
                                 NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint |
                                 NumberStyles.AllowExponent,
                                 JsonFormats.DoubleFormat, out doubleValue))
            {
                throw CreateExpectedNumberException(startLine, startColumn);
            }
            return builder.CreateNumber(registry, doubleValue);
        }
 protected object ParseNull(ITypeBuilderRegistry registry, ITypeBuilder builder)
 {
     Match("null");
     return builder.CreateNull(registry);
 }
        protected object ParseString(ITypeBuilderRegistry registry, ITypeBuilder builder)
        {
            var s = ParseString();

            var dt = JsonFormats.TryParseDateTime(s);
            return dt.HasValue ? builder.CreateDateTime(registry, dt.Value, s) : builder.CreateString(registry, s);
        }
        protected object ParserArray(ITypeBuilderRegistry registry, ITypeBuilder builder, object instanceState)
        {
            Match('[');
            SkipWhitespace();
            var arrayBuilder = builder.CreateArrayBuilder(registry);
            var array = arrayBuilder.CreateNewArray(registry, instanceState);

            while (Peek() != ']')
            {
                arrayBuilder.AddElement(array, Parse(registry, arrayBuilder.GetElementBuilder(registry), null));
                SkipWhitespace();

                if (!TryMatch(','))
                {
                    break;
                }
                SkipWhitespace();
            }
            Match(']');

            return arrayBuilder.GetArray(array);
        }
Exemple #42
0
		public static Type GetType(Type sourceType, ITypeBuilder typeBuilder)
		{
			return GetType(sourceType, sourceType, typeBuilder);
		}
Exemple #43
0
		public static Type GetType(object hashKey, Type sourceType, ITypeBuilder typeBuilder)
		{
			if (hashKey     == null) throw new ArgumentNullException("hashKey");
			if (sourceType  == null) throw new ArgumentNullException("sourceType");
			if (typeBuilder == null) throw new ArgumentNullException("typeBuilder");

			try
			{
				Hashtable builderTable = (Hashtable)_builtTypes[typeBuilder.GetType()];
				Type      type;

				if (builderTable != null)
				{
					type = (Type)builderTable[hashKey];

					if (type != null)
						return type;
				}

				lock (_builtTypes.SyncRoot)
				{
					builderTable = (Hashtable)_builtTypes[typeBuilder.GetType()];

					if (builderTable != null)
					{
						type = (Type)builderTable[hashKey];

						if (type != null)
							return type;
					}
					else
					{
						_builtTypes.Add(typeBuilder.GetType(), builderTable = new Hashtable());
					}

					AssemblyBuilderHelper assemblyBuilder =
						GetAssemblyBuilder(sourceType, typeBuilder.AssemblyNameSuffix);

					type = typeBuilder.Build(sourceType, assemblyBuilder);

					if (type != null)
					{
						builderTable.Add(hashKey, type);
						SaveAssembly(assemblyBuilder, type);
					}

					return type;
				}
			}
			catch (TypeBuilderException)
			{
				throw;
			}
			catch (Exception ex)
			{
				throw new TypeBuilderException(string.Format(
					"Could not build the '{0}' type: {1}", sourceType.FullName, ex.Message), ex);
			}
		}
 protected ConvertingTypeBuilder(ITypeBuilder inner, Func<object, object> convert)
 {
     _inner = inner;
     _convert = convert;
 }
 public void Initialize(IServiceContainer source)
 {
     _createAdapterType = source.GetService<ITypeBuilder>("CreateAdapterType");
 }
 protected object ParseTrue(ITypeBuilderRegistry registry, ITypeBuilder builder)
 {
     Match("true");
     return builder.CreateBool(registry, true);
 }
        protected object ParseObject(ITypeBuilderRegistry registry, ITypeBuilder builder, object instanceState)
        {
            Match('{');
            SkipWhitespace();

            var objectBuilder = builder.CreateObjectBuilder(registry);
            var @object = objectBuilder.CreateNewObject(registry, instanceState);

            while (Peek() != '}')
            {
                var memberName = ParseString();
                SkipWhitespace();
                Match(':');

                var memberState = objectBuilder.GetMemberState(memberName, @object);
                objectBuilder.SetMember(memberName, @object,
                                        Parse(registry, objectBuilder.GetMemberBuilder(registry, memberName),
                                              memberState));

                SkipWhitespace();

                if (!TryMatch(','))
                {
                    break;
                }
                SkipWhitespace();
            }
            Match('}');
            return objectBuilder.GetObject(@object);
        }