8000 关于 Transformer 的用法问题 · Issue #78 · XianyuTech/aspectd · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

关于 Transformer 的用法问题 #78

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
IamKing opened this issue Dec 11, 2020 · 2 comments
Closed

关于 Transformer 的用法问题 #78

IamKing opened this issue Dec 11, 2020 · 2 comments

Comments

@IamKing
Copy link
IamKing commented Dec 11, 2020

@kangwang1988 @fightcoder 大佬,咨询关于 Transformer的问题。
我想要修改 dill 文件中,某个类的某个方法的方法名:例如修改 _MyHomePageState中的_incrementCounter方法为_incrementCounter123,这么做的目的是加深我对 ast 和 visitor 的理解,下面是我的代码。我的大概思路是找到对应的 dart 文件的 Library,然后 visit 这个 Library,找到对应的 Class,在 visitClass 中根据名字找到这个Class Node,然后遍历其子元素transformChildren,最后在 visitProcedure中获取方法名,对其更改。

当我按照这个方式来做以后,在通过writeComponentToBinary(component, path + "2");的时候会有各种报错,在visitProcedure中尝试了很多写法都不行,比如创建一个新的 Procedure返回。
求助大佬,我这边的做法存在什么问题?应该怎么做? 感激提供的任何帮助。

测试代码:

class MethodVisitor extends Transformer {
  @override
  TreeNode visitClass(Class node) {
    print('visitClass=====${node.name}');
    if (node.name == '_MyHomePageState') {
      print("===121221=====${node.procedures}");
      node.transformChildren(this);
    }
    return super.visitClass(node);
  }

  @override
  TreeNode visitProcedure(Procedure node) {
    print('visitProcedure=====${node.name}');
    if (node.reference.canonicalName.name == '_incrementCounter') {
      node.name =Name("_incrementCounter123", node.parent.parent );
    }
    return super.visitProcedure(node);
  }

  @override
  TreeNode visitMethodInvocation(MethodInvocation node) {
    print('methodInvocation===${node.name}===');
    return super.visitMethodInvocation(node);
  }

}

void main() {
  //读取一个 dill 文件,将数据存放在 Component 中
  String path = "/Users/Documents/work/idea_workspace/dart_test/bin/app.dill";
  Component component = new Component();
  List bytes = File(path).readAsBytesSync();
  BinaryBuilderWithMetadata(bytes).readComponent(component);
  int a = 10;

  MethodVisitor methodVisitor = new MethodVisitor();
  //每一个 dart 文件都是一个 Library,每一个 Library 都包含 fields(fieldsInternal)、members、constructors(constructorsInternal)、procedures(proceduresInternal==method) 等
  component.libraries.forEach((element) {
    if (element.reference.canonicalName.name.endsWith('main.dart')) {
      methodVisitor.visitLibrary(element);
    }
  });

  writeComponentToBinary(component, path + "2");
}
@kangwang1988
Copy link
Contributor

现在不要去直接操作dill了
参考最新的实现

@IamKing
Copy link
Author
IamKing commented Dec 12, 2020

现在不要去直接操作dill了
参考最新的实现

一步一步来呀,知识就是在基础知识上一点点建立起来的,这样才能更好的理解。大佬,先帮我看看上面的问题哈~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants
0