@@ -24,6 +24,7 @@ open System.Collections.Generic
2424open System.Reflection
2525open System.Reflection .Emit
2626open Naggum.Runtime
27+ open Naggum.Compiler .Globals
2728open Naggum.Compiler .Reader
2829open Naggum.Compiler .Context
2930open Naggum.Compiler .IGenerator
@@ -259,4 +260,43 @@ type NewObjGenerator(context : Context, typeBuilder : TypeBuilder, typeName : st
259260 if typeName.StartsWith " System" then
260261 [ Type.GetType typeName]
261262 else
262- [ context.types.[ typeName]]
263+ [ context.types.[ typeName]]
264+
265+ type TypeGenerator ( context : Context , typeBuilder : TypeBuilder , typeName : string , parentTypeName : string , members : SExp list , gf : IGeneratorFactory ) =
266+ let newTypeBuilder =
267+ if parentTypeName = " " then
268+ Globals.ModuleBuilder.DefineType( typeName, TypeAttributes.Class ||| TypeAttributes.Public, typeof< obj>)
269+ else
270+ Globals.ModuleBuilder.DefineType( typeName, TypeAttributes.Class ||| TypeAttributes.Public, context.types.[ parentTypeName])
271+ let newGeneratorFactory = gf.MakeGeneratorFactory newTypeBuilder
272+ let mutable fields : string list = []
273+
274+ let generate_field field_name =
275+ let fieldBuilder = newTypeBuilder.DefineField( field_ name, typeof< obj>, FieldAttributes.Public)
276+ fields <- List.append fields [ field_ name]
277+ let generate_method method_name method_parms method_body =
278+ let method_gen = newTypeBuilder.DefineMethod( method_ name, MethodAttributes.Public,
279+ typeof< obj>,
280+ Array.create ( List.length method_ parms) typeof< obj>)
281+ let method_ctx = new Context( context)
282+ for parm in method_ parms do
283+ match parm with
284+ | Atom( Symbol parm_ name) ->
285+ let parm_idx = ( List.findIndex ( fun ( p ) -> p = parm) method_ parms)
286+ method_ ctx.locals.[ parm_ name] <- Arg ( parm_ idx, typeof< obj>)
287+ | other -> failwithf " In method %A%A parameter definition:\n Expected: Atom(Symbol)\n Got: %A " typeName method_ name parm
288+ let body_gen = newGeneratorFactory.MakeBody method_ ctx method_ body
289+ body_ gen.Generate ( method_ gen.GetILGenerator())
290+ ( method_ gen.GetILGenerator()) .Emit( OpCodes.Ret)
291+
292+ interface IGenerator with
293+ member this.Generate ilGen =
294+ for m in members do
295+ match m with
296+ | List ( Atom ( Symbol " field" ) :: Atom ( Symbol name) :: []) -> generate_ field name
297+ | List ( Atom ( Symbol " field" ) :: Atom ( Symbol access) :: Atom ( Symbol name) :: []) -> generate_ field name
298+ | List ( Atom ( Symbol " method" ) :: Atom ( Symbol name) :: List parms :: body) -> generate_ method name parms body
299+ | List ( Atom ( Symbol " method" ) :: Atom ( Symbol name) :: Atom ( Symbol access) :: List parms :: body) -> generate_ method name parms body
300+ | other -> failwithf " In definition of type %A : \n Unknown member definition: %A " typeName other
301+ member this.ReturnTypes () =
302+ [ typeof< System.Void>]
0 commit comments