rv6
rv6 copied to clipboard
rust-analyzer가 코드를 제대로 인식하지 못하는 문제
현재 rust-analyzer 관련하여 두가지 문제가 있는 것 같습니다.
-
lib.rs
에서 can't find crate for test 등의 bogus error를 띄우는 문제 - 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
@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()
도 많이 쓰게될 것 같은데, 이 점 때문에 좀 불편할 수 있을 것 같습니다.
@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/ 를 참고해보면 좋을 것 같습니다.
감사합니다. 디버깅할 때는 유용한 방법인 것 같습니다. 다만, go to definition이 동작할 수 없는 것과 use case를 볼 때 포함되지 않는 것은 여전히 아쉽긴 하네요. + 자동 renaming도요
추가로, 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