#ast #语法树 #aidl #诊断 #验证 #解析 #语言

aidl-parser

解析AIDL文件,构建AST和诊断信息

26个不稳定版本 (11个重大变更)

0.12.3 2023年1月29日
0.11.0 2023年1月29日
0.10.0 2022年1月9日
0.4.0 2021年12月30日

505编程语言


aidl-cli 中使用

MIT 许可证

150KB
3.5K SLoC

Github.com Crates.io Documentation Github Actions

Rust的AIDL解析器

解析和验证AIDL文件(或内容)。

对于每个AIDL文件,解析器将返回

  • AST(抽象语法树)
  • 诊断信息(错误和警告)

【遍历】模块包含各种辅助函数,用于从AST中提取信息。

用法

添加到 Cargo.toml

[dependencies]
aidl-parser = "0.12.3"

创建解析器,分析结果

use aidl_parser::Parser;
use aidl_parser::traverse::{self, SymbolFilter};

// Parse AIDL contents
let mut parser = Parser::new();
parser.add_content("id1", "package test.pkg; interface MyInterface { void hello(String); }");
parser.add_content("id2", "package test.pkg; parcelable Parcelable { int myField; }");
let results = parser.validate();

// Display results
for (id, res) in &results {
    println!("{}: AST = {:#?}", id, res.ast);
    println!("{}: Diagnostics = {:#?}", id, res.diagnostics);
}

// Traverse AST
let ast1 = results["id1"].ast.as_ref().expect("missing AST");
traverse::walk_symbols(ast1, traverse::SymbolFilter::All, |s| println!("- Symbol: {:#?}", s));

// Filter symbols with closure
let symbols = traverse::filter_symbols(ast1, SymbolFilter::ItemsAndItemElements, |s| s.get_name().unwrap_or_default().contains("el"));
println!("Found symbols containing 'el': {:#?}", symbols);

// Find symbol with closure
if let Some(symbol) = traverse::find_symbol(ast1, SymbolFilter::All, |s| s.get_name().as_deref() == Some("myField")) {
  println!("Found myField: {:#?}", symbol);
}

// Find symbol at given position
if let Some(symbol) = traverse::find_symbol_at_line_col(ast1, SymbolFilter::All, (0, 3)) {
  println!("Found myField: {:#?}", symbol);
}

AIDL语言支持

目前,基于官方AIDL文档和AOSP实现,尽力提供良好的诊断和导航。

计划逐步改进语言支持,涵盖所有AIDL功能。如果您在README中未提及任何问题或缺失的功能,则视为bug(请提交问题或拉取请求!)。

有关当前语法和验证的更多信息,请参考

AOSP AIDL实现的链接:https://android.googlesource.com/platform/system/tools/aidl/+/refs/heads/master

待办事项

  • 记录如何显示诊断信息(例如,使用CodeSpan)
  • 联合(Android 12)
  • 嵌套类型(Android T)
  • 更智能的Parcelable字段值解析
  • 用户定义泛型类型
  • 固定大小数组
  • 带有算术的常量值(例如:const int HELLO = 3 * 4)
  • 允许对列表/映射参数进行注解?
  • 格式?
  • 验证
    • 文件名与项目名匹配
    • 注解
    • 注解不能附加到原始类型

许可证

本项目受MIT许可证许可。

依赖项

~3–6.5MB
~105K SLoC