flycheck / flycheck-rust

Better Rust/Cargo support for Flycheck

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Checking doesn't work for workspace projects.

radupopescu opened this issue · comments

Hi there!

I have a Rust project organized as a workspace - in the root of the project, there are two other sub-crates which are part of the workspace.

When editing the main file of the root project (<PROJECT_ROOT>/src/main.rs) or even the library part of the root project ('<PROJECT_ROOT>/src/lib.rs`) there are no issues with flycheck.

When editing the contents of any of the sub-crates (i.e. <PROJECT_ROOT>/<SUBCRATE>/src/lib.rs) there is no checking happening.

I suspect that flycheck isn't aware of workspace projects. When checking my code from the command line, I usually have to specify the --all parameter to the check command to instruct it to recurse into sub-crates. For example:

$ cargo check --all --tests

I don't know how this is done with cargo rustc.

Here are some diagnostics/output from my computer:

Syntax checkers for buffer mod.rs in rust-mode:                                                                                                                                    
                                                                                                                                                                                    
  rust-cargo                                                                                                                                                                       
    - may enable:  yes                                                                                                                                                             
    - predicate:   t                                                                                                                                                               
    - executable:  Found at /Users/radu/.cargo/bin/cargo                                                                                                                           
    - Cargo.toml:  Found                                                                                                                                                           
    - Crate type:  lib                                                                                                                                                             
    - Binary name: Not required                                                                                                                                                    
                                                                                                                                                                                    
  rust                                                                                                                                                                             
    - may enable: yes                                                                                                                                                              
    - predicate:  t                                                                                                                                                                
    - executable: Found at /Users/radu/.cargo/bin/rustc                                                                                                                            
                                                                                                                                                                                   
Flycheck Mode is enabled.  Use C-u C-c ! x to enable disabled                                                                                                                      
checkers.                                                                                                                                                                          
                                                                                                                                                                                   
--------------------                                                                                                                                                               
                                                                                                                                                                                   
Flycheck version: 32snapshot (package: 20180116.147)                                                                                                                               
Emacs version:    25.3.1                                                                                                                                                           
System:           x86_64-apple-darwin13.4.0                                                                                                                                        
Window system:    nil

This is how I configure Flycheck in my Emacs' init.el:

;;; Rust ;;;                                                                                                                                                                      
;;;;;;;;;;;;                                                                                                                                                                      
(use-package racer                                                                                                                                                                
  :init                                                                                                                                                                           
  (setq racer-cmd "~/.cargo/bin/racer")                                                                                                                                           
  :config                                                                                                                                                                         
  (use-package company-racer)                                                                                                                                                     
  (use-package cargo)                                                                                                                                                             
  (use-package flycheck-rust)                                                                                                                                                     
  (add-hook 'rust-mode-hook 'cargo-minor-mode)                                                                                                                                    
  (add-hook 'rust-mode-hook #'racer-mode)                                                                                                                                         
  (add-hook 'rust-mode-hook                                                                                                                                                       
            (lambda ()                                                                                                                                                            
              (add-hook 'flycheck-mode-hook #'flycheck-rust-setup)))                                                                                                              
  (add-hook 'racer-mode-hook #'eldoc-mode)                                                                                                                                        
  (add-hook 'racer-mode-hook #'company-mode))                                                                                                                                     

It would be really useful to have flycheck support in workspace projects.

Thanks for the great work on Flycheck, this is the first issue I've encountered for Rust, it works great otherwise!

Do you have some code with which to reproduce? A minimal example would be great. Here I have no issues checking code inside a subcrate of this project for instance.

Sure thing. Check out this minimal project. I'm seeing the same behaviour: flycheck works for fc-root/src/main.rs, but doesn't for fc-root/fc-sub/src/lib.rs.

I'm sorry to report that it works on my side :/

Opening fc-root/fc-sub/src/lib.rs, I can type gibberish and get a syntax error, or create an unused variable and get a warning.

If I open fc-root/src/main.rs, same thing.

However, if there is an error in fc-root/fc-sub/src/lib.rs, then you won't get any error feedback when editing fc-root/src/main.rs, because Flycheck is not project-aware. But note vice versa: editing the subcrate while the main binary of the root crate has an error is fine, because the subcrate does not depend on the root.

Other than that, what's your rustc version? 1.23?

It seems that it's the rust version that breaks things. I am on Rust nightly (with rustup default nightly). If I switch to stable, I can reproduce all the behaviour you listed in your reply.

Is it a known thing that nightly doesn't work with Flycheck, or is it a regression in the version I have installed (rustc 1.25.0-nightly (8ccab7eed 2018-01-31))?

It's a bit annoying, because I switched to nightly to be able to use rustfmt from Emacs...

Workspaces breaking on nightly is news to me. On the other hand, our testing infrastructure is a bit lacking, so I can't say for how long this has been broken. Luckily, we've got users who report bugs soon enough ;)

I've looked into this, and this stems from the fix to #1378 that was incomplete. For workspace projects, cargo reports paths relative to the workspace root, not relative to the nearest project. This is inconvenient, because it means we always have to find the topmost Cargo.toml. Or we can ask cargo metadata for the workspace root... don't know which would be faster in the end.

In any case, I'd rather have cargo spout out absolute file paths again (or at least relative to the nearest project...)

rust-lang/cargo#4788 is the culprit, rust-lang/cargo#4933 added workspace_root to cargo metadata, and rust-lang/cargo#4998 is still arguing that the change may be problematic.

I'll hop onto rust-lang/cargo#4998 to see if we can't get absolute paths in the JSON format.

@fmdkdd Thanks for looking into this and for the in-depth explanation! Indeed, it sounds that getting absolute paths would be easiest on you guys and also make any tools based on these values less brittle.

I tested cargo metadata on a stand-alone project (non-workspace), on nightly. The workspace_root data member is still present.

Does cargo return relative paths also in the case of non-workspace projects?

Does cargo return relative paths also in the case of non-workspace projects?

Yes it does, that was the cause of flycheck/flycheck#1378

Should be fixed by flycheck/flycheck#1422.

Thanks!