Skip to content

LSP doesn't run without YJIT (breaks on non-CRuby) #2908

Open
@nirvdrum

Description

@nirvdrum

Description

The collection of the Ruby LSP information will not work, presumably because it assumes YJIT is available (e.g., doesn't work with TruffleRuby). I've collected it from another window running with CRuby and tried to manually hack it together:

Ruby LSP Info

### Ruby LSP Information

#### VS Code Version

1.95.3

#### Ruby LSP Extension Version

0.8.14

#### Ruby LSP Server Version

0.22.1

#### Ruby LSP Addons



#### Ruby Version

3.3.5

#### Ruby Version Manager

none

Failed to setup the bundle: Command failed: gem list ruby-lsp language_server-protocol prism rbs sorbet-runtime ERROR: truffleruby: invalid option --yjit (Use --help for usage instructions.) . See Troubleshooting for help

Reproduction steps

  1. Use TruffleRuby for your project (e.g., truffleruby-24.1.1 from ruby-build)
  2. Start the Ruby LSP using VS Code
  3. Open a Ruby file
  4. See the LSP fail to activate because the --yjit flag is invalid

Code snippet or error message

The console output suggests that it will only enable YJIT if RubyVM::YJIT is defined:

2024-11-25 11:16:27.635 [info] (nuevo-protobuf) Discovered version manager shadowenv
2024-11-25 11:16:27.641 [info] (nuevo-protobuf) Found shadowenv executable at /opt/homebrew/bin
2024-11-25 11:16:27.642 [info] (nuevo-protobuf) Running command: `/opt/homebrew/bin/shadowenv exec -- ruby -W0 -rjson -e 'STDERR.print("RUBY_LSP_ACTIVATION_SEPARATOR" + { env: ENV.to_h, yjit: !!defined?(RubyVM::YJIT), version: RUBY_VERSION, gemPath: Gem.path }.to_json + "RUBY_LSP_ACTIVATION_SEPARATOR")'` in /Users/nirvdrum/src/github.com/Shopify/nuevo-protobuf using shell: /opt/homebrew/bin/fish

However, I see an error dialog with:

Failed to setup the bundle: Command failed: gem list ruby-lsp language_server-protocol prism rbs sorbet-runtime ERROR: truffleruby: invalid option --yjit (Use --help for usage instructions.) . See [Troubleshooting](https://shopify.github.io/ruby-lsp/troubleshooting.html) for help

Browsing the code, I think the issue is:

this.yjitEnabled = (yjit && major > 3) || (major === 3 && minor >= 2);

TruffleRuby 24.1.1 reports as being Ruby 3.2.4 compatible. While dev builds of TruffleRuby 24.2.0-dev now report as 3.3.5. The check for whether YJIT is available needs to consider more context than just the Ruby version number. I think the check for RubyVM::YJIT is the best approach since it's possible to have a CRuby build without YJIT, so checking for RUBY_ENGINE == "ruby" may be insufficient.

I haven't tried running with JRuby, but I strongly suspect the LSP doesn't run there for similar reasons.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingpinnedThis issue or pull request is pinned and won't be marked as stalevscodeThis pull request should be included in the VS Code extension's release notes

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions