diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2021-05-11 21:52:51 +0200 |
|---|---|---|
| committer | DanielGavin <danielgavin5@hotmail.com> | 2021-05-11 21:52:51 +0200 |
| commit | 98609fccd73cb464dd4659702319dab2fe1c61c1 (patch) | |
| tree | 787f9da10a2332eb8ad8fc345b6ba6ddbb23a4b9 /src | |
| parent | f468b8089cc4ab1e76fac7ed8defb7dc6a65d6c7 (diff) | |
fix read on large files
Diffstat (limited to 'src')
| -rw-r--r-- | src/common/ast.odin | 9 | ||||
| -rw-r--r-- | src/index/collector.odin | 7 | ||||
| -rw-r--r-- | src/server/analysis.odin | 7 | ||||
| -rw-r--r-- | src/server/reader.odin | 22 |
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; } |