VS Code中Rust模块文件rust-analyzer自动补全失效
问题描述
在main.rs文件中代码自动补全功能可正常使用,但模块文件中自动补全完全失效。
项目可以正常构建、运行,仅存在部分未使用项的警告:
- 编辑
main.rs时,可正常获取str、rand以及自定义Card结构体的代码补全提示 - 编辑
card.rs文件时无任何自动补全提示,就连该文件内部定义的Card结构体也无法触发补全
已尝试重装rust-analyzer插件、执行rustup update更新Rust工具链,均未解决问题。
项目文件夹结构
src/ |___game_components/ | |___card.rs |___game_components.rs |___main.rs
各文件源码
main.rs
pub mod game_components; use game_components::card::Card; fn main() { println!("{:?}", Card::new(5)); }
game_components.rs
pub mod card;
card.rs
const FACES: [&str; 13] = [ "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace", ]; const SUITS: [&str; 4] = ["Hearts", "Clubs", "Diamonds", "Spades"]; #[derive(Debug)] pub struct Card { value: u8, face: u8, suit: u8, } impl Card { pub fn new(value: u8) -> Card { if value >= 52 { panic!("Value cannot be larger than 51, got {}", value) } Card { value, face: value % 13, suit: value / 13, } } pub fn get_name(&self) -> String { format!( "{} of {}", FACES[self.face as usize], SUITS[self.suit as usize] ) } }
问题原因
既不是配置遗漏也不是rust-analyzer的Bug,本质是混用了Rust的两种模块声明规则,导致rust-analyzer无法正确识别card.rs的模块归属。
Rust中声明带子模块的父模块,只有两种合法写法,二者只能选其一,不能混用:
- 写法1:父模块文件直接放在
src/目录下,命名为game_components.rs,这种写法对应的子模块文件必须直接放在src/目录下,不能放到同名的game_components/文件夹中 - 写法2:父模块文件放在同名的
game_components/文件夹下,命名为mod.rs,这种写法对应的子模块文件才需要放在game_components/目录下
当前项目同时存在src/game_components.rs和src/game_components/card.rs,cargo构建时有兼容逻辑可以正常定位模块完成编译,但rust-analyzer的模块解析逻辑不会做这种兼容处理,识别不到card.rs属于当前项目的模块树,自然不会提供补全提示。
解决方案
选择任意一种方式调整项目结构即可:
- 方案1:保留现有
game_components.rs文件,把card.rs从game_components/目录移到src/根目录,删除空的game_components/文件夹 - 方案2:保留现有目录结构,把
src/game_components.rs移动到src/game_components/目录内,重命名为mod.rs
调整完成后重启编辑器,或者手动触发rust-analyzer重载工作区,card.rs内的自动补全就会恢复正常。
内容的提问来源于stack exchange,提问作者YBStolker
相关产品推荐
相关产品推荐

