rls

Repository for the Rust Language Server (aka RLS)

Github stars Tracking Chart

Build Status
Build Status
Nightly status
Nightly status

Rust Language Server (RLS)

The RLS provides a server that runs in the background, providing IDEs,
editors, and other tools with information about Rust programs. It supports
functionality such as 'goto definition', symbol search, reformatting, and code
completion, and enables renaming and refactorings.

A high-level overview of the architecture can be found here.

The RLS gets its source data from the compiler and from
Racer. Where possible it uses data from
the compiler which is precise and complete. Where it is not possible, (for example
for code completion and where building is too slow), it uses Racer.

Since the Rust compiler does not yet support end-to-end incremental compilation,
we can't offer a perfect experience. However, by optimising our use of the
compiler and falling back to Racer, we can offer a pretty good experience for
small to medium sized crates. As the RLS and compiler evolve, we'll offer a
better experience for larger and larger crates.

The RLS is designed to be frontend-independent. We hope it will be widely
adopted by different editors and IDEs. To seed development, we provide a
reference implementation of an RLS frontend
for Visual Studio Code.

Setup

Step 1: Install rustup

You can install rustup on many platforms. This will help us quickly install the
RLS and its dependencies.

If you already have rustup installed, update to ensure you have the latest
rustup and compiler:

rustup update

If you're going to use the VSCode extension, you can skip step 2.

Step 2: Install the RLS

Once you have rustup installed, run the following commands:

rustup component add rls rust-analysis rust-src

error: component 'rls' is unavailable for download (nightly)

The development of rustc's internals is quite fast paced. Downstream projects that rely on nightly internals, particularly clippy, can break fairly often because of this.

When such breakages occur the nightly release will be missing rls. This is a trade-off compared with the other option of just not publishing the night's release, but does avoid blocking the rust nightly releases for people that don't need clippy/rls.

To mitigate the issues we have:

  • rustup will warn if the update is missing any components you currently have. This means you can no longer accidentally update to a no-rls release. Once rls is available again it'll update.
  • rls, clippy are available on the stable channel. Meaning most developers installing for the first time should use stable.
  • However, if you need latest nightly rls you can use https://rust-lang.github.io/rustup-components-history/ to find and install a dated nightly release ie rustup install nightly-2018-12-06.

Also see #641.

Running

The RLS is built to work with many IDEs and editors, we mostly use
VSCode to test the RLS. The easiest way is to use the published extension.

You'll know it's working when you see this in the status bar at the bottom, with
a spinning indicator:

RLS: working ◐

Once you see:

RLS

Then you have the full set of capabilities available to you. You can goto def,
find all refs, rename, goto type, etc. Completions are also available using the
heuristics that Racer provides. As you type, your code will be checked and
error squiggles will be reported when errors occur. You can hover these
squiggles to see the text of the error.

Configuration

The RLS can be configured on a per-project basis; using the Visual
Studio Code extension this will be done via the workspace settings file
settings.json.

Other editors will have their own way of sending the
workspace/DidChangeConfiguration
method.

Entries in this file will affect how the RLS operates and how it builds your
project.

Currently we accept the following options:

  • unstable_features (bool, defaults to false) enables unstable features.
    Currently no option requires this flag.
  • sysroot (String, defaults to "") if the given string is not empty, use
    the given path as the sysroot for all rustc invocations instead of trying to
    detect the sysroot automatically
  • target (String, defaults to "") if the given string is not empty, use
    the given target triple for all rustc invocations
  • wait_to_build (u64) overrides build debounce duration (ms). This is otherwise automatically
    inferred by the latest build duration.
  • all_targets (bool, defaults to true) checks the project as if you were
    running cargo check --all-targets. I.e., check all targets and integration
    tests too
  • crate_blacklist ([String], defaults to this list)
    allows to specify which crates should be skipped by the RLS.
    By default skips libraries that are of considerable size but which the user
    often may not be directly interested in, thus reducing the build latency.
  • build_on_save (bool, defaults to false) toggles whether the RLS should
    perform continuous analysis or only after a file is saved
  • features ([String], defaults to empty) list of Cargo features to enable
  • all_features (bool, defaults to false) enables all Cargo features
  • no_default_features (bool, defaults to false) disables default Cargo
    features
  • racer_completion (bool, defaults to true) enables code completion using
    racer (which is, at the moment, our only code completion backend). Also enables
    hover tooltips & go-to-definition to fall back to racer when save-analysis data is unavailable.
  • clippy_preference (String, defaults to "opt-in") controls eagerness of clippy
    diagnostics when available. Valid values are (case-insensitive):
    • "off" Disable clippy lints.
    • "on" Display the same diagnostics as command-line clippy invoked with no arguments (clippy::all unless overridden).
    • "opt-in" Only display the lints explicitly enabled in the code. Start by adding #![warn(clippy::all)] to the root of each crate you want linted.

and the following unstable options:

  • build_lib (bool, defaults to false) checks the project as if you passed
    the --lib argument to cargo. Mutually exclusive with, and preferred over,
    build_bin.
  • build_bin (String, defaults to "") checks the project as if you passed
    -- bin <build_bin> argument to cargo. Mutually exclusive with build_lib.
  • cfg_test (bool, defaults to false) checks the project as if you were
    running cargo test rather than cargo build. I.e., compiles (but does not
    run) test code.
  • full_docs (bool, defaults to false) instructs rustc to populate the
    save-analysis data with full source documentation. When set to false, only the
    first paragraph is recorded. This option currently has little to no effect on
    hover tooltips. The save-analysis docs are only used if source extraction fails.
    This option has no effect on the standard library.
  • show_hover_context (bool, defaults to true) show additional context in
    hover tooltips when available. This is often the local variable declaration.
    When set to false the content is only available when holding the ctrl key in
    some editors.

Troubleshooting

For tips on debugging and troubleshooting, see debugging.md.

Contributing

You can look in the contributing.md
in this repo to learn more about contributing to this project.

If you want to implement RLS support in an editor, see clients.md.

Main metrics

Overview
Name With Ownerrust-lang/rls
Primary LanguageRust
Program languageRust (Language Count: 2)
Platform
License:Other
所有者活动
Created At2016-08-30 21:42:03
Pushed At2022-08-29 21:32:29
Last Commit At2022-08-29 23:32:29
Release Count30
Last Release Namerls-analysis/0.18.3 (Posted on )
First Release Namealpha (Posted on 2017-01-18 17:17:26)
用户参与
Stargazers Count3.5k
Watchers Count80
Fork Count255
Commits Count2.4k
Has Issues Enabled
Issues Count1001
Issue Open Count289
Pull Requests Count676
Pull Requests Open Count4
Pull Requests Close Count103
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private