【问题标题】:how to edit node using Analyser in dart如何在 dart 中使用 Analyzer 编辑节点
【发布时间】:2018-11-13 17:09:00
【问题描述】:

如何使用分析器在 dart 中编辑源文件。 这是我尝试过的

import 'package:analyzer/src/generated/ast.dart';
import 'package:analyzer/src/generated/error.dart';
import 'package:analyzer/src/generated/parser.dart';
import 'package:analyzer/src/generated/scanner.dart';

String src = """
Dynamism d = new Dynamism(expert:true);
main(){
var o = new Object();
d.on(o).hi = 'bye';
}
""";
main() {
var ast = parseCompilationUnit(src, parseFunctionBodies: true);
print('initial value: ');
print(ast.toSource());
var v = new Visitor();
ast.visitChildren(v);
print('After modification:');
print(ast.toSource());
}
class Visitor extends RecursiveAstVisitor {
@override
 visitAssignmentExpression(AssignmentExpression node) {
//filter
var p = new RegExp(r'.*\.on\(\w\)');
if (!p.hasMatch(node.toString())) return;

//replace
SimpleStringLiteral ssl = _create_SimpleStringLiteral(node);
node.parent.accept(new NodeReplacer(node, ssl));
}
}

SimpleStringLiteral _create_SimpleStringLiteral(AstNode node) {
String new_string = modify(node.toString());
int line_num = node.offset;
//holds the position and type
StringToken st = new StringToken(TokenType.STRING, new_string, 
line_num);
return new SimpleStringLiteral(st, new_string);
}

String modify(String s) {
List parts = s.split('=');
var value = parts[1];
List l = parts[0].split('.');
String dynamism = l.sublist(0, l.length - 1).join('.');
String propertyName = l.last.trim();
return '${dynamism}.set("${propertyName}",${value})';
}

但它在 SimpleStringLiteral 上抛出错误,说它是一个抽象类。请帮我将“再见”编辑为“再见”。我认为以前版本的 dart 有它的实现,但现在它是抽象的。

【问题讨论】:

    标签: dart dart-analyzer


    【解决方案1】:

    而不是使用 return new SimpleStringLiteral(st, new_string) 试试 返回 astFactory.simpleStringLiteral(st, new_string);

    import 'package:analyzer/src/generated/ast.dart';
    import 'package:analyzer/dart/ast/standard_ast_factory.dart';
    import 'package:analyzer/src/generated/error.dart';
    import 'package:analyzer/src/generated/parser.dart';
    import 'package:analyzer/src/generated/scanner.dart';
    
    String src = """
    Dynamism d = new Dynamism(expert:true);
    main(){
    var o = new Object();
    d.on(o).hi = 'bye';
    }
    """;
    main() {
    var ast = parseCompilationUnit(src, parseFunctionBodies: true);
    print('initial value: ');
    print(ast.toSource());
    var v = new Visitor();
    ast.visitChildren(v);
    print('After modification:');
    print(ast.toSource());
    }
    class Visitor extends RecursiveAstVisitor {
    @override
     visitAssignmentExpression(AssignmentExpression node) {
    //filter
    var p = new RegExp(r'.*\.on\(\w\)');
    if (!p.hasMatch(node.toString())) return;
    
    //replace
    SimpleStringLiteral ssl = _create_SimpleStringLiteral(node);
    node.parent.accept(new NodeReplacer(node, ssl));
    }
    }
    
    SimpleStringLiteral _create_SimpleStringLiteral(AstNode node) {
    String new_string = modify(node.toString());
    int line_num = node.offset;
    //holds the position and type
    StringToken st = new StringToken(TokenType.STRING, new_string, 
    line_num);
    return astFactory.simpleStringLiteral(st, new_string);
    }
    
    String modify(String s) {
    List parts = s.split('=');
    var value = parts[1];
    List l = parts[0].split('.');
    String dynamism = l.sublist(0, l.length - 1).join('.');
    String propertyName = l.last.trim();
    return '${dynamism}.set("${propertyName}",${value})';
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 2012-05-13
      相关资源
      最近更新 更多