Dart replacing the node in the abstract syntax tree
Here is the solution for that.import 'package:analyzer/analyzer.dart'; import 'package:analyzer/dart/ast/token.dart'; import 'package:analyzer/src/dart/ast/token.dart'; String src = """ void main(){ String a ="hey"; String b ="there"; print(\$a); } """; AstNode ast; main() async { ast = parseCompilationUnit(src, parseFunctionBodies: true); print(ast.toString()); Visitor v = new Visitor(); ast.visitChildren(v); print(ast.toString()); } class Visitor extends SimpleAstVisitor { @override visitFunctionDeclaration(FunctionDeclaration node) { for (var cn in node.childEntities) { if (cn.runtimeType.toString() == "FunctionExpressionImpl") { Visitor v = new Visitor(); cn.visitChildren(v); } } } @override visitBlockFunctionBody(BlockFunctionBody node) { Visitor v = new Visitor(); node.visitChildren(v); } @override visitBlock(Block node) { for (var cn in node.childEntities) { if (cn.runtimeType.toString() == "ExpressionStatementImpl") { Visitor v = new Visitor(); cn.visitChildren(v); } } } @override visitMethodInvocation(MethodInvocation node) { String result = "print(\$a\$b)"; Token resultToken = new StringToken(TokenType.STRING, result, node.beginToken.offset); AstNode replacement = new SimpleStringLiteral(resultToken, result); node.parent.accept(new NodeReplacer(node, replacement)); } }
0 comments:
Post a Comment