Создавайте динамические комментарии с помощью sweet.js

Как я могу преобразовать следующий фрагмент:

let myVar: string = 'test';

К следующему выводу:

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

используя sweetjs?

ОБНОВИТЬ

Я ищу способ преобразовать точный первый фрагмент кода во второй. В том числе // type {string} комментарий.

Я хочу использовать его для создания простого DSL, чтобы сгенерировать код для проверки с помощью компилятора Google Closure.

2 ответа

Решение

Это должно сделать это:

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';

Я не уверен, что вы ищете, но, возможно, этот фрагмент:

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';

Также проверьте эту страницу в рубрике "Гигиена", около 3/4 страницы.

Надеюсь, это поможет.

ОБНОВИТЬ

Прочитайте некоторые статьи, в которых говорится, что простой макрос правил должен делать эту работу:

macro foo {
  rule { $id = $init } => {
    var $id = $init
  }
  rule { $init } => { var myVar = $init }
}
// type {string}
foo "test";
Другие вопросы по тегам