本文最后更新于 2024年10月16日 晚上
最近突然又想刷一些 leetcode 题目了,顺便再练一练 rust,好久不写代码已经手生了。之前在 vscode 的 leetcode 插件刷 rust 题目时,基本没有代码提示与补全,很难受。今天搜到一篇解决这个问题的帖子,感觉很有用,虽然没能完全解决我的问题,但是为我打开了思路。
早期的处理办法
早期我是通过 automod
这个库,将所有 leetcode 代码文件都加入一个项目中,好处是确实有补全了,但是一个文件有问题就可能会破坏补全体验,一片飘红。
我先新建了一个本地仓库,用来存放 rust 代码。放置于
1 2 3
| cd ~/Documents/Repository/leetcode/ cargo new rust cargo add automod
|
然后我们进入到项目文件夹下,在 src
目录下新建一个目录leetcode
, 再创建一个 lib.rs
并加入如下内容:
1 2 3
| mod leetcode { automod::dir!("src/leetcode/"); }
|
最后将 leetcode 插件的 leetcode.workspaceFolder
指定为 ~/Documents/Repository/leetcode/rust/src/leetcode
即可。
目前的解决办法
在参考了掘金的帖子之后才发现还可以直接去修改插件的代码。因此我也打算直接去改插件代码,动态生成一个 lib.rs
并引用对应题目的代码。顺便给模板加上一个空的 struct Solution
以减少 rust-analyzer 的警告,再加一个 test 模块方便本地测试。只要修改 ~/.vscode/extensions/leetcode.vscode-leetcode-0.18.3/out/src/leetCodeExecutor.js
这个文件即可。
注意: 你需要设置文件名为合法的 Rust模块名, 比如我的是这样设置的。
1 2 3 4 5 6 7
| "leetcode.filePath": {
"default": { "folder": "", "filename": "lt_${id}.${ext}" } },
|
最终我的 patch 为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
@@ -109,6 +109,28 @@ class LeetCodeExecutor { }); } showProblem(problemNode, language, filePath, showDescriptionInComment = false, needTranslation) { + let cargocfg = path.join(path.dirname(filePath), "../lib.rs") + let name = path.parse(filePath).name + const leetcodeRustConfig = `mod leetcode { + mod ${name}; +}`; + let extra_codes = ` +#[allow(unused)] +struct Solution; + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn testfun() { + //assert_eq!(Solution::myfn(x), y); + assert!(true) + + } +} +`; + fse.writeFile(cargocfg, leetcodeRustConfig); return __awaiter(this, void 0, void 0, function* () { const templateType = showDescriptionInComment ? "-cx" : "-c"; const cmd = [yield this.getLeetCodeBinaryPath(), "show", problemNode.id, templateType, "-l", language]; @@ -119,6 +141,7 @@ class LeetCodeExecutor { yield fse.createFile(filePath); const codeTemplate = yield this.executeCommandWithProgressEx("Fetching problem data...", this.nodeExecutable, cmd); yield fse.writeFile(filePath, codeTemplate); + yield fse.appendFile(filePath, extra_codes) } }); }
|
现在终于可以愉快地刷题啦(虽然我只能对简单题重拳出击)。
参考资料
- 解决 vscode-leetcode 插件创建的 Rust 文件无代码提示问题