Вам придется заменить выражения expression в AST на BinaryExpression.Вы заметите, что StatementExpression является BinaryExpression, поэтому вам просто нужно скопировать все.Также не забудьте вызвать setSourcePosition на новом узле, используя старый узел, чтобы убедиться, что номера строк правильные.Выражения хранятся в ExpressionStatements, поэтому их не так сложно заменить.
Что касается того, на каком этапе работать ... Я настоятельно рекомендую сделать это до того, как заданы переменные области, тогда у вас меньше работыи вам не придется удалять множество ссылок на переменные в AST позже.Вы можете сделать это, например, в CONVERSION.
Еще одно слово о семантических изменениях, которые вы вводите с этим:
(1) String a = 1;а = 2;в этом примере кода вы получите два раза строку, хранящуюся в.Это в основном потому, что для каждого назначения Groovy будет выполнять приведение к стилю Groovy, что включает преобразование в String.Это сделано, потому что переменная напечатана.Если он не напечатан, таких преобразований не произойдетЭто относится и к «def», но также к переменным в привязке.Это означает, что ваша привязка будет хранить целые числа 1 и 2, а не строки.
(2) Другой момент - это области видимости.Если я вас правильно понимаю, то вы хотите сделать все переменные глобальными.Программы, написанные в контексте наличия только широкой области видимости для переменной, могут тогда вести себя странно.Это может произойти, особенно для переменных в Groovy Closures, если Groovy Closures выполняются не синхронно, а, например, в более поздней, более изолированной точке в вашей программе
(3) Последний пункт - это изменение в использованииСС.Получить значение локальной переменной мы не используем MOP, вместо этого мы делаем это напрямую.Если вы переместите локальные переменные в глобальную область, вам придется пройти через полную MOP, чтобы получить значения.Если в какой-то момент у вас есть элемент программы, который захватывает вызов и повторяет его самостоятельно, у вас будет другая программа.
Возможно, это не имеет значения в вашем случае ... Я просто хотел, чтобы вы былиосознавать эти вещи.