Rust IDE无法检测到error_chain中的Result,认为我正在使用std::result::Result

3
我有一个名为errors.rs的文件,其中包含error_chain! {} ,它导出了ResultResultExtErrorErrorKind
如果我使用use self::errors::*,IntelliJ认为我使用默认的Result(我想是std::result::Result)。然而,如果我使用use self::errors::{Result, ...}显式地导入类型,一切都能正常工作。
我可以知道这一点,因为标准的结果有两个类型参数,但error_chain只有一个。
无论哪种情况,它仍然可以编译。
我正在使用标准的Rust IntelliJ插件,版本为0.1.0.1991
帮忙!有人知道如何让插件理解这个宏在做什么吗?

我猜这就是当IDE被迫推出自己的语义分析时会发生的事情 :/ - Matthieu M.
你应该向JetBrains报告一个bug。 - Peter Hall
看起来这是一个已知问题 :) - Robert Balicki
1个回答

4
IntelliJ-Rust插件使用自己的代码解析器。它允许利用IntelliJ平台的所有功能(如代码导航,格式化,重构,检查,快速文档,标记和其他许多功能),但需要实现所有语言特性,这对于Rust来说并不是一项简单的任务(您可以在此reddit帖子中找到有关Rust编译器解析器与IDE解析器之间的更深入讨论)。
宏扩展可能是目前插件解析器不支持的最大语言特性。也就是说,插件看到这个error_chain!调用,可以将其解析为其定义,但不会展开到实际代码,并且因此不知道阴影了stdlib中的新Result结构。不幸的是,在某些情况下,这会导致出现误报错误消息。
作者将此错误注释转换为检查,因此在下一个插件版本中,您可以完全关闭它或针对特定代码块进行关闭。宏扩展的工作也正在进行中。

看起来现在已经支持了?https://github.com/intellij-rust/intellij-rust/pull/2331 我没有在那个PR中看到任何链接,说明它处理了什么或者没有处理什么。 - Kyle Strand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接