aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2021-05-09 19:37:24 +0200
committerGitHub <noreply@github.com>2021-05-09 19:37:24 +0200
commit84d844bd4ad9320d00ea5f025a9ca44bf74c6ee7 (patch)
tree87c7e9d164e1da62c5cf4a3dff0cc9dea3f6e1d1 /src/common
parent87d4464e91f8b5784ba20e6ef78c818092afb9a9 (diff)
parent9c2090e0395d68bb9a89cfd3f69f863375a27f54 (diff)
Merge pull request #39 from DanielGavin/procedure-arguments
begun argument underlining
Diffstat (limited to 'src/common')
-rw-r--r--src/common/ast.odin200
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);
+ }
+}