Пример #1
0
        BooClassBuilder CreateClosureClass(ForeignReferenceCollector collector, InternalMethod closure)
        {
            Method         method = closure.Method;
            TypeDefinition parent = method.DeclaringType;

            parent.Members.Remove(method);

            BooClassBuilder builder = collector.CreateSkeletonClass(closure.Name, method.LexicalInfo);

            parent.Members.Add(builder.ClassDefinition);
            builder.ClassDefinition.Members.Add(method);
            method.Name = "Invoke";

            if (method.IsStatic)
            {
                // need to adjust paremeter indexes (parameter 0 is now self)
                foreach (ParameterDeclaration parameter in method.Parameters)
                {
                    ((InternalParameter)parameter.Entity).Index += 1;
                }
            }

            method.Modifiers = TypeMemberModifiers.Public;
            var coll = new GenericTypeCollector(CodeBuilder);

            coll.Process(builder.ClassDefinition);
            return(builder);
        }
Пример #2
0
        private void AddGenericTypes(ClassDefinition cd, bool adaptInnerGenerics)
        {
            var collector = new GenericTypeCollector(this.CodeBuilder);

            collector.Process(cd);
            if (!adaptInnerGenerics)
            {
                return;
            }

            var counter        = cd.GenericParameters.Count;
            var innerCollector = new DetectInnerGenerics();

            cd.Accept(innerCollector);
            foreach (Node node in innerCollector.Values)
            {
                var param = (IGenericParameter)node.Entity;
                var gp    = cd.GenericParameters.FirstOrDefault(gpd => gpd.Name.Equals(param.Name));
                if (gp == null)
                {
                    gp = CodeBuilder.CreateGenericParameterDeclaration(counter, param.Name);
                    cd.GenericParameters.Add(gp);
                    ++counter;
                }
                node.Entity = gp.Entity;
                gp["InternalGenericParent"] = (param as InternalGenericParameter).Node;
            }
        }
Пример #3
0
		BooClassBuilder CreateClosureClass(ForeignReferenceCollector collector, InternalMethod closure)
		{
			Method method = closure.Method;
			TypeDefinition parent = method.DeclaringType;
			parent.Members.Remove(method);
			
			BooClassBuilder builder = collector.CreateSkeletonClass(closure.Name, method.LexicalInfo);
			parent.Members.Add(builder.ClassDefinition);
			builder.ClassDefinition.Members.Add(method);
			method.Name = "Invoke";
			
			if (method.IsStatic)
			{
				// need to adjust paremeter indexes (parameter 0 is now self)
				foreach (ParameterDeclaration parameter in method.Parameters)
				{
					((InternalParameter)parameter.Entity).Index += 1;
				}
			}
			
			method.Modifiers = TypeMemberModifiers.Public;
			var coll = new GenericTypeCollector(CodeBuilder);
			coll.Process(builder.ClassDefinition);
			return builder;
		}
		private void AddGenericTypes(ClassDefinition cd)
		{
			var collector = new GenericTypeCollector(this.CodeBuilder);
			collector.Process(cd);
			
			var counter = cd.GenericParameters.Count;
			var innerCollector = new DetectInnerGenerics();
			cd.Accept(innerCollector);
			foreach (Node node in innerCollector.Values)
			{
				var param = (IGenericParameter)node.Entity;
				var gp = cd.GenericParameters.FirstOrDefault(gpd => gpd.Name.Equals(param.Name));
				if (gp == null)
				{
					gp = CodeBuilder.CreateGenericParameterDeclaration(counter, param.Name);
					cd.GenericParameters.Add(gp);
					++counter;
				}
				node.Entity = new InternalGenericParameter(this.TypeSystemServices, gp);
				gp["InternalGenericParent"] = (param as InternalGenericParameter).Node;
			}
		}
Пример #5
0
        ClassDefinition CreateAdaptor(ICallableType to, ICallableType from)
        {
            BooClassBuilder adaptor = CodeBuilder.CreateClass("$adaptor$" + from.Name + "$" + to.Name + "$" + _adaptors.Count);

            adaptor.AddBaseType(TypeSystemServices.ObjectType);
            adaptor.Modifiers = TypeMemberModifiers.Final | TypeMemberModifiers.Internal;

            Field callable = adaptor.AddField("$from", from);

            BooMethodBuilder     constructor = adaptor.AddConstructor();
            ParameterDeclaration param       = constructor.AddParameter("from", from);

            constructor.Body.Add(
                CodeBuilder.CreateSuperConstructorInvocation(TypeSystemServices.ObjectType));
            constructor.Body.Add(
                CodeBuilder.CreateAssignment(
                    CodeBuilder.CreateReference(callable),
                    CodeBuilder.CreateReference(param)));

            CallableSignature signature = to.GetSignature();
            BooMethodBuilder  invoke    = adaptor.AddMethod("Invoke", signature.ReturnType);

            foreach (IParameter parameter in signature.Parameters)
            {
                invoke.AddParameter(parameter.Name, parameter.Type, parameter.IsByRef);
            }
            MethodInvocationExpression mie = CodeBuilder.CreateMethodInvocation(
                CodeBuilder.CreateReference(callable),
                GetInvokeMethod(from));
            int fromParameterCount = from.GetSignature().Parameters.Length;

            for (int i = 0; i < fromParameterCount; ++i)
            {
                mie.Arguments.Add(
                    CodeBuilder.CreateReference(invoke.Parameters[i]));
            }
            if (signature.ReturnType != TypeSystemServices.VoidType &&
                from.GetSignature().ReturnType != TypeSystemServices.VoidType)
            {
                invoke.Body.Add(new ReturnStatement(mie));
            }
            else
            {
                invoke.Body.Add(mie);
            }

            BooMethodBuilder adapt = adaptor.AddMethod("Adapt", to);

            adapt.Modifiers = TypeMemberModifiers.Static | TypeMemberModifiers.Public;
            param           = adapt.AddParameter("from", from);
            adapt.Body.Add(
                new ReturnStatement(
                    CodeBuilder.CreateConstructorInvocation(
                        to.GetConstructors().First(),
                        CodeBuilder.CreateConstructorInvocation(
                            (IConstructor)constructor.Entity,
                            CodeBuilder.CreateReference(param)),
                        CodeBuilder.CreateAddressOfExpression(invoke.Entity))));

            var collector = new GenericTypeCollector(this.CodeBuilder);

            collector.Process(adaptor.ClassDefinition);
            RegisterAdaptor(to, from, adaptor.ClassDefinition);

            return(adaptor.ClassDefinition);
        }
Пример #6
0
		ClassDefinition CreateAdaptor(ICallableType to, ICallableType from)
		{
			BooClassBuilder adaptor = CodeBuilder.CreateClass("$adaptor$" + from.Name + "$" + to.Name + "$" + _adaptors.Count);
			adaptor.AddBaseType(TypeSystemServices.ObjectType);
			adaptor.Modifiers = TypeMemberModifiers.Final|TypeMemberModifiers.Internal;
			
			Field callable = adaptor.AddField("$from", from);
			
			BooMethodBuilder constructor = adaptor.AddConstructor();
			ParameterDeclaration param = constructor.AddParameter("from", from);
			constructor.Body.Add(
				CodeBuilder.CreateSuperConstructorInvocation(TypeSystemServices.ObjectType));
			constructor.Body.Add(
				CodeBuilder.CreateAssignment(
					CodeBuilder.CreateReference(callable),
					CodeBuilder.CreateReference(param)));
					
			CallableSignature signature = to.GetSignature();
			BooMethodBuilder invoke = adaptor.AddMethod("Invoke", signature.ReturnType);
			foreach (IParameter parameter in signature.Parameters)
			{
				invoke.AddParameter(parameter.Name, parameter.Type, parameter.IsByRef);
			}
			MethodInvocationExpression mie = CodeBuilder.CreateMethodInvocation(
							CodeBuilder.CreateReference(callable),
							GetInvokeMethod(from));
			int fromParameterCount = from.GetSignature().Parameters.Length;
			for (int i=0; i<fromParameterCount; ++i)
			{
				mie.Arguments.Add(
					CodeBuilder.CreateReference(invoke.Parameters[i]));
			}
			if (signature.ReturnType != TypeSystemServices.VoidType &&
				from.GetSignature().ReturnType != TypeSystemServices.VoidType)
			{
				invoke.Body.Add(new ReturnStatement(mie));
			}
			else
			{
				invoke.Body.Add(mie);
			}
			
			BooMethodBuilder adapt = adaptor.AddMethod("Adapt", to);
			adapt.Modifiers = TypeMemberModifiers.Static|TypeMemberModifiers.Public;
			param = adapt.AddParameter("from", from);
			adapt.Body.Add(
				new ReturnStatement(
					CodeBuilder.CreateConstructorInvocation(
						to.GetConstructors().First(),
						CodeBuilder.CreateConstructorInvocation(
							(IConstructor)constructor.Entity,
							CodeBuilder.CreateReference(param)),
						CodeBuilder.CreateAddressOfExpression(invoke.Entity))));
			
			var collector = new GenericTypeCollector(this.CodeBuilder);
			collector.Process(adaptor.ClassDefinition);
			RegisterAdaptor(to, from, adaptor.ClassDefinition);
			
			return adaptor.ClassDefinition;
		}