Code Hinting for Rust is really Slow
- Dominant language
- CodeQL
- Stars
- 10.1k
- Forks
- 2.1k
- Avg merge
- 2d 15h
- Merged PRs (30d)
- 141
Description
## Version
- CodeQL: CodeQL command-line toolchain release 2.23.8.
- VS Code CodeQL extension version: 1.17.7
- VS Code version: Version: 1.107.1 (Universal)
- Platform: MacOS
## **Description of the issue**
Currently, I'm writing CodeQL for Rust in VS Code; however, the code hinting is really slow, and the issue does not exist when writing a ql script for GoLang.
Here are some parts of the logs in CodeQL Language Server.
```log
{"jsonrpc":"2.0","id":1245,"result":[{"name":"AstNodeImpl","kind":2,"range":{"start":{"line":0,"character":0},"end":{"line":119,"character":0}},"selectionRange":{"start":{"line":0,"character":0},"end":{"line":119,"character":0}},"detail":"","children":[{"name":"Impl","kind":2,"range":{"start":{"line":9,"character":0},"end":{"line":118,"character":1}},"selectionRange":{"start":{"line":13,"character":7},"end":{"line":13,"character":11}},"detail":"","children":[{"name":"AstNode","kind":5,"range":{"start":{"line":31,"character":2},"end":{"line":117,"character":3}},"selectionRange":{"start":{"line":31,"character":8},"end":{"line":31,"character":15}},"detail":"","children":[{"name":"getParentNode","kind":6,"range":{"start":{"line":32,"character":4},"end":{"line":37,"character":86}},"selectionRange":{"start":{"line":37,"character":12},"end":{"line":37,"character":25}},"detail":"","children":[]},{"name":"getEnclosingCallable","kind":6,"range":{"start":{"line":39,"character":4},"end":{"line":48,"character":5}},"selectionRange":{"start":{"line":41,"character":13},"end":{"line":41,"character":33}},"detail":"","children":[]},{"name":"getEnclosingCfgScope","kind":6,"range":{"start":{"line":50,"character":4},"end":{"line":59,"character":5}},"selectionRange":{"start":{"line":52,"character":13},"end":{"line":52,"character":33}},"detail":"","children":[]},{"name":"hasEnclosingCfgScope","kind":6,"range":{"start":{"line":61,"character":4},"end":{"line":62,"character":76}},"selectionRange":{"start":{"line":62,"character":14},"end":{"line":62,"character":34}},"detail":"","children":[]},{"name":"getEnclosingBlock","kind":6,"range":{"start":{"line":64,"character":4},"end":{"line":73,"character":5}},"selectionRange":{"start":{"line":66,"character":14},"end":{"line":66,"character":31}},"detail":"","children":[]},{"name":"isInMacroExpansion","kind":6,"range":{"start":{"line":75,"character":4},"end":{"line":76,"character":92}},"selectionRange":{"start":{"line":76,"character":14},"end":{"line":76,"character":32}},"detail":"","children":[]},{"name":"isFromMacroExpansion","kind":6,"range":{"start":{"line":78,"character":4},"end":{"line":84,"character":96}},"selectionRange":{"start":{"line":84,"character":14},"end":{"line":84,"character":34}},"detail":"","children":[]},{"name":"getACfgNode","kind":6,"range":{"start":{"line":86,"character":4},"end":{"line":116,"character":56}},"selectionRange":{"start":{"line":116,"character":12},"end":{"line":116,"character":23}},"detail":"","children":[]}]},{"name":"getParentOfAstStep","kind":6,"range":{"start":{"line":19,"character":2},"end":{"line":29,"character":3}},"selectionRange":{"start":{"line":26,"character":18},"end":{"line":26,"character":36}},"detail":"","children":[]}]}]}]}Content-Length: 1926
{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///Users/johnzhu/Workspace/codeql-lab/rust-ql/solana-queries/src/signer-authorization.ql","diagnostics":[{"range":{"start":{"line":39,"character":19},"end":{"line":39,"character":30}},"severity":1,"source":"","message":"regexpMatch(string) cannot be resolved for type NameImpl::Impl::Name"},{"range":{"start":{"line":41,"character":11},"end":{"line":41,"character":19}},"severity":1,"source":"","message":"could not resolve type PathType"},{"range":{"start":{"line":42,"character":16},"end":{"line":42,"character":21}},"severity":1,"source":"","message":"getTy() cannot be resolved for type SuspiciousAccountField.extends"},{"range":{"start":{"line":54,"character":13},"end":{"line":54,"character":21}},"severity":1,"source":"","message":"could not resolve type PathType"},{"range":{"start":{"line":55,"character":24},"end":{"line":55,"character":29}},"severity":1,"source":"","message":"getTy() cannot be resolved for type ParamImpl::Impl::Param"},{"range":{"start":{"line":57,"character":77},"end":{"line":57,"character":82}},"severity":1,"source":"","message":"getTy() cannot be resolved for type TypeArgImpl::Impl::TypeArg"},{"range":{"start":{"line":57,"character":86},"end":{"line":57,"character":94}},"severity":1,"source":"","message":"could not resolve type PathType"},{"range":{"start":{"line":58,"character":15},"end":{"line":58,"character":33}},"severity":1,"source":"","message":"getRecordFieldList() cannot be resolved for type SuspiciousAccountField"},{"range":{"start":{"line":74,"character":18},"end":{"line":74,"character":28}},"severity":1,"source":"","message":"getNameRef() cannot be resolved for type FieldExprImpl::Impl::FieldExpr"},{"range":{"start":{"line":77,"character":25},"end":{"line":77,"character":32}},"severity":1,"source":"","message":"getExpr() cannot be resolved for type FieldExprImpl::Impl::FieldExpr"}]}}[2025-12-24 11:48:51] ExternalModuleBindingPass ...
[2025-12-24 11:48:51] ExternalModuleBindingPass time: 00:00.000
[2025-12-24 11:48:51] CollectInstantiationsPass ...
[2025-12-24 11:48:51] CollectInstantiationsPass time: 00:00.000
[2025-12-24 11:48:51] Ql checks ...
Content-Length: 394
{"jsonrpc":"2.0","id":1244,"result":[{"range":{"start":{"line":37,"character":12},"end":{"line":37,"character":25}},"kind":3},{"range":{"start":{"line":42,"character":29},"end":{"line":42,"character":49}},"kind":2},{"range":{"start":{"line":53,"character":29},"end":{"line":53,"character":49}},"kind":2},{"range":{"start":{"line":67,"character":29},"end":{"line":67,"character":49}},"kind":2}]}Content-Length: 222
{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///Users/johnzhu/Workspace/codeql-lab/codeql/qlpacks/codeql/rust-all/0.2.2/codeql/rust/elements/internal/AstNodeImpl.qll","diagnostics":[]}}[2025-12-24 11:48:51] Ql checks time: 00:00.286
[2025-12-24 11:48:51] ExternalModuleBindingPass ...
[2025-12-24 11:48:51] ExternalModuleBindingPass time: 00:00.000
[2025-12-24 11:48:51] CollectInstantiationsPass ...
[2025-12-24 11:48:51] CollectInstantiationsPass time: 00:00.000
[2025-12-24 11:48:51] Ql checks ...
[2025-12-24 11:48:51] Ql checks time: 00:00.000
[2025-12-24 11:48:54] ExternalModuleBindingPass ...
[2025-12-24 11:48:54] ExternalModuleBindingPass time: 00:00.001
[2025-12-24 11:48:54] CollectInstantiationsPass ...
[2025-12-24 11:48:54] CollectInstantiationsPass time: 00:00.000
Content-Length: 149
{"jsonrpc":"2.0","id":1246,"error":{"code":-32800,"message":"The request (id: 1246, method: \u0027textDocument/inlayHint\u0027) has been cancelled"}}Content-Length: 1619
{"jsonrpc":"2.0","id":1247,"result":[{"name":"signer-authorization","kind":2,"range":{"start":{"line":0,"character":0},"end":{"line":93,"character":0}},"selectionRange":{"start":{"line":0,"character":0},"end":{"line":93,"character":0}},"detail":"","children":[{"name":"AccountsStruct","kind":5,"range":{"start":{"line":16,"character":0},"end":{"line":28,"character":1}},"selectionRange":{"start":{"line":20,"character":6},"end":{"line":20,"character":20}},"detail":"","children":[{"name":"AccountsStruct","kind":9,"range":{"start":{"line":21,"character":2},"end":{"line":27,"character":3}},"selectionRange":{"start":{"line":21,"character":2},"end":{"line":21,"character":16}},"detail":"","children":[]}]},{"name":"SuspiciousAccountField","kind":5,"range":{"start":{"line":30,"character":0},"end":{"line":83,"character":1}},"selectionRange":{"start":{"line":34,"character":6},"end":{"line":34,"character":28}},"detail":"","children":[{"name":"SuspiciousAccountField","kind":9,"range":{"start":{"line":35,"character":2},"end":{"line":46,"character":3}},"selectionRange":{"start":{"line":35,"character":2},"end":{"line":35,"character":24}},"detail":"","children":[]},{"name":"getUsingFunction","kind":6,"range":{"start":{"line":48,"character":2},"end":{"line":66,"character":3}},"selectionRange":{"start":{"line":51,"character":11},"end":{"line":51,"character":27}},"detail":"","children":[]},{"name":"hasSignerCheck","kind":6,"range":{"start":{"line":68,"character":2},"end":{"line":82,"character":3}},"selectionRange":{"start":{"line":71,"character":12},"end":{"line":71,"character":26}},"detail":"","children":[]}]}]}]}Content-Length: 1619
{"jsonrpc":"2.0","id":1249,"result":[{"name":"signer-authorization","kind":2,"range":{"start":{"line":0,"character":0},"end":{"line":93,"character":0}},"selectionRange":{"start":{"line":0,"character":0},"end":{"line":93,"character":0}},"detail":"","children":[{"name":"AccountsStruct","kind":5,"range":{"start":{"line":16,"character":0},"end":{"line":28,"character":1}},"selectionRange":{"start":{"line":20,"character":6},"end":{"line":20,"character":20}},"detail":"","children":[{"name":"AccountsStruct","kind":9,"range":{"start":{"line":21,"character":2},"end":{"line":27,"character":3}},"selectionRange":{"start":{"line":21,"character":2},"end":{"line":21,"character":16}},"detail":"","children":[]}]},{"name":"SuspiciousAccountField","kind":5,"range":{"start":{"line":30,"character":0},"end":{"line":83,"character":1}},"selectionRange":{"start":{"line":34,"character":6},"end":{"line":34,"character":28}},"detail":"","children":[{"name":"SuspiciousAccountField","kind":9,"range":{"start":{"line":35,"character":2},"end":{"line":46,"character":3}},"selectionRange":{"start":{"line":35,"character":2},"end":{"line":35,"character":24}},"detail":"","children":[]},{"name":"getUsingFunction","kind":6,"range":{"start":{"line":48,"character":2},"end":{"line":66,"character":3}},"selectionRange":{"start":{"line":51,"character":11},"end":{"line":51,"character":27}},"detail":"","children":[]},{"name":"hasSignerCheck","kind":6,"range":{"start":{"line":68,"character":2},"end":{"line":82,"character":3}},"selectionRange":{"start":{"line":71,"character":12},"end":{"line":71,"character":26}},"detail":"","children":[]}]}]}]}[2025-12-24 11:49:02] ExternalModuleBindingPass ...
[2025-12-24 11:49:02] ExternalModuleBindingPass time: 00:00.000
[2025-12-24 11:49:02] CollectInstantiationsPass ...
[2025-12-24 11:49:02] CollectInstantiationsPass time: 00:00.000
Content-Length: 145
{"jsonrpc":"2.0","id":1251,"error":{"code":-32800,"message":"The request (id: 1251, method: \u0027textDocument/hover\u0027) has been cancelled"}}[2025-12-24 11:49:03] ExternalModuleBindingPass ...
[2025-12-24 11:49:03] ExternalModuleBindingPass time: 00:00.000
[2025-12-24 11:49:03] CollectInstantiationsPass ...
[2025-12-24 11:49:03] CollectInstantiationsPass time: 00:00.000
Content-Length: 126
{"jsonrpc":"2.0","id":1248,"result":[{"range":{"start":{"line":37,"character":4},"end":{"line":37,"character":24}},"kind":2}]}[2025-12-24 11:49:10] ExternalModuleBindingPass ...
[2025-12-24 11:49:10] ExternalModuleBindingPass time: 00:00.000
[2025-12-24 11:49:10] CollectInstantiationsPass ...
[2025-12-24 11:49:10] CollectInstantiationsPass time: 00:00.000
```
Contributor guide
Research direction
Start by reproducing the slow CodeQL hinting in VS Code with the reported Rust query files, especially solana-queries/src/signer-authorization.ql and rust/elements/internal/AstNodeImpl.qll. Review the CodeQL Language Server logs around textDocument/inlayHint and textDocument/hover, then compare the behavior with Go. Done means the Rust editor requests complete responsively without cancellation or the reported unresolved diagnostics.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust, vscode
- Domain
- developer-experience, tooling
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100