private void EmitStateTypeIdLookup() { CodeTypeDeclaration type; type = new CodeTypeDeclaration("StateSerializerTypeIds"); type.TypeAttributes = TypeAttributes.Public | TypeAttributes.Abstract; foreach (StateDecorator s in States) { if (s.Definition.IsAbstract) { continue; } CodeMemberField field = type.DeclareField("Ascension.Networking.UniqueId", s.NameInterface); field.Attributes = MemberAttributes.Public | MemberAttributes.Static; field.InitExpression = new CodeSnippetExpression(string.Format("new Ascension.Networking.UniqueId({0})", s.Guid.ToByteArray().Join(", "))); } CodeNamespaceAscensionInternal.Types.Add(type); }
protected virtual void EmitMeta() { MetaType = Generator.DeclareClass(Decorator.NameMeta); //MetaType.TypeAttributes = TypeAttributes.NestedAssembly; //Needed to change the emitted code to be 'public' instead of 'internal' MetaType.Attributes = MemberAttributes.Public; MetaType.TypeAttributes = TypeAttributes.Public; MetaType.BaseTypes.Add(Decorator.BaseClassMeta); MetaType.BaseTypes.Add(Decorator.FactoryInterface); //MetaType.DeclareField(Decorator.NameMeta, "Instance").Attributes = MemberAttributes.Static | // MemberAttributes.Assembly; MetaType.DeclareField(Decorator.NameMeta, "Instance").Attributes = MemberAttributes.Static | MemberAttributes.Public; MetaType.DeclareConstructorStatic(ctor => { ctor.Statements.Add("Instance".Expr().Assign(Decorator.NameMeta.New())); ctor.Statements.Add("Instance".Expr().Call("InitMeta")); EmitMetaStaticCtor(ctor); }); // initialize object MetaType.DeclareMethod(typeof(void).FullName, "InitObject", method => { //method.Attributes = MemberAttributes.Assembly | MemberAttributes.Override; method.Attributes = MemberAttributes.Public | MemberAttributes.Override; method.DeclareParameter("Ascension.Networking.NetworkObj", "obj"); method.DeclareParameter("Ascension.Networking.NetworkObj_Meta.Offsets", "offsets"); DomBlock block; block = new DomBlock(method.Statements); for (int i = 0; i < Decorator.Properties.Count; ++i) { block.Stmts.Comment(""); block.Stmts.Comment("Property: " + Decorator.Properties[i].Definition.Name); PropertyCodeEmitter.Create(Decorator.Properties[i]).EmitObjectSetup(block); } EmitObjectInit(method); }); // initialize meta class MetaType.DeclareMethod(typeof(void).FullName, "InitMeta", method => { //method.Attributes = MemberAttributes.Assembly | MemberAttributes.Override; method.Attributes = MemberAttributes.Public | MemberAttributes.Override; DomBlock block; block = new DomBlock(method.Statements); block.Stmts.Comment("Setup fields"); block.Stmts.Expr("this.TypeId = new Ascension.Networking.TypeId({0})", Decorator.TypeId); block.Stmts.Expr("this.CountStorage = {0}", Decorator.CountStorage); block.Stmts.Expr("this.CountObjects = {0}", Decorator.CountObjects); block.Stmts.Expr("this.CountProperties = {0}", Decorator.CountProperties); block.Stmts.Expr("this.Properties = new Ascension.Networking.NetworkPropertyInfo[{0}]", Decorator.CountProperties); EmitMetaInit(method); for (int i = 0; i < Decorator.Properties.Count; ++i) { block.Stmts.Comment(""); block.Stmts.Comment("Property: " + Decorator.Properties[i].Definition.Name); PropertyCodeEmitter.Create(Decorator.Properties[i]).EmitMetaSetup(block); } block.Stmts.Expr("base.InitMeta()"); }); // emit factory interface EmitFactory(); }