diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2021-05-09 19:37:24 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-09 19:37:24 +0200 |
| commit | 84d844bd4ad9320d00ea5f025a9ca44bf74c6ee7 (patch) | |
| tree | 87c7e9d164e1da62c5cf4a3dff0cc9dea3f6e1d1 /src/common | |
| parent | 87d4464e91f8b5784ba20e6ef78c818092afb9a9 (diff) | |
| parent | 9c2090e0395d68bb9a89cfd3f69f863375a27f54 (diff) | |
Merge pull request #39 from DanielGavin/procedure-arguments
begun argument underlining
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/ast.odin | 200 |
1 files changed, 189 insertions, 11 deletions
diff --git a/src/common/ast.odin b/src/common/ast.odin index 0c9bdcf..839c7f5 100644 --- a/src/common/ast.odin +++ b/src/common/ast.odin @@ -5,6 +5,7 @@ import "core:log" import "core:mem" import "core:fmt" import "core:strings" +import "core:path" keyword_map: map[string]bool = { "int" = true, @@ -491,12 +492,6 @@ node_equal_node :: proc(a, b: ^ast.Node) -> bool { } case Poly_Type: return true; - //return node_equal(n.sp) - //if n, ok := a.derived.(Poly_Type); ok { - // ret := node_equal(n.type, m.type); - // ret &= node_equal(n.specialization, m.specialization); - // return ret; - //} case Ellipsis: if n, ok := a.derived.(Ellipsis); ok { return node_equal(n.expr, m.expr); @@ -548,8 +543,10 @@ node_equal_node :: proc(a, b: ^ast.Node) -> bool { } case Array_Type: if n, ok := a.derived.(Array_Type); ok { - ret := node_equal(n.len, m.len); - ret &= node_equal(n.elem, m.elem); + ret := node_equal(n.elem, m.elem); + if n.len != nil && m.len != nil { + ret &= node_equal(n.len, m.len); + } return ret; } case Dynamic_Array_Type: @@ -613,12 +610,193 @@ node_equal_node :: proc(a, b: ^ast.Node) -> bool { } case Typeid_Type: return true; - //if n, ok := a.derived.(Typeid_Type); ok { - // return node_equal(n.specialization, m.specialization); - //} case: log.warn("Unhandled poly node kind: %T", m); } return false; } + +/* + Returns the string representation of a type. This allows us to print the signature without storing it in the indexer as a string(saving memory). +*/ +node_to_string :: proc(node: ^ast.Node) -> string { + + builder := strings.make_builder(context.temp_allocator); + + build_string(node, &builder); + + return strings.to_string(builder); +} + +build_string :: proc{ + build_string_ast_array, + build_string_dynamic_array, + build_string_node, +}; + +build_string_dynamic_array :: proc(array: $A/[]^$T, builder: ^strings.Builder) { + + for elem, i in array { + build_string(elem, builder); + } +} + +build_string_ast_array :: proc(array: $A/[dynamic]^$T, builder: ^strings.Builder) { + + for elem, i in array { + build_string(elem, builder); + } +} + +build_string_node :: proc(node: ^ast.Node, builder: ^strings.Builder) { + + using ast; + + if node == nil { + return; + } + + switch n in node.derived { + case Bad_Expr: + case Ident: + if strings.contains(n.name, "/") { + strings.write_string(builder, path.base(n.name, false, context.temp_allocator)); + } else { + strings.write_string(builder, n.name); + } + case Implicit: + strings.write_string(builder, n.tok.text); + case Undef: + case Basic_Lit: + strings.write_string(builder, n.tok.text); + case Basic_Directive: + strings.write_string(builder, n.name); + case Ellipsis: + build_string(n.expr, builder); + case Proc_Lit: + build_string(n.type, builder); + build_string(n.body, builder); + case Comp_Lit: + build_string(n.type, builder); + build_string(n.elems, builder); + case Tag_Expr: + build_string(n.expr, builder); + case Unary_Expr: + build_string(n.expr, builder); + case Binary_Expr: + build_string(n.left, builder); + build_string(n.right, builder); + case Paren_Expr: + strings.write_string(builder, "("); + build_string(n.expr, builder); + strings.write_string(builder, ")"); + case Call_Expr: + build_string(n.expr, builder); + strings.write_string(builder, "("); + build_string(n.args, builder); + strings.write_string(builder, ")"); + case Selector_Expr: + build_string(n.expr, builder); + strings.write_string(builder, "."); + build_string(n.field, builder); + case Index_Expr: + build_string(n.expr, builder); + strings.write_string(builder, "["); + build_string(n.index, builder); + strings.write_string(builder, "]"); + case Deref_Expr: + build_string(n.expr, builder); + case Slice_Expr: + build_string(n.expr, builder); + build_string(n.low, builder); + build_string(n.high, builder); + case Field_Value: + build_string(n.field, builder); + strings.write_string(builder, ": "); + build_string(n.value, builder); + case Type_Cast: + build_string(n.type, builder); + build_string(n.expr, builder); + case Bad_Stmt: + case Bad_Decl: + case Attribute: + build_string(n.elems, builder); + case Field: + build_string(n.names, builder); + if len(n.names) > 0 && n.type != nil { + strings.write_string(builder, ": "); + build_string(n.type, builder); + + if n.default_value != nil && n.type != nil { + strings.write_string(builder, "="); + } + + } else if len(n.names) > 0 && n.default_value != nil { + strings.write_string(builder, " := "); + } else { + build_string(n.type, builder); + } + + build_string(n.default_value, builder); + case Field_List: + for field, i in n.list { + build_string(field, builder); + if len(n.list) - 1 != i { + strings.write_string(builder, ","); + } + } + case Typeid_Type: + strings.write_string(builder, "$"); + build_string(n.specialization, builder); + case Helper_Type: + build_string(n.type, builder); + case Distinct_Type: + build_string(n.type, builder); + case Poly_Type: + strings.write_string(builder, "$"); + + build_string(n.type, builder); + + if n.specialization != nil { + strings.write_string(builder, "/"); + build_string(n.specialization, builder); + } + case Proc_Type: + strings.write_string(builder, "proc("); + build_string(n.params, builder); + strings.write_string(builder, ") -> "); + build_string(n.results, builder); + case Pointer_Type: + strings.write_string(builder, "^"); + build_string(n.elem, builder); + case Array_Type: + strings.write_string(builder, "["); + build_string(n.len, builder); + strings.write_string(builder, "]"); + build_string(n.elem, builder); + case Dynamic_Array_Type: + strings.write_string(builder, "[dynamic]"); + build_string(n.elem, builder); + case Struct_Type: + build_string(n.poly_params, builder); + build_string(n.align, builder); + build_string(n.fields, builder); + case Union_Type: + build_string(n.poly_params, builder); + build_string(n.align, builder); + build_string(n.variants, builder); + case Enum_Type: + build_string(n.base_type, builder); + build_string(n.fields, builder); + case Bit_Set_Type: + build_string(n.elem, builder); + build_string(n.underlying, builder); + case Map_Type: + strings.write_string(builder, "map"); + strings.write_string(builder, "["); + build_string(n.key, builder); + strings.write_string(builder, "]"); + build_string(n.value, builder); + } +} |