GithubHelp home page GithubHelp logo

yaowen369 / flutterdynamicast Goto Github PK

View Code? Open in Web Editor NEW

This project forked from genius158/flutterdynamicast

0.0 1.0 0.0 110 KB

flutter 动态执行dart AST

Kotlin 0.17% Swift 0.53% Objective-C 0.05% Dart 94.15% HTML 5.10%

flutterdynamicast's Introduction

FlutterDynamicAST

flutter 动态执行 ast 示例

生成 ast

  • 生成 lib下的test3.dart: dart simple_ast.dart -f test3.dart

运算相关 (test2.dart)

具体执行见main函数

dynamic test3(int num) {
    if (num % 2 == 0) {
      return num * 2;
    }else{
      return num;
    }
  }
  
//ast
{
    "type":"MethodDeclaration",
    "name":{
        "type":"SimpleIdentifier",
        "isPrivateName":false,
        "name":"test"
    },
    "parameters":{
        "type":"FormalParameterList",
        "args":[
            {
                "type":"SimpleFormalParameter",
                "paramType":{
                    "type":"TypeName",
                    "name":{
                        "type":"SimpleIdentifier",
                        "isPrivateName":false,
                        "name":"String"
                    }
                },
                "name":"test",
                "identifier":{
                    "type":"SimpleIdentifier",
                    "isPrivateName":false,
                    "name":"test"
                }
            }
        ]
    },
    "typeParameters":null,
    "body":{
        "type":"BlockFunctionBody",
        "keyword":null,
        "block":{
            "type":"Block",
            "statements":[
                {
                    "type":"VariableDeclarationStatement",
                    "variables":{
                        "type":"VariableDeclarationList",
                        "typeAnnotation":null,
                        "variables":[
                            {
                                "type":"VariableDeclarator",
                                "name":{
                                    "type":"SimpleIdentifier",
                                    "isPrivateName":false,
                                    "name":"res"
                                },
                                "initializer":{
                                    "type":"BinaryExpression",
                                    "lexeme":"+",
                                    "leftOperand":{
                                        "type":"SimpleIdentifier",
                                        "isPrivateName":false,
                                        "name":"test"
                                    },
                                    "rightOperand":{
                                        "type":"SimpleStringLiteral",
                                        "value":"test1"
                                    }
                                }
                            }
                        ]
                    }
                },
                {
                    "type":"ReturnStatement",
                    "expression":{
                        "type":"SimpleIdentifier",
                        "isPrivateName":false,
                        "name":"res"
                    }
                }
            ]
        }
    },
    "returnType":{
        "type":"TypeName",
        "name":{
            "type":"SimpleIdentifier",
            "isPrivateName":false,
            "name":"String"
        }
    }
}

await 实现见(test6.dart)

test3(String str) async {
  var res1 = await test(str);
  var test2 = await test("111111111111");
  var test3 = await test("222222222222");
  return "res1: $res1   res: $test2 +  $test3  ${await test("4444444444")} ${await test("555555")}";
}
  
  
main() async {
  Test6 test6 = Test6();

  DVM dvm = DVM(_DvmFIXRegister(test6), """
      {"type":"CompilationUnit","declarations":[{"type":"ClassDeclaration","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"Test6"},"isAbstract":false,"members":[{"type":"MethodDeclaration","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test"},"parameters":{"type":"FormalParameterList","args":[{"type":"SimpleFormalParameter","paramType":{"type":"TypeName","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"String"}},"name":"test","identifier":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test"}}]},"typeParameters":null,"body":{"type":"BlockFunctionBody","keyword":"ASYNC","block":{"type":"Block","statements":[{"type":"ExpressionStatement","expression":{"type":"MethodInvocation","methodName":{"type":"SimpleIdentifier","isPrivateName":false,"name":"sleep"},"target":null,"argumentList":{"type":"ArgumentList","arguments":[]}}},{"type":"ReturnStatement","expression":{"type":"MethodInvocation","methodName":{"type":"SimpleIdentifier","isPrivateName":false,"name":"Future"},"target":null,"argumentList":{"type":"ArgumentList","arguments":[{"type":"FunctionExpression","parameters":{"type":"FormalParameterList","args":[]},"typeParameters":null,"body":{"type":"ExpressionFunctionBody","expression":{"type":"BinaryExpression","lexeme":"+","leftOperand":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test"},"rightOperand":{"type":"SimpleStringLiteral","value":"sleep 1 seconds "}}}}]}}}]}},"returnType":{"type":"TypeName","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"Future"}}},{"type":"MethodDeclaration","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test2"},"parameters":{"type":"FormalParameterList","args":[{"type":"SimpleFormalParameter","paramType":{"type":"TypeName","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"String"}},"name":"str","identifier":{"type":"SimpleIdentifier","isPrivateName":false,"name":"str"}}]},"typeParameters":null,"body":{"type":"BlockFunctionBody","keyword":"ASYNC","block":{"type":"Block","statements":[{"type":"VariableDeclarationStatement","variables":{"type":"VariableDeclarationList","typeAnnotation":null,"variables":[{"type":"VariableDeclarator","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"res1"},"initializer":{"type":"AwaitExpression","expression":{"type":"MethodInvocation","methodName":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test"},"target":null,"argumentList":{"type":"ArgumentList","arguments":[{"type":"SimpleIdentifier","isPrivateName":false,"name":"str"}]}}}}]}},{"type":"VariableDeclarationStatement","variables":{"type":"VariableDeclarationList","typeAnnotation":null,"variables":[{"type":"VariableDeclarator","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test2"},"initializer":{"type":"AwaitExpression","expression":{"type":"MethodInvocation","methodName":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test"},"target":null,"argumentList":{"type":"ArgumentList","arguments":[{"type":"SimpleStringLiteral","value":"111111111111"}]}}}}]}},{"type":"VariableDeclarationStatement","variables":{"type":"VariableDeclarationList","typeAnnotation":null,"variables":[{"type":"VariableDeclarator","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test3"},"initializer":{"type":"AwaitExpression","expression":{"type":"MethodInvocation","methodName":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test"},"target":null,"argumentList":{"type":"ArgumentList","arguments":[{"type":"SimpleStringLiteral","value":"222222222222"}]}}}}]}},{"type":"ReturnStatement","expression":{"type":"StringInterpolation","elements":[{"type":"InterpolationString","value":"res1: "},{"type":"InterpolationExpression","expression":{"type":"SimpleIdentifier","isPrivateName":false,"name":"res1"}},{"type":"InterpolationString","value":"   res: "},{"type":"InterpolationExpression","expression":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test2"}},{"type":"InterpolationString","value":"    "},{"type":"InterpolationExpression","expression":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test3"}},{"type":"InterpolationString","value":""}]}}]}},"returnType":null},{"type":"MethodDeclaration","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test3"},"parameters":{"type":"FormalParameterList","args":[{"type":"SimpleFormalParameter","paramType":{"type":"TypeName","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"String"}},"name":"str","identifier":{"type":"SimpleIdentifier","isPrivateName":false,"name":"str"}}]},"typeParameters":null,"body":{"type":"BlockFunctionBody","keyword":"ASYNC","block":{"type":"Block","statements":[{"type":"VariableDeclarationStatement","variables":{"type":"VariableDeclarationList","typeAnnotation":null,"variables":[{"type":"VariableDeclarator","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"res1"},"initializer":{"type":"AwaitExpression","expression":{"type":"MethodInvocation","methodName":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test"},"target":null,"argumentList":{"type":"ArgumentList","arguments":[{"type":"SimpleIdentifier","isPrivateName":false,"name":"str"}]}}}}]}},{"type":"VariableDeclarationStatement","variables":{"type":"VariableDeclarationList","typeAnnotation":null,"variables":[{"type":"VariableDeclarator","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test2"},"initializer":{"type":"AwaitExpression","expression":{"type":"MethodInvocation","methodName":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test"},"target":null,"argumentList":{"type":"ArgumentList","arguments":[{"type":"SimpleStringLiteral","value":"111111111111"}]}}}}]}},{"type":"VariableDeclarationStatement","variables":{"type":"VariableDeclarationList","typeAnnotation":null,"variables":[{"type":"VariableDeclarator","name":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test3"},"initializer":{"type":"AwaitExpression","expression":{"type":"MethodInvocation","methodName":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test"},"target":null,"argumentList":{"type":"ArgumentList","arguments":[{"type":"SimpleStringLiteral","value":"222222222222"}]}}}}]}},{"type":"ReturnStatement","expression":{"type":"StringInterpolation","elements":[{"type":"InterpolationString","value":"res1: "},{"type":"InterpolationExpression","expression":{"type":"SimpleIdentifier","isPrivateName":false,"name":"res1"}},{"type":"InterpolationString","value":"   res: "},{"type":"InterpolationExpression","expression":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test2"}},{"type":"InterpolationString","value":" +  "},{"type":"InterpolationExpression","expression":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test3"}},{"type":"InterpolationString","value":"  "},{"type":"InterpolationExpression","expression":{"type":"AwaitExpression","expression":{"type":"MethodInvocation","methodName":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test"},"target":null,"argumentList":{"type":"ArgumentList","arguments":[{"type":"SimpleStringLiteral","value":"4444444444"}]}}}},{"type":"InterpolationString","value":" "},{"type":"InterpolationExpression","expression":{"type":"AwaitExpression","expression":{"type":"MethodInvocation","methodName":{"type":"SimpleIdentifier","isPrivateName":false,"name":"test"},"target":null,"argumentList":{"type":"ArgumentList","arguments":[{"type":"SimpleStringLiteral","value":"555555"}]}}}},{"type":"InterpolationString","value":""}]}}]}},"returnType":null}]}],"directives":[{"type":"ImportDirective","keyword":"IMPORT","uri":{"type":"SimpleStringLiteral","value":"dart:io"}},{"type":"ImportDirective","keyword":"IMPORT","uri":{"type":"SimpleStringLiteral","value":"dvm.dart"}}]}
      """);

  print("test6.test2  ${await test6.test2("dddddddd ")}");
  // 执行ast
  var res = await dvm.execute("Test6", "test2", {"str": "dddddddd "});
  print(" dvm.execute test2 ---------  $res");

  // 执行ast
  var dvmtest3 = await dvm.execute("Test6", "test3", {"str": "dddddddd "});
  print("dvm.execute test3  $dvmtest3");
  print("test6.test3  ${await test6.test3("dddddddd ")}");
}

hotfix test (test4.dart)

List test(String test) {
    // TODO ======== GENERATOR_BY_DVM_FIX hotfix enable ========
    if (dvm.hotFix("Test4", "test", 1)) {
      return dvm.execute("Test4", "test", {"test": test});
    }

    var list = [];
    list.add(22222);
    list.add(test);
    list.add(12.2);
    list[0] = 1111111;

    list.addAll(["8888", "9999"]);
    return list;
  }

flutterdynamicast's People

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.