public ClassDefinition GetCompilerGeneratedExtensionsClass() { if (null == _compilerGeneratedExtensionsClass) { BooClassBuilder builder = CodeBuilder.CreateClass("CompilerGeneratedExtensions"); builder.Modifiers = TypeMemberModifiers.Final | TypeMemberModifiers.Transient | TypeMemberModifiers.Public; builder.AddBaseType(ObjectType); BooMethodBuilder ctor = builder.AddConstructor(); ctor.Modifiers = TypeMemberModifiers.Private; ctor.Body.Add( CodeBuilder.CreateSuperConstructorInvocation(ObjectType)); ClassDefinition cd = builder.ClassDefinition; Module module = GetCompilerGeneratedExtensionsModule(); module.Members.Add(cd); ((ModuleEntity)module.Entity).InitializeModuleClass(cd); _compilerGeneratedExtensionsClass = cd; } return(_compilerGeneratedExtensionsClass); }
BooMethodBuilder CreateConstructor(BooClassBuilder builder) { BooMethodBuilder constructor = builder.AddConstructor(); constructor.Body.Add(CodeBuilder.CreateSuperConstructorInvocation(builder.Entity.BaseType)); return constructor; }
public void DeclareFieldsAndConstructor(BooClassBuilder builder) { // referenced entities turn into fields foreach (ITypedEntity entity in Builtins.array(_referencedEntities.Keys)) { Field field = builder.AddInternalField("__" + entity.Name + _context.AllocIndex(), entity.Type); _referencedEntities[entity] = field.Entity; } // single constructor taking all referenced entities BooMethodBuilder constructor = builder.AddConstructor(); constructor.Modifiers = TypeMemberModifiers.Public; constructor.Body.Add(CodeBuilder.CreateSuperConstructorInvocation(builder.Entity.BaseType)); foreach (ITypedEntity entity in _referencedEntities.Keys) { InternalField field = (InternalField)_referencedEntities[entity]; ParameterDeclaration parameter = constructor.AddParameter(field.Name, entity.Type); constructor.Body.Add( CodeBuilder.CreateAssignment(CodeBuilder.CreateReference(field), CodeBuilder.CreateReference(parameter))); } }