rust-lang / rust-lang/rust-analyzer

Duplicate patterns specified for didChangeWatchedFiles

Open
#15,448 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

C-bug
Dominant language
Rust
Stars
16.9k
Forks
2.2k
Avg merge
1d 12h
Merged PRs (30d)
72

Description

rust-analyzer version: 2023-05-15

rustc version: 1.70.0

relevant settings: defaults

I'm not sure if this is even an issue (might depend on the client) but I've noticed that rust-analyzer sets up didChangeWatchedFiles capability with duplicated patterns. For example:

{
  "registrations": [
    {
      "id": "workspace/didChangeWatchedFiles",
      "method": "workspace/didChangeWatchedFiles",
      "registerOptions": {
        "watchers": [
          {
            "globPattern": "/usr/local/workspace/temp/peace/examples/download/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/examples/download/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/examples/download/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/examples/envman/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/examples/envman/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/examples/envman/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/cfg/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/cfg/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/cfg/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/cmd/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/cmd/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/cmd/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/code_gen/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/code_gen/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/code_gen/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/core/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/core/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/core/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/data/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/data/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/data/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/data_derive/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/data_derive/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/data_derive/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/diff/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/diff/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/diff/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/fmt/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/fmt/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/fmt/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/blank/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/blank/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/blank/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/file_download/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/file_download/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/file_download/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/sh_cmd/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/sh_cmd/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/sh_cmd/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/tar_x/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/tar_x/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/tar_x/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/items/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/params/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/params/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/params/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/params_derive/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/params_derive/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/params_derive/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/resources/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/resources/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/resources/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model_core/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model_core/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model_core/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model_hack/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model_hack/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model_hack/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model_native/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model_native/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model_native/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model_web/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model_web/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/rt_model_web/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/static_check_macros/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/static_check_macros/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/crate/static_check_macros/**/Cargo.lock"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/workspace_tests/**/*.rs"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/workspace_tests/**/Cargo.toml"
          },
          {
            "globPattern": "/usr/local/workspace/temp/peace/workspace_tests/**/Cargo.lock"
          }
        ]
      }
    }
  ]
}

If it sets up a generic pattern like /usr/local/workspace/temp/peace/**/*.rs then why it later specifies patterns (for example /usr/local/workspace/temp/peace/crate/rt_model/**/*.rs") that are already included within that generic pattern? In theory that could cause the client to set up duplicate file watchers (depending on implementation).

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by tracing rust-analyzer's workspace/didChangeWatchedFiles registration and how the listed glob patterns are generated. Compare the generic workspace patterns with nested crate patterns, then inspect existing LSP or watcher tests if available. Done means redundant patterns are eliminated without losing file-change coverage, with regression coverage for the reported registration.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.