diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/analysis.odin | 30 | ||||
| -rw-r--r-- | src/server/file_resolve.odin | 2 | ||||
| -rw-r--r-- | src/server/references.odin | 11 |
3 files changed, 30 insertions, 13 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 99b2acb..c482206 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -33,6 +33,7 @@ DocumentPositionContext :: struct { selector: ^ast.Expr, //used for completion selector_expr: ^ast.Node, identifier: ^ast.Node, + label: ^ast.Ident, implicit_context: ^ast.Implicit, tag: ^ast.Node, field: ^ast.Expr, //used for completion @@ -4838,6 +4839,19 @@ position_in_node :: proc( ) } +get_document_position_label :: proc( + label: ^ast.Expr, + position_context: ^DocumentPositionContext, +) { + if label == nil { + return + } + + if ident, ok := label.derived.(^ast.Ident); ok { + position_context.label = ident + } +} + get_document_position_node :: proc( node: ^ast.Node, position_context: ^DocumentPositionContext, @@ -4983,10 +4997,10 @@ get_document_position_node :: proc( get_document_position(n.lhs, position_context) get_document_position(n.rhs, position_context) case ^Block_Stmt: - get_document_position(n.label, position_context) + get_document_position_label(n.label, position_context) get_document_position(n.stmts, position_context) case ^If_Stmt: - get_document_position(n.label, position_context) + get_document_position_label(n.label, position_context) get_document_position(n.init, position_context) get_document_position(n.cond, position_context) get_document_position(n.body, position_context) @@ -5001,13 +5015,13 @@ get_document_position_node :: proc( case ^Defer_Stmt: get_document_position(n.stmt, position_context) case ^For_Stmt: - get_document_position(n.label, position_context) + get_document_position_label(n.label, position_context) get_document_position(n.init, position_context) get_document_position(n.cond, position_context) get_document_position(n.post, position_context) get_document_position(n.body, position_context) case ^Range_Stmt: - get_document_position(n.label, position_context) + get_document_position_label(n.label, position_context) get_document_position(n.vals, position_context) get_document_position(n.expr, position_context) get_document_position(n.body, position_context) @@ -5023,18 +5037,18 @@ get_document_position_node :: proc( get_document_position(n.body, position_context) case ^Switch_Stmt: position_context.switch_stmt = cast(^Switch_Stmt)node - get_document_position(n.label, position_context) + get_document_position_label(n.label, position_context) get_document_position(n.init, position_context) get_document_position(n.cond, position_context) get_document_position(n.body, position_context) case ^Type_Switch_Stmt: position_context.switch_type_stmt = cast(^Type_Switch_Stmt)node - get_document_position(n.label, position_context) + get_document_position_label(n.label, position_context) get_document_position(n.tag, position_context) get_document_position(n.expr, position_context) get_document_position(n.body, position_context) case ^Branch_Stmt: - get_document_position(n.label, position_context) + get_document_position_label(n.label, position_context) case ^Using_Stmt: get_document_position(n.list, position_context) case ^Bad_Decl: @@ -5130,8 +5144,8 @@ get_document_position_node :: proc( get_document_position(n.type, position_context) get_document_position(n.bit_size, position_context) case ^ast.Or_Branch_Expr: + get_document_position_label(n.label, position_context) get_document_position(n.expr, position_context) - get_document_position(n.label, position_context) case: } } diff --git a/src/server/file_resolve.odin b/src/server/file_resolve.odin index 48835e8..64bdd56 100644 --- a/src/server/file_resolve.odin +++ b/src/server/file_resolve.odin @@ -197,7 +197,7 @@ resolve_node :: proc(node: ^ast.Node, data: ^FileResolveData) { if data.flag != .None { if symbol, ok := resolve_location_selector(data.ast_context, n); ok { - if data.flag == .Field { + if data.flag != .Base { data.symbols[cast(uintptr)node] = SymbolAndNode { node = n.field, symbol = symbol, diff --git a/src/server/references.odin b/src/server/references.odin index 0fa739e..d56ae62 100644 --- a/src/server/references.odin +++ b/src/server/references.odin @@ -69,8 +69,6 @@ resolve_references :: proc( pkg := "" when !ODIN_TEST { - filepath.walk(common.get_executable_path(), walk_directories, document) - for workspace in common.config.workspace_folders { uri, _ := common.parse_uri(workspace.uri, context.temp_allocator) filepath.walk(uri.path, walk_directories, document) @@ -79,7 +77,10 @@ resolve_references :: proc( reset_ast_context(ast_context) - if position_context.struct_type != nil { + + if position_context.label != nil { + return {}, true + } else if position_context.struct_type != nil { found := false done_struct: for field in position_context.struct_type.fields.list { for name in field.names { @@ -223,6 +224,8 @@ resolve_references :: proc( if !ok { return {}, true } + } else { + return {}, true } arena: runtime.Arena @@ -310,7 +313,7 @@ resolve_references :: proc( } } - if in_pkg { + if in_pkg || symbol.pkg == document.package_name { symbols_and_nodes := resolve_entire_file( &document, resolve_flag, |