#ast #js #dev #experimental #file #parts #ressa

resw

一个用于将 RESSA AST 部分写入文件的库

16 个版本

0.7.0-alpha.22023 年 6 月 20 日
0.6.0-alpha.42022 年 2 月 2 日
0.5.1 2021 年 8 月 25 日
0.5.0 2021 年 4 月 28 日
0.2.2 2019 年 3 月 4 日

#8 in #parts

MIT 许可证

120KB
3K SLoC

RESW

一个实验性的 crate,用于从 RESSA crate 提供的 AST 中编写 JS。

由于 RESSA 的主要目的是让开发者能够用 Rust 编写他们的 JS 开发工具,因此这是该生态系统的重要组成部分。该项目的实验性状态是由于 RESS 和 RESSA 在当前版本中都不稳定,当锁定到本 crate 的 Cargo.toml 中列出的版本时,行为应该是稳定的。

基本用法

以下是如何使用此 crate 的一个简单示例。

// example.js
function thing() {
    return 'stuff'
}

使用上面的示例,我们可以创建一个只会鹦鹉学舌输入的程序。

use resw::Writer;
use ressa::Parser;
use srd::fs::{read_to_string, File);

fn main() {
    let js = read_to_string("example.js").expect("failed to read example.js");
    let p = Parser::new(&js).expect("failed to create parser");
    let f = File::create("example.out.js");
    let mut w = Writer::new(f);
    for part in p {
        w.write_part(part).expect(&format!("failed to write part {:?}", part));
    }
}

如果我们运行上面的程序,假设 example.js 存在,它会在 example.out.js 中写入以下内容。

// example.js
function thing() {
    return 'stuff';
}

不是很令人兴奋,但我确实说过示例将是简单的。查看示例目录以获取更多稍微不那么简单的示例。

说明

运行示例

cargo run --example snippet_writer 期望一个 脚本,除非你传递一个如 cargo run --example snippet_writer -- module 的 "module" 参数。

这就像你的观点...伙计

目前,我已为生成的输出做出了一些个人风格选择。我对这个 crate 的最终愿景是允许配置大量这些决策,但直到 RESSA 有机会添加一些所需的功能,它们将不可配置。以下是我目前能想到的一些事情。

  • 注释永远不会包含在输出中
  • 空函数体是同一行上的两个花括号,由一个空格分隔
  • 空 if、try 和 loop 体是两个花括号,由一个空行分隔
  • 新行总是用 \n 表示。
  • 函数或函数标识符前面没有空格,写作 (
  • 函数参数列表不加空格包围。
  • 数组和对象字面量后面有逗号。
  • 对象字面量每行只包含一个属性。

建立在不稳定的基础上

对于下一年的RESS/RESSA,我有一些雄心勃勃的计划,这些变化最终会打破这个crate所能做到的事情,但随着时间的推移,这些变化将极大地增强这个crate的功能。正在进行的一些值得注意的事情

RESS

  • 实现了新的无分配版本的 Scanner,但需要测试
  • 我想添加TypeScript支持

RESSA

  • 已经开始工作,包括所有节点项的位置
    • 这将允许RESW提高生成的JS的可靠性

贡献

如果您有兴趣提供帮助,将不胜感激。在此阶段,我鼓励您在尝试在这里提供贡献之前先改进RESS或RESSA。如果您有贡献,请在深入挖掘之前请打开一个issue,这样我们就可以保持一致。

一些需要帮助的地方

  • 示例
    • 我的想象力有限,即使是关于可能需要作者(不是babel克隆或js压缩器)的开发工具的想法也会很棒
    • 如果您想构建一个JS压缩器,我会感到非常荣幸
      • 尽管目前还没有机制来排除换行符

依赖关系

~1MB
~17K SLoC