26个不稳定版本 (11个重大变更)
0.12.3 | 2023年1月29日 |
---|---|
0.11.0 | 2023年1月29日 |
0.10.0 |
|
0.4.0 | 2021年12月30日 |
505 在 编程语言 中
在 aidl-cli 中使用
150KB
3.5K SLoC
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(请提交问题或拉取请求!)。
有关当前语法和验证的更多信息,请参考
- 语法(lalrpop):https://github.com/bwalter/rust-aidl-parser/blob/main/src/aidl.lalrpop
- 语法单元测试:https://github.com/bwalter/rust-aidl-parser/blob/main/src/rules.rs
- 验证(包括单元测试):https://github.com/bwalter/rust-aidl-parser/blob/main/src/validation.rs
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