使用sweet.js生成动态注释

时间:2014-07-30 23:33:29

标签: javascript sweet.js

如何转换以下代码段:

let myVar: string = 'test';

要跟随输出:

// type {string}
var myVar = 'test';

使用sweetjs?

更新

我正在寻找一种方法将确切的第一个代码片段转换为第二个代码片段。包括// type {string}评论。

我想用它来创建一个简单的DSL来生成一个用谷歌闭包编译器检查的代码。

2 个答案:

答案 0 :(得分:3)

这应该这样做:

let let = macro {
    case { _ $name $[:] $type = $init:expr } => {
        var typeStr = unwrapSyntax(#{$type});
        var varStx = makeKeyword("var", #{here});
        varStx.token.leadingComments = [{
            type: "Line",
            value: " type {" + typeStr + "}"
        }];
        letstx $var = [varStx];
        return #{
            $var $name = $init
        }
    }
}
let myVar: string = 'test';

扩展为:

// type {string}
var myVar = 'test';

答案 1 :(得分:0)

我不确定你在寻找什么,但也许这个片段:

macro m {
    case {_ () } => {
        var x = makeValue(0, #{here});
        x.token.leadingComments = [{
            type: "Line",
            value: " type {string}"
        }];
        return withSyntax ($x = [x]) #{
            $x
        }
    }
}
m()

macro foo {
  rule { $id = $init } => {
    var $id = $init
  }
  rule { $init } => { var myVar = $init }
}

foo "test";

遗憾的是,如果没有令牌,你就无法输出评论。

输出

// type {string}
0;
var myVar = 'test';

另请查看标题" Hygiene"的this页面,它位于页面3/4左右。

希望有所帮助。

更新

阅读一些文章,说一个简单的规则宏应该做的工作:

macro foo {
  rule { $id = $init } => {
    var $id = $init
  }
  rule { $init } => { var myVar = $init }
}
// type {string}
foo "test";