From 3c05ab67cd6b811a0993e49f2ca1ed75e0aca8e3 Mon Sep 17 00:00:00 2001 From: DanielGavin Date: Wed, 12 Jun 2024 22:36:30 +0200 Subject: Fix issues with references now showing the definition itself if in another package. --- README.md | 4 +++- editors/vscode/package-lock.json | 34 +++++++++++++++++----------------- editors/vscode/package.json | 4 ++-- src/server/analysis.odin | 30 ++++++++++++++++++++++-------- src/server/file_resolve.odin | 2 +- src/server/references.odin | 11 +++++++---- 6 files changed, 52 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index fda3e28..b528c63 100644 --- a/README.md +++ b/README.md @@ -125,8 +125,10 @@ Support Language server features: - Completion - Go to definition -- Semantic tokens(really unstable and unfinished) +- Semantic tokens - Document symbols +- Rename +- References - Signature help - Hover diff --git a/editors/vscode/package-lock.json b/editors/vscode/package-lock.json index da86bd6..26b64a9 100644 --- a/editors/vscode/package-lock.json +++ b/editors/vscode/package-lock.json @@ -11,7 +11,7 @@ "adm-zip": "^0.5.9", "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.7", - "vscode-languageclient": "8.1.0" + "vscode-languageclient": "9.0.1" }, "devDependencies": { "@types/glob": "^7.2.0", @@ -3176,24 +3176,24 @@ } }, "node_modules/vscode-jsonrpc": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", - "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageclient": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.1.0.tgz", - "integrity": "sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz", + "integrity": "sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==", "dependencies": { "minimatch": "^5.1.0", "semver": "^7.3.7", - "vscode-languageserver-protocol": "3.17.3" + "vscode-languageserver-protocol": "3.17.5" }, "engines": { - "vscode": "^1.67.0" + "vscode": "^1.82.0" } }, "node_modules/vscode-languageclient/node_modules/brace-expansion": { @@ -3216,18 +3216,18 @@ } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", - "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", "dependencies": { - "vscode-jsonrpc": "8.1.0", - "vscode-languageserver-types": "3.17.3" + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" } }, "node_modules/vscode-languageserver-types": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", - "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" }, "node_modules/vscode-test": { "version": "1.6.1", diff --git a/editors/vscode/package.json b/editors/vscode/package.json index abbd4d7..021a214 100644 --- a/editors/vscode/package.json +++ b/editors/vscode/package.json @@ -7,7 +7,7 @@ "type": "git", "url": "git://github.com/DanielGavin/ols.git" }, - "version": "0.1.27", + "version": "0.1.29", "engines": { "vscode": "^1.66.0" }, @@ -150,7 +150,7 @@ "adm-zip": "^0.5.9", "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.7", - "vscode-languageclient": "8.1.0" + "vscode-languageclient": "9.0.1" }, "configurationDefaults": { "[odin]": { 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, -- cgit v1.2.3