Аннотировать петли в шпунт - PullRequest
0 голосов
/ 04 октября 2018

Мой скрипт groovy, показанный ниже, загружается / компилируется во время выполнения.Во время выполнения я использую преобразования AST, чтобы подключиться к циклам в коде.Например, я хочу сделать это

@SpecialForLoop
for(int i in [1,2,3,4])
{
    Fn1();
    Fn2();
}

должно быть изменено на это

for (int i in [1,2,3,4])
{
   loopingOnce(); // Custom code I will insert when handling AST
   Fn1();
   Fn2();
   loopOnceDone(); // Custom code I will insert
}

Я попытался установить аннотацию, как показано, но компилятор жалуется, что это недопустимое местоположение дляаннотации (ElementType говорит, что это может быть только для переменных, локальных переменных, методов, конструкторов и параметров методов).Если бы я хотел сделать это, должен ли я подключиться к этапу компиляции раньше, чем семантический анализ?Это вообще возможно?

Если установить аннотацию в этом месте невозможно, есть ли преобразование AST для переименования ключевого слова for в special_for?

special_for(int i in [1,2,3,4,5])
{
   // Do something with i
}

Есть ли способ сделать это в Groovy?

1 Ответ

0 голосов
/ 05 октября 2018

Одно из предложений состоит в том, чтобы сделать это

Special_For({
   for (int i in [1,2,3,4,5])
   {
       // Do something
   }
});

Special_For - это функция, определенная в базовом классе сценария, которая может быть обнаружена при анализе AST.Затем его можно заменить во время семантического анализа AST непосредственно на цикл for.

a) Добавить преобразование AST b) В этом преобразовании, если узел является вызовом метода Special_For, затем перейти к c) c) Проверитьесли параметр является замыканием, если не выдает ошибку, d) Если закрытие, то получите код из замыкания. e) Убедитесь, что код из замыкания является циклом for. f) Замените methodnode Special_for на код из замыкания напрямую (после настройкицикл for с вашими данными)

Будет ли это работать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...