如何获取语法::: ast :: Ident的绝对名称?

维克兰特·乔哈里(Vikrant Chaudhary)

我正在尝试从以下Rust代码中提取函数名称。

// example.rs

pub mod hello {
    pub mod world {
        pub fn greetings() {
            println!("Hello, world!")
        }
    }
}

这是尝试从中提取函数名称的代码example.rs

//runner.rs

/*
 * This program will only compile with nightly Rust
 *
 * To compile
 * rustc runner.rs
 *
 * To run
 * LD_LIBRARY_PATH=$(rustc --print sysroot)/lib ./runner
*/

#![feature(rustc_private)]
extern crate syntax;

use syntax::visit::{ self, Visitor, FnKind };
use syntax::ast::{ FnDecl, Block, NodeId, Mac };
use syntax::codemap::{ Span };
use syntax::{ parse, ast };
use std::path::Path;

struct MyVisitor;

impl<'x> Visitor<'x> for MyVisitor {
    fn visit_fn<'v>(&mut self, fk: FnKind<'v>, fd: &'v FnDecl, b: &'v Block, s: Span, _: NodeId) {
        let name;
        match fk {
            visit::FnKind::Method(_ident, ref _method_sig, _option) => {
                name = (*_ident.name.as_str()).to_string();
            }
            visit::FnKind::ItemFn(_ident, ref _generics, _unsafety, _constness, _abi, _visibility) => {
                name = (*_ident.name.as_str()).to_string();
            }
            visit::FnKind::Closure => {
                name = "".to_string();
            }
        };
        println!("{}", name);
        visit::walk_fn(self, fk, fd, b, s);
    }

    fn visit_mac<'v>(&mut self, _mac: &'v Mac) {
        // do nothing
        // just overriding here because parent panics as
        // panic!("visit_mac disabled by default");
    }
}

fn build_crate(path: &std::path::Path) -> ast::Crate {
    let sess = parse::ParseSess::new();
    let filemap = sess.codemap().load_file(path).unwrap();
    let cfg = ast::CrateConfig::new();
    let reader = parse::lexer::StringReader::new(&sess.span_diagnostic, filemap);
    let mut parser = parse::parser::Parser::new(&sess, cfg, Box::new(reader));
    return parser.parse_crate_mod().unwrap();
}

fn main() {
    let krate = build_crate(Path::new("./example.rs"));
    let mut visitor = MyVisitor {};
    visit::walk_crate(&mut visitor, &krate);
}

问题是它打印greetings为输出,但是我要使用完全限定的名称,即hello::world::greetings我怎么做?

oli_obk

你不能 AnIdent只是一个名字(有关宏扩展的一些信息)。

您可以做的是通过也实现visit_item方法并存储当前路径,使用访问者来构建模块路径:

fn visit_item(&mut self, i: &'v Item) {
    self.modules.push(i.ident);
    walk_item(self, i);
    self.modules.pop();
}

然后,您可以打印整个路径:

for ident in &self.modules {
    print!("::{}", ident.name.as_str());
}
println!("");

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

AST解析器获取Java类的名称

来自分类Dev

如何从AST获取继承树?

来自分类Dev

如何从AST获取继承树?

来自分类Dev

AST识别导入的名称

来自分类Dev

AST识别导入的名称

来自分类Dev

如何在Python抽象语法树(AST)中获取实际的用户定义变量名?

来自分类Dev

如何查看Clang AST?

来自分类Dev

如何创建允许语法错误的AST分析器?

来自分类Dev

获取AST的dart源代码

来自分类Dev

获取AST的dart源代码

来自分类Dev

如何基于AST以层次结构顺序提取origen_testers测试名称?

来自分类Dev

如何从AST转到后端代码?

来自分类Dev

如何进行AST转换?

来自分类Dev

如何访问LESS生成的AST?

来自分类Dev

如何漂亮打印Syn AST?

来自分类Dev

JDT AST,如何生成声明

来自分类Dev

如何进行AST转换?

来自分类Dev

如何从AST转到后端代码?

来自分类Dev

如何从 AST 创建编译单元

来自分类Dev

PEGJS:为谓词优先语法生成AST

来自分类Dev

Antlr 语法无法提供所需的 AST

来自分类Dev

如何在[<ReflectedDefinition>]标记的模块中获取函数的AST?

来自分类Dev

如何在Clang AST中获取OpaqueValueExpr的子级

来自分类Dev

如何将AST作为R中的列表获取

来自分类Dev

如何在Clang AST中获取OpaqueValueExpr的子级

来自分类Dev

从C ++代码获取人类可读的AST

来自分类Dev

在Python中获取AST节点的父节点

来自分类Dev

获取文件的完整AST /复杂代码

来自分类Dev

我可以从cppyy获取AST吗