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, 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; } }
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; } }
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); }
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; }