コード例 #1
0
ファイル: ReflectedProvider.cs プロジェクト: izobr/light
        public Either<MemberReference, PropertyReferenceContainer> Convert(IAstReference astReference, ModuleDefinition module)
        {
            var reflectedType = astReference as AstReflectedType;
            if (reflectedType != null)
                return module.Import(reflectedType.ActualType);

            var reflectedMethod = astReference as AstReflectedMethod;
            if (reflectedMethod != null)
                return module.Import(reflectedMethod.Method);

            var reflectedConstructor = astReference as AstReflectedConstructor;
            if (reflectedConstructor != null)
                return module.Import(reflectedConstructor.Constructor);

            var reflectedProperty = astReference as AstReflectedProperty;
            if (reflectedProperty != null) {
                var getMethod = reflectedProperty.Property.GetGetMethod();
                var setMethod = reflectedProperty.Property.GetSetMethod();
                return new PropertyReferenceContainer(
                    getMethod != null ? module.Import(getMethod) : null,
                    setMethod != null ? module.Import(setMethod) : null
                );
            }

            return null;
        }
コード例 #2
0
ファイル: VoidTypeProvider.cs プロジェクト: ashmind/light
        public Either<MemberReference, PropertyReferenceContainer> Convert(IAstReference astReference, ModuleDefinition module, IReferenceProvider recursive)
        {
            if (astReference != AstVoidType.Instance)
                return null;

            return module.Import(typeof(void));
        }
コード例 #3
0
ファイル: ReferenceContext.cs プロジェクト: ashmind/light
        Either<MemberReference, PropertyReferenceContainer> IReferenceProvider.Convert(IAstReference astReference, ModuleDefinition module, IReferenceProvider recursive)
        {
            if (module != this.module)
                throw new InvalidOperationException("Expected module to be " + this.module + ", received " + module);

            return this.ConvertReference(astReference);
        }
コード例 #4
0
ファイル: DelegateProvider.cs プロジェクト: ashmind/light
        public Either <MemberReference, PropertyReferenceContainer> Convert(IAstReference astReference, ModuleDefinition module, IReferenceProvider recursive)
        {
            var functionType = astReference as IAstFunctionTypeReference;

            if (functionType == null)
            {
                return(null);
            }

            var types            = new List <IAstTypeReference>(functionType.GetParameterTypes());
            var delegateTypeName = "Action";

            if (!(functionType.ReturnType is AstVoidType))
            {
                delegateTypeName = "Func";
                types.Add(functionType.ReturnType);
            }
            delegateTypeName += "`" + types.Count;

            var delegateOpenType = module.Import(Type.GetType("System." + delegateTypeName, true));
            var delegateType     = new GenericInstanceType(delegateOpenType);

            types.Select(t => recursive.Convert(t, module, recursive).As <TypeReference>())
            .ForEach(delegateType.GenericArguments.Add);

            return(delegateType);
        }
コード例 #5
0
ファイル: VoidTypeProvider.cs プロジェクト: ashmind/light
        public Either <MemberReference, PropertyReferenceContainer> Convert(IAstReference astReference, ModuleDefinition module, IReferenceProvider recursive)
        {
            if (astReference != AstVoidType.Instance)
            {
                return(null);
            }

            return(module.Import(typeof(void)));
        }
コード例 #6
0
        protected override Either<MemberReference, PropertyReferenceContainer> ConvertReference(IAstReference reference, bool returnNullIfFailed = false)
        {
            var definition = reference as IAstDefinition ?? reference.Target as IAstDefinition;
            if (definition != null) {
                var result = this.references.GetValueOrDefault(definition);
                if (result != null)
                    return result;
            }

            return base.ConvertReference(reference, returnNullIfFailed);
        }
コード例 #7
0
ファイル: ReferenceContext.cs プロジェクト: ashmind/light
        protected virtual Either<MemberReference, PropertyReferenceContainer> ConvertReference(IAstReference reference, bool returnNullIfFailed = false)
        {
            var converted = this.providers.Select(r => r.Convert(reference, module, this)).FirstOrDefault(r => r != null);
            if (converted == null) {
                if (returnNullIfFailed)
                    return null;

                throw new NotImplementedException("ReferenceContext: Cannot convert AST reference " + reference + ".");
            }

            return converted;
        }
コード例 #8
0
ファイル: GenericTypeProvider.cs プロジェクト: ashmind/light
        public Either<MemberReference, PropertyReferenceContainer> Convert(IAstReference astReference, ModuleDefinition module, IReferenceProvider recursive)
        {
            var generic = astReference as AstGenericTypeWithArguments;
            if (generic == null)
                return null;

            var primary = recursive.Convert(generic.PrimaryType, module, recursive).As<TypeReference>();
            var arguments = generic.TypeArguments.Select(a => recursive.Convert(a, module, recursive).As<TypeReference>());

            var result = new GenericInstanceType(primary);
            arguments.ForEach(result.GenericArguments.Add);

            return result;
        }
コード例 #9
0
        public Either<MemberReference, PropertyReferenceContainer> Convert(IAstReference astReference, ModuleDefinition module, IReferenceProvider recursive)
        {
            var methodAst = astReference as AstGenericMethodWithTypeArguments;
            if (methodAst == null)
                return null;

            var method = recursive.Convert(methodAst.Actual, module, recursive).As<MethodReference>();
            var typeArguments = methodAst.GenericArgumentTypes.Select(a => recursive.Convert(a, module, recursive).As<TypeReference>());

            var result = new GenericInstanceMethod(method);
            typeArguments.ForEach(result.GenericArguments.Add);

            return result;
        }
コード例 #10
0
ファイル: GenericTypeProvider.cs プロジェクト: ashmind/light
        public Either <MemberReference, PropertyReferenceContainer> Convert(IAstReference astReference, ModuleDefinition module, IReferenceProvider recursive)
        {
            var generic = astReference as AstGenericTypeWithArguments;

            if (generic == null)
            {
                return(null);
            }

            var primary   = recursive.Convert(generic.PrimaryType, module, recursive).As <TypeReference>();
            var arguments = generic.TypeArguments.Select(a => recursive.Convert(a, module, recursive).As <TypeReference>());

            var result = new GenericInstanceType(primary);

            arguments.ForEach(result.GenericArguments.Add);

            return(result);
        }
コード例 #11
0
        public Either <MemberReference, PropertyReferenceContainer> Convert(IAstReference astReference, ModuleDefinition module, IReferenceProvider recursive)
        {
            var methodAst = astReference as AstGenericMethodWithTypeArguments;

            if (methodAst == null)
            {
                return(null);
            }

            var method        = recursive.Convert(methodAst.Actual, module, recursive).As <MethodReference>();
            var typeArguments = methodAst.GenericArgumentTypes.Select(a => recursive.Convert(a, module, recursive).As <TypeReference>());

            var result = new GenericInstanceMethod(method);

            typeArguments.ForEach(result.GenericArguments.Add);

            return(result);
        }
コード例 #12
0
ファイル: DelegateProvider.cs プロジェクト: ashmind/light
        public Either<MemberReference, PropertyReferenceContainer> Convert(IAstReference astReference, ModuleDefinition module, IReferenceProvider recursive)
        {
            var functionType = astReference as IAstFunctionTypeReference;
            if (functionType == null)
                return null;

            var types = new List<IAstTypeReference>(functionType.GetParameterTypes());
            var delegateTypeName = "Action";
            if (!(functionType.ReturnType is AstVoidType)) {
                delegateTypeName = "Func";
                types.Add(functionType.ReturnType);
            }
            delegateTypeName += "`" + types.Count;

            var delegateOpenType = module.Import(Type.GetType("System." + delegateTypeName, true));
            var delegateType = new GenericInstanceType(delegateOpenType);
            types.Select(t => recursive.Convert(t, module, recursive).As<TypeReference>())
                 .ForEach(delegateType.GenericArguments.Add);

            return delegateType;
        }
コード例 #13
0
ファイル: ReflectedProvider.cs プロジェクト: ashmind/light
        public Either <MemberReference, PropertyReferenceContainer> Convert(IAstReference astReference, ModuleDefinition module, IReferenceProvider recursive)
        {
            var reflectedType = astReference as AstReflectedType;

            if (reflectedType != null)
            {
                return(module.Import(reflectedType.ActualType));
            }

            var reflectedMethod = astReference as AstReflectedMethod;

            if (reflectedMethod != null)
            {
                return(module.Import(reflectedMethod.Method));
            }

            var reflectedConstructor = astReference as AstReflectedConstructor;

            if (reflectedConstructor != null)
            {
                return(module.Import(reflectedConstructor.Constructor));
            }

            var reflectedProperty = astReference as AstReflectedProperty;

            if (reflectedProperty != null)
            {
                var getMethod = reflectedProperty.Property.GetGetMethod();
                var setMethod = reflectedProperty.Property.GetSetMethod();
                return(new PropertyReferenceContainer(
                           getMethod != null ? module.Import(getMethod) : null,
                           setMethod != null ? module.Import(setMethod) : null
                           ));
            }

            return(null);
        }
コード例 #14
0
 public void Add(string name, IAstReference @object)
 {
     this.items.Add(name, @object);
 }
コード例 #15
0
        protected virtual Either <MemberReference, PropertyReferenceContainer> ConvertReference(IAstReference reference, bool returnNullIfFailed = false)
        {
            var converted = this.providers.Select(r => r.Convert(reference, module, this)).FirstOrDefault(r => r != null);

            if (converted == null)
            {
                if (returnNullIfFailed)
                {
                    return(null);
                }

                throw new NotImplementedException("ReferenceContext: Cannot convert AST reference " + reference + ".");
            }

            return(converted);
        }
コード例 #16
0
        protected override Either <MemberReference, PropertyReferenceContainer> ConvertReference(IAstReference reference, bool returnNullIfFailed = false)
        {
            var definition = reference as IAstDefinition ?? reference.Target as IAstDefinition;

            if (definition != null)
            {
                var result = this.references.GetValueOrDefault(definition);
                if (result != null)
                {
                    return(result);
                }
            }

            return(base.ConvertReference(reference, returnNullIfFailed));
        }
コード例 #17
0
        Either <MemberReference, PropertyReferenceContainer> IReferenceProvider.Convert(IAstReference astReference, ModuleDefinition module, IReferenceProvider recursive)
        {
            if (module != this.module)
            {
                throw new InvalidOperationException("Expected module to be " + this.module + ", received " + module);
            }

            return(this.ConvertReference(astReference));
        }