aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2021-05-11 21:52:51 +0200
committerDanielGavin <danielgavin5@hotmail.com>2021-05-11 21:52:51 +0200
commit98609fccd73cb464dd4659702319dab2fe1c61c1 (patch)
tree787f9da10a2332eb8ad8fc345b6ba6ddbb23a4b9 /src
parentf468b8089cc4ab1e76fac7ed8defb7dc6a65d6c7 (diff)
fix read on large files
Diffstat (limited to 'src')
-rw-r--r--src/common/ast.odin9
-rw-r--r--src/index/collector.odin7
-rw-r--r--src/server/analysis.odin7
-rw-r--r--src/server/reader.odin22
4 files changed, 35 insertions, 10 deletions
diff --git a/src/common/ast.odin b/src/common/ast.odin
index d110441..96e5151 100644
--- a/src/common/ast.odin
+++ b/src/common/ast.odin
@@ -724,7 +724,14 @@ build_string_node :: proc(node: ^ast.Node, builder: ^strings.Builder) {
case Attribute:
build_string(n.elems, builder);
case Field:
- build_string(n.names, builder);
+
+ for name, i in n.names {
+ build_string(name, builder);
+ if len(n.names) - 1 != i {
+ strings.write_string(builder, ", ");
+ }
+ }
+
if len(n.names) > 0 && n.type != nil {
strings.write_string(builder, ": ");
build_string(n.type, builder);
diff --git a/src/index/collector.odin b/src/index/collector.odin
index f25add8..0bcf02a 100644
--- a/src/index/collector.odin
+++ b/src/index/collector.odin
@@ -129,11 +129,14 @@ collect_enum_fields :: proc(collection: ^SymbolCollection, fields: []^ast.Expr,
//ERROR no hover on n in the for, but elsewhere is fine
for n in fields {
-
if ident, ok := n.derived.(ast.Ident); ok {
append(&names, get_index_unique_string(collection, ident.name));
} else if field, ok := n.derived.(ast.Field_Value); ok {
- append(&names, get_index_unique_string(collection, field.field.derived.(ast.Ident).name));
+ if ident, ok := field.field.derived.(ast.Ident); ok {
+ append(&names, get_index_unique_string(collection, ident.name));
+ } else if binary, ok := field.field.derived.(ast.Binary_Expr); ok {
+ append(&names, get_index_unique_string(collection, binary.left.derived.(ast.Ident).name));
+ }
}
}
diff --git a/src/server/analysis.odin b/src/server/analysis.odin
index af58546..8e56322 100644
--- a/src/server/analysis.odin
+++ b/src/server/analysis.odin
@@ -1539,11 +1539,14 @@ make_symbol_enum_from_ast :: proc(ast_context: ^AstContext, v: ast.Enum_Type) ->
names := make([dynamic]string, context.temp_allocator);
for n in v.fields {
-
if ident, ok := n.derived.(ast.Ident); ok {
append(&names, ident.name);
} else if field, ok := n.derived.(ast.Field_Value); ok {
- append(&names, field.field.derived.(ast.Ident).name);
+ if ident, ok := field.field.derived.(ast.Ident); ok {
+ append(&names, ident.name);
+ } else if binary, ok := field.field.derived.(ast.Binary_Expr); ok {
+ append(&names, binary.left.derived.(ast.Ident).name);
+ }
}
}
diff --git a/src/server/reader.odin b/src/server/reader.odin
index b8843de..a05e147 100644
--- a/src/server/reader.odin
+++ b/src/server/reader.odin
@@ -48,13 +48,25 @@ read_until_delimiter :: proc(reader: ^Reader, delimiter: u8, builder: ^strings.B
return true;
}
-read_sized :: proc(reader: ^Reader, data: []u8) -> bool {
+read_sized :: proc(reader: ^Reader, data: []u8) -> (ok: bool) {
+ ok = true;
+ size := len(data);
+ n := 0;
- read, err := reader.reader_fn(reader.reader_context, data);
+ for n < size && ok {
+ read: int;
+ err_code: int;
- if (err != 0 || read != len(data)) {
- return false;
+ read, err_code = reader.reader_fn(reader.reader_context, data[n:]);
+
+ ok = err_code == 0;
+
+ n += read;
}
- return true;
+ if n >= size {
+ ok = true;
+ }
+
+ return;
}