Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
travis1829 opened this issue Feb 4, 2021 · 4 comments
Open
Labels
cantfix This cannot be worked on because it can be resolved only after a proper fix in another project

Comments

@travis1829
Copy link
Collaborator

travis1829 commented Feb 4, 2021

현재 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 #394 (comment)

@travis1829
Copy link
Collaborator Author

travis1829 commented Feb 4, 2021

@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
Copy link
Collaborator Author

@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/ 를 참고해보면 좋을 것 같습니다.

@Medowhill
Copy link
Collaborator

Medowhill commented Feb 4, 2021

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

@travis1829
Copy link
Collaborator Author

추가로, 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

@coolofficials coolofficials added the wontfix This will not be worked on label Feb 22, 2021
@Medowhill Medowhill added cantfix This cannot be worked on because it can be resolved only after a proper fix in another project and removed wontfix This will not be worked on labels Apr 30, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cantfix This cannot be worked on because it can be resolved only after a proper fix in another project
Projects
None yet
Development

No branches or pull requests

3 participants