aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/analysis.odin30
-rw-r--r--src/server/file_resolve.odin2
-rw-r--r--src/server/references.odin11
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,