public static void FunctionDefinition(INamespaceBody ns, IScopeNode scope) { if (scope.Statements.Count > 0) { var body = MakeFunction(ns, "main"); body.SpecializationMapper[new GenericsMapper()] = new TypeMapper(); FunctionBodyDefinition(body, scope.Statements); } scope.Functions.Each(f => { var body = MakeFunction(ns, f.Name.Name); var types = new Dictionary <string, TypeGenericsParameter>(); ITypeDefinition create_type(ITypeNode s) => types.ContainsKey(s.Name) ? types[s.Name] : CreateType(body, s).Return(x => { if (x is TypeGenericsParameter g) { body.Generics.Add(types[g.Name] = g); } }); f.Arguments.Each(x => { var name = new VariableValue(x.Name.Name); body.Arguments.Add((name, create_type(x.Type))); body.LexicalScope.Add(x.Name.Name, name); }); if (f.Return is { }) { body.Return = create_type(f.Return); } if (body.Generics.Count == 0) { body.SpecializationMapper[new GenericsMapper()] = new TypeMapper(); } FunctionBodyDefinition(body, f.Statements); });
public static IEnumerable <T> AllStructs <T>(INamespaceBody src) where T : IStructBody => src.Structs.By <T>();
public static IEnumerable <IFunctionBody> AllFunctionBodies(INamespaceBody src) => src.Functions.By <IFunctionBody>();
public static IEnumerable <StructBody> AllStructBodies(INamespaceBody src) => src.Structs.By <StructBody>();