创建语法扩展时出现未解决的导入错误E0432

3
我正在尝试创建一个语法扩展,但是我得到了E0432错误。我在错误索引中阅读了相关信息,但是不知道该怎么做!
我收到的错误信息是:
/Users/hasan/.cargo/bin/cargo run --color=always --package rust01 --bin rust01

Compiling rust01 v0.1.0 (file:///Users/hasan/PycharmProjects/rust01)

error[E0432]: unresolved import `rustc::plugin`  --> src/lib.rs:6:12
| 6
| use rustc::plugin::Registry;
|            ^^^^^^ Could not find `plugin` in `rustc`

error[E0432]: unresolved import
`syntax::ext::base::SyntaxExtension::Modifier`   --> src/lib.rs:12:5
| 12
| use syntax::ext::base::SyntaxExtension::Modifier;
|     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no `Modifier` in `ext::base::SyntaxExtension`

error[E0432]: unresolved import `syntax::parse::token::intern`   -->
src/lib.rs:13:5
| 13
| use syntax::parse::token::intern;
|     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no `intern` in `parse::token`

这是我的IDE发生的事情:
#![feature(plugin_registrar, rustc_private)]

extern crate syntax; extern crate rustc;

use rustc::plugin::Registry;

use syntax::ptr::P; use syntax::ast::{Item, MetaItem}; use syntax::ext::base::ExtCtxt; use syntax::codemap::Span; use syntax::ext::base::SyntaxExtension::Modifier; use syntax::parse::token::intern;

#[plugin_registrar] pub fn registrar(reg: &mut Registry) {
    reg.register_syntax_extension(intern("extension"), Modifier(Box::new(expand))); }

fn expand(_: &mut ExtCtxt, _: Span, _: &MetaItem, item: P<Item>) -> P<Item> {
    println!("Hello world!");
    return item; }

根据接收到的评论,我将扩展作为一个单独的箱子,新的应用程序结构如下截图所示。
“bin”的“Cargo.toml”文件如下:
[package]
name = "hello_world"
version = "0.1.0"
authors = ["hasan"]

[dependencies]
extension = { path = "./extension" }

"lib" 的 "Cargo.toml" 是:
[package]
name = "extension"
version = "0.1.0"
authors = ["hasan"]

[dependencies]

[lib]
plugin = true

enter image description here


编译器插件仅在夜间构建版本中可用。您正在使用哪个编译器版本? - undefined
@rodrigo,我使用的是rustc 1.29.0-nightly (64f7de921 2018-07-12)版本。 - undefined
在链接的帖子中提到编译器插件必须位于自己的lib crate中,并在Cargo.toml中设置plugin = true... 也许你正在一个bin crate中编写这段代码? - undefined
@rodrigo 我把两个文件都放在了src文件夹中,这两个文件分别是main.rslib.rs - undefined
我认为你应该创建两个不同的 crate。一个是 bin crate,另一个是 lib crate。你可以在 bin 目录下创建 lib crate,并且在 bin crate 的 Cargo.toml 文件中设置依赖的路径指向 lib crate。而 lib crate 的 Cargo.toml 文件可以设置 plugin = true - undefined
我根据你的反馈更新了我的问题,@rodrigo,请帮忙确认一下。 - undefined
1个回答

3
这就是使用不稳定功能的后果:它们会改变!你链接的博客文章现在已经很旧了(可能是2015年?)...许多事情仍然适用,但是一些东西正在被移动。你可以在这里找到最新的官方文档。快速浏览文档后发现第一个问题是rustc::plugin已经移动到自己的crate:rustc_plugin。我没有完全遵循所有文档,但可能会有更多问题。

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