Repository navigation
Open
Labels
enhancementNew feature or requestNew feature or requesthelp-wantedExtra attention is neededExtra attention is neededpinnedThis issue or pull request is pinned and won't be marked as staleThis issue or pull request is pinned and won't be marked as staleserverThis pull request should be included in the server gem's release notesThis pull request should be included in the server gem's release notes
Description
Description
Ruby LSP Information
VS Code Version
1.97.0-insider
Ruby LSP Extension Version
0.8.19
Ruby LSP Server Version
0.23.7
Ruby LSP Add-ons
- Ruby LSP Rails
- RuboCop
Ruby Version
3.4.1
Ruby Version Manager
rbenv
Installed Extensions
Click to expand
- catppuccin-vsc (3.16.0)
- dotenv (1.0.1)
- prettier-vscode (11.0.0)
- ruby-extensions-pack (0.1.12)
- ruby-lsp (0.8.19)
- sorbet-vscode-extension (0.3.37)
- vim (1.29.0)
- vscode-eslint (3.0.10)
- vscode-mdx (1.8.13)
- vscode-ruby (0.28.0)
Ruby LSP Settings
Click to expand
Workspace
{}User
{
"enabledFeatures": {
"codeActions": true,
"diagnostics": true,
"documentHighlights": true,
"documentLink": true,
"documentSymbols": true,
"foldingRanges": true,
"formatting": true,
"hover": true,
"inlayHint": true,
"onTypeFormatting": true,
"selectionRanges": true,
"semanticHighlighting": true,
"completion": true,
"codeLens": true,
"definition": true,
"workspaceSymbol": true,
"signatureHelp": true,
"typeHierarchy": true
},
"featuresConfiguration": {},
"addonSettings": {},
"rubyVersionManager": {
"identifier": "auto"
},
"customRubyCommand": "",
"formatter": "auto",
"linters": null,
"bundleGemfile": "",
"testTimeout": 30,
"branch": "",
"pullDiagnosticsOn": "both",
"useBundlerCompose": false,
"bypassTypechecker": false,
"rubyExecutablePath": "",
"indexing": {},
"erbSupport": true,
"featureFlags": {}
}Reproduction steps
Add the following test case in Rails 8 and try to rename the variable password:
def test_password_is_not_too_short
password = "w" * (User::MIN_PASSWORD_LENGTH - 1)
@user.password = password
@user.password_confirmation = password
endGetting the error message The element can't be renamed.
Neovim
Same issue in neovim. But message is different though:
ruby-lsp --version: 0.23.6
Question
I am not sure if this is a bug. Maybe this is a limitation of Ruby-lsp. Please close the issue if this issue is scoped to be fixed as part of the roadmap or if it cannot be fixed.
Reacted by Percy Grunwald, Chris Lynch and Marcus Wyatt
Reacted by Piotr Włodarek and Marcus Wyatt
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or requesthelp-wantedExtra attention is neededExtra attention is neededpinnedThis issue or pull request is pinned and won't be marked as staleThis issue or pull request is pinned and won't be marked as staleserverThis pull request should be included in the server gem's release notesThis pull request should be included in the server gem's release notes
Activity
vinistock commentedon Jan 30, 2025
Thank you for the report. This is not a bug, we just haven't implemented reference tracking for locals yet. I'll change the title and labels to make that clearer, since we don't have an issue for this created yet.
[-]Getting `The element can't be renamed` message when trying to rename a variable in both VSCode as well as Neovim[/-][+]Implement find references and rename for locals[/+]andyw8 commentedon Jan 30, 2025
We can also update the docs: #3113
qertoip commentedon Apr 14, 2025
Coming from JetBrains IDEs this feature not present feels like I lost my left hand ;-)
I am renaming my locals and methods all day long.
Would love to see this added!
percygrunwald commentedon Jan 6, 2026
Presuming that this would also allow
Go to Definitionto work for locals as well. At the moment, attempting to go to a definition of a variable showsNo definition found for '...':For comparison, with the Pylance extension the editor exhibits the expected behavior of jumping to the variable definition:
If not, I'm happy to create a separate issue for this expected behavior. Thanks!
Mohith26 commentedon Nov 4, 2026
I'd like to take this one. Plan, since it touches a few requests:
Requests::Support::LocalVariableFinder) that groups every local occurrence by its declaring scope using thedepthPrism already stores on local variable nodes. Def/class/module/singleton class are hard boundaries, blocks and lambdas see their parents. It covers parameters of all kinds, block locals, multi-assign/for/rescue targets, pattern matching, regexp named captures and{ name: }shorthands.typed: truefiles, where Sorbet already handles it).{ name: }becomes{ name: new_name }), and refuses keyword parameters since callers pass them by name.It doesn't depend on the index, so it should carry over to the Rubydex branch with only the small hooks in each request changing. Happy to adjust if you'd rather scope it differently.