Rewriting function calls to have named parameters, default values
This commit is contained in:
29
new_ast.cpp
29
new_ast.cpp
@@ -112,6 +112,7 @@ enum{
|
||||
AST_BINDING = 4,
|
||||
AST_AGGREGATE = 8,
|
||||
AST_ATOM = 16,
|
||||
AST_ITEM_INCLUDED = 32,
|
||||
};
|
||||
|
||||
struct Ast{
|
||||
@@ -198,6 +199,7 @@ struct Ast_Enum : Ast{
|
||||
struct Ast_Lambda_Arg: Ast_Expr{
|
||||
Intern_String name;
|
||||
Ast_Expr *typespec;
|
||||
Ast_Expr *default_value;
|
||||
};
|
||||
|
||||
struct Ast_Lambda : Ast_Expr {
|
||||
@@ -353,12 +355,14 @@ ast_lambda(Token *pos, Array<Ast_Lambda_Arg *> params, Ast_Expr *ret, Ast_Block
|
||||
}
|
||||
|
||||
function Ast_Lambda_Arg *
|
||||
ast_expr_lambda_arg(Token *pos, Intern_String name, Ast_Expr *typespec){
|
||||
ast_expr_lambda_arg(Token *pos, Intern_String name, Ast_Expr *typespec, Ast_Expr *default_value){
|
||||
AST_NEW(Lambda_Arg, LAMBDA_ARG, pos, AST_EXPR);
|
||||
result->flags = AST_EXPR;
|
||||
result->name = name;
|
||||
result->typespec = typespec;
|
||||
result->flags = AST_EXPR;
|
||||
result->name = name;
|
||||
result->typespec = typespec;
|
||||
result->default_value = default_value;
|
||||
result->typespec->parent = result;
|
||||
if(result->default_value) result->default_value->parent = result;
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -487,6 +491,23 @@ const_get_struct(Ast *ast){
|
||||
return result;
|
||||
}
|
||||
|
||||
function Ast_Lambda *
|
||||
const_try_getting_lambda(Ast *ast){
|
||||
assert(ast->kind == AST_CONST);
|
||||
Ast_Const *constant = (Ast_Const *)ast;
|
||||
if(constant->value->kind == AST_LAMBDA){
|
||||
return (Ast_Lambda *)constant->value;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
function Ast_Lambda *
|
||||
const_get_lambda(Ast *ast){
|
||||
auto result = const_try_getting_lambda(ast);
|
||||
assert(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
function Intern_String
|
||||
ast_get_name(Ast *ast){
|
||||
assert(is_flag_set(ast->flags, AST_BINDING));
|
||||
|
||||
Reference in New Issue
Block a user