rv6 icon indicating copy to clipboard operation
rv6 copied to clipboard

rust-analyzer가 코드를 제대로 인식하지 못하는 문제

Open travis1829 opened this issue 4 years ago • 4 comments

현재 rust-analyzer 관련하여 두가지 문제가 있는 것 같습니다.

  1. lib.rs에서 can't find crate for test 등의 bogus error를 띄우는 문제
  2. pin_project의 project()로 얻은 field에 대해서는 type을 {unknown}이라며 제대로 띄우지 못하는 문제

~~1번은 .vscode/settings.json에 다음과 같은 내용을 넣으면 해결되는 것으로 보입니다.~~ 다음 내용을 넣으면 에러는 없어지지만, 문제가 완벽하게 해결되지는 않는 것 같습니다. 조금 더 알아보겠습니다.

{
    "rust-analyzer.checkOnSave.allTargets": false,
    "rust-analyzer.checkOnSave.extraArgs": [
        "--target",
        "kernel-rs/riscv64gc-unknown-none-elfhf.json"
    ]
}

~~@anemoneflower 같은 문제가 있었던 걸로 알고 있는데, 혹시 해결되나요?~~

추가로, https://github.com/rust-analyzer/rust-analyzer/blob/master/docs/user/manual.adoc#vs-code 를 참고하면 좋을 것 같습니다.


2번은 아직 해결하지 못하고 있습니다. 일단, 지금까지 확인한 건 다음과 같습니다.

문제가 잘 해결이 안 되는것 같네요...

  • 일단 cargo new를 해서 간단하게 새로 만든 package에서 실험을 해보면
    • Rust(rls): pin_project, pin_project_lite 모두 type을 잘 인식
    • rust-analyzer: pin_project, pin_project_lite 모두 type을 인식하지 못함
  • 다만, 정작 중요한 rv6에서는 Rust와 rust-analyzer 둘다 type을 인식하지 못하는 것 같군요.

조금 더 실험을 해보겠습니다만, 계속 안되면 편의를 위해 차라리 getter 함수들을 일일이 다 만드는게 나을지 고민해봐야 할 것 같습니다. (다만, 이러면 쓸데없는 unsafe가 많이 생깁니다.)

Originally posted by @travis1829 in https://github.com/kaist-cp/rv6/issues/394#issuecomment-772280562

travis1829 avatar Feb 04 '21 01:02 travis1829

@anemoneflower 1번은 .vscode/settings.json에 다음 내용을 넣으면 해결되는 것 같습니다.

{
    "rust-analyzer.checkOnSave.allTargets": false
}
  • rv6는 build target이 riscv64gc-unknown-none-elfhf.json이기 때문에 compile은 성공하는데, rust-analyzer가 이걸 감안하지 않아서 에러가 생기던 것 같습니다.
  • 참고로 Rust(rls)도 비슷한 설정이 있긴 한데 ("rust.all_targets": false") 이걸 사용하더라도 rls을 사용할 때 Cargo.toml에서 에러가 나타나는 문제는 해결되지 않습니다.
  • https://github.com/rust-analyzer/rust-analyzer/issues/ 의 issue 729, 3297, 3801을 참고해보면 좋을 것 같습니다.

pin_project가 사용된 부분에서는 rust analyzer가 타입을 못 알아내서 다소 불편하네요... 다른 분들도 같은 문제가 있나요?

다만, 이 문제를 해결하면 rust-analyzer가 project()된 field들에 대해서 type을 제대로 띄워주지 않을까 기대하면서 해본건데, 여전히 type이 {unknown}으로 나타납니다. 앞으로 rv6에서 더 많은 것들을 Pin하게 되면서 마찬가지로 project()도 많이 쓰게될 것 같은데, 이 점 때문에 좀 불편할 수 있을 것 같습니다.

travis1829 avatar Feb 04 '21 14:02 travis1829

@Medowhill 2번에 대해서는 조금 귀찮긴 하지만 다음과 같은 방법을 쓰면 에러가 나타나면서 정확한 type이 뭔지 알려줍니다.

A nice workaround I sometimes use when I really need to figure out a type is:

let _: () = complex_variable;

The error will contain the exact type.

2번 문제는 rust-analyzer만의 고질적인 문제때문에 일어나는 것 같습니다. 참고로, 굳이 project()때문에 말고도 다른 이유로 rust-analyzer가 type을 {unknown}이라고 표시하는 경우가 많은 것 같은데, 이때마다 쓰면 될 것 같습니다. https://www.reddit.com/r/rust/comments/dpj5hw/rustanalyzer_not_deducing_types_ex_vecunknown/ 를 참고해보면 좋을 것 같습니다.

travis1829 avatar Feb 04 '21 14:02 travis1829

감사합니다. 디버깅할 때는 유용한 방법인 것 같습니다. 다만, go to definition이 동작할 수 없는 것과 use case를 볼 때 포함되지 않는 것은 여전히 아쉽긴 하네요. + 자동 renaming도요

Medowhill avatar Feb 04 '21 14:02 Medowhill

추가로, rust-analyzer가 use pin_project::pinned_drop를 찾지 못하고 unresolved import라고 에러를 띄우는 문제가 있는 것 같습니다. 이 부분은 settings.json에 다음 내용을 넣으면 해결됩니다. (rust-analyzer의 import diagnostic을 끄게 되지만, 그 대신 rustc의 기본적인 import diagnostic을 사용하게되므로, 이렇게 하면 실제로 존재하지 않는 import에 대해서만 에러를 띄우게됩니다.)

"rust-analyzer.diagnostics.disabled": ["unresolved-import"]

다만, pin_project이 procedural macro를 사용하므로, 다음 방법이 더 좋은 해결책으로 보이나, 현재 rv6에서 쓰고 있는 rustc nightly버전에서는 이 방법을 사용하더라도 문제가 해결되지 않는 것으로 보입니다. (버전이 바뀌면 해결될 수도 있습니다.)

"rust-analyzer.procMacro.enable": true,
"rust-analyzer.cargo.loadOutDirsFromCheck": true,

참고: https://github.com/rust-analyzer/rust-analyzer/issues/ 6053

travis1829 avatar Feb 06 '21 04:02 travis1829