2016-03-12 2 views
1

Я хочу создать groovy-код с помощью AstBuilder, но потом я хотел бы посмотреть, как будет выглядеть фактический код groovy. Можно ли преобразовать выход ToString Аст узлов, как это:Преобразуйте строку узлов AST в код groovy

[email protected][ 
[email protected][ 
expression:[email protected][ 
[email protected][ 
variable: cl]("=" at 2:17: "=")[email protected][ 
]{ [email protected][ 
] }]]] 

обратно в заводной код?

+0

Вы проверили 'Text' собственности на внешнем большинстве' ASTNode' (Ех BlockStatement.)? Я подозреваю, что это задано компилятором, поэтому в случае создания узлов вручную без исходного кода это может не сработать. Но в соответствии с консольной консолью Groovy AST Browser свойство 'text' представляет собой исходный код' ASTNode'. –

+0

К сожалению, свойство 'text' не выполняется последовательно для всех классов. Например, 'IfStatement' вообще не реализует его и возвращает сообщение о том, что метод не был реализован. Некоторые другие классы также не возвращают очень полезное сообщение, поэтому вы не можете просто вызывать 'getText()' на самом внешнем объекте. – mike27

+0

Ничего, что я нашел, но это похоже на Матрицу ... через некоторое время вы просто начинаете «видеть», как выглядит сгенерированный код. – cjstehno

ответ

2

Вы можете использовать мой любимый фрагмент кода, который я использую, когда я работаю с AST преобразований:

java.io.StringWriter writer = new java.io.StringWriter(); 
groovy.inspect.swingui.AstNodeToScriptVisitor visitor = new groovy.inspect.swingui.AstNodeToScriptVisitor(writer); 
visitor.visitClass(node); // replace with proper visit**** 
System.out.println(writer.toString()); 

Это обеспечит почти правильный Groovy код от него. Это все еще не на 100% правильно (я имею в виду, если вы его скомпилируете, тогда он может не компилироваться), но более чем достаточно для отладки.

Пример в MacroGroovy:

https://github.com/bsideup/MacroGroovy/blob/950193cb2d12443bf0c7b7af9635f24712d3bad0/src/main/groovy/ru/trylogic/groovy/macro/MacroTransformation.java#L58

Смежные вопросы