コード例 #1
0
ファイル: Definition.cs プロジェクト: zenuas/Roku
        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);
            });
コード例 #2
0
 public static IEnumerable <T> AllStructs <T>(INamespaceBody src) where T : IStructBody => src.Structs.By <T>();
コード例 #3
0
 public static IEnumerable <IFunctionBody> AllFunctionBodies(INamespaceBody src) => src.Functions.By <IFunctionBody>();
コード例 #4
0
 public static IEnumerable <StructBody> AllStructBodies(INamespaceBody src) => src.Structs.By <StructBody>();