diff options
Diffstat (limited to 'src/server/position_context.odin')
| -rw-r--r-- | src/server/position_context.odin | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/server/position_context.odin b/src/server/position_context.odin index 33de8f3..7687d01 100644 --- a/src/server/position_context.odin +++ b/src/server/position_context.odin @@ -1,10 +1,11 @@ +#+feature using-stmt package server -import "core:strings" import "core:log" import "core:odin/ast" import "core:odin/parser" import "core:odin/tokenizer" +import "core:strings" import "core:unicode/utf8" import "src:common" @@ -61,11 +62,36 @@ DocumentPositionContext :: struct { import_stmt: ^ast.Import_Decl, type_cast: ^ast.Type_Cast, call_commas: []int, + directive: ^ast.Basic_Directive, +} + + +get_stmt_attrs :: proc(decl: ^ast.Stmt) -> []^ast.Attribute { + if decl == nil { + return nil + } + #partial switch v in decl.derived { + case ^ast.Value_Decl: + return v.attributes[:] + case ^ast.Import_Decl: + return v.attributes[:] + case ^ast.Foreign_Block_Decl: + return v.attributes[:] + case ^ast.Foreign_Import_Decl: + return v.attributes[:] + } + return nil } get_document_position_decls :: proc(decls: []^ast.Stmt, position_context: ^DocumentPositionContext) -> bool { exists_in_decl := false for decl in decls { + for attr in get_stmt_attrs(decl) { + if position_in_node(attr, position_context.position) { + get_document_position(attr, position_context) + return true + } + } if position_in_node(decl, position_context.position) { get_document_position(decl, position_context) exists_in_decl = true @@ -820,6 +846,11 @@ get_document_position_node :: proc(node: ^ast.Node, position_context: ^DocumentP position_context.struct_type = n get_document_position(n.poly_params, position_context) get_document_position(n.align, position_context) + for clause in n.where_clauses { + if position_in_node(clause, position_context.position) { + get_document_position(clause, position_context) + } + } get_document_position(n.fields, position_context) case ^Union_Type: position_context.union_type = n @@ -857,6 +888,8 @@ get_document_position_node :: proc(node: ^ast.Node, position_context: ^DocumentP get_document_position(n.name, position_context) get_document_position(n.type, position_context) get_document_position(n.bit_size, position_context) + case ^Basic_Directive: + position_context.directive = n case: } } |