{"id":15496480,"url":"https://github.com/rodydavis/flutter_ast","last_synced_at":"2025-04-15T10:29:56.626Z","repository":{"id":101928560,"uuid":"297719625","full_name":"rodydavis/flutter_ast","owner":"rodydavis","description":"Flutter and Dart AST Analyzer/Parser","archived":false,"fork":false,"pushed_at":"2021-09-27T18:11:17.000Z","size":115,"stargazers_count":117,"open_issues_count":4,"forks_count":28,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-10T05:07:06.749Z","etag":null,"topics":["analyzer","ast","dart","flutter","parser"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rodydavis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-09-22T17:15:30.000Z","updated_at":"2024-11-30T04:30:04.000Z","dependencies_parsed_at":null,"dependency_job_id":"54d89038-8940-4c15-97fe-6e19fb7de099","html_url":"https://github.com/rodydavis/flutter_ast","commit_stats":{"total_commits":39,"total_committers":2,"mean_commits":19.5,"dds":0.1282051282051282,"last_synced_commit":"1d8cefdcef966f76d3ee2c556ef60a50a579eb82"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodydavis%2Fflutter_ast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodydavis%2Fflutter_ast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodydavis%2Fflutter_ast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodydavis%2Fflutter_ast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rodydavis","download_url":"https://codeload.github.com/rodydavis/flutter_ast/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249051382,"owners_count":21204798,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analyzer","ast","dart","flutter","parser"],"created_at":"2024-10-02T08:25:24.010Z","updated_at":"2025-04-15T10:29:56.607Z","avatar_url":"https://github.com/rodydavis.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dart/Flutter AST Generator\n\nParse a Dart or Flutter file and return a opinionated AST for use to create a dynamic widget or runtime. Works in a browser or native at runtime.\n\nYou can pass an input as a file or directory:\n```\n$ dart ./bin/generator.dart -p samples/example.dart\n\n$ dart ./bin/generator.dart -p samples    \n```\n\nOr you can call the method directly:\n```dart\nfinal DartResult result = parseSource(\"Dart Code Here\");\nprint(result.toJson());\n```\n\n## Features\n\n- ✅  Classes\n- ✅  Enums\n- ✅  Logic Tree\n- ✅  Flutter Support\n- ✅  Top Level Methods and Variables\n- ✅  Methods\n- ✅  Fields\n- ✅  Constructors\n\n## Example\n\nHere is a sample input:\n```dart\nimport 'package:flutter/material.dart';\n\nenum MyEnum { one, type, three }\n\nconst int kGlobalField = 1;\n\n/// This is a doc comment\nclass MyScreen extends StatelessWidget {\n  const MyScreen(this.position, {Key key, this.myField = false, this.mySecondField = 1, \n  this.numField = 3,\n  this.mapField = const {},\n  this.dateField,\n  this.listField  = const [],\n  }) : super(key: key);\n\n  const MyScreen.alt(this.position, {Key key, this.mySecondField = double.infinity,\n  this.numField = 3,\n  this.mapField = const {},\n  this.listField  = const [],\n  this.dateField,\n  }) :  this.myField = true,  super(key: key);\n\n  static const String routeName = '/my_route';\n\n  final bool myField;\n  final double mySecondField;\n  final num numField;\n  final Map mapField;\n  final DateTime dateField;\n  final List listField;\n\n  final int position;\n\n  // This is a normal comment\n  Map\u003cString, dynamic\u003e toJson() {\n    return {};\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (myField) {\n      return mySecondField == 1 ? Container(color: Colors.red) : Container(color: Colors.blue);\n    }\n    return Container(\n      color: Colors.red,\n      width: 20,\n      child: Center(\n        child: Builder((context) {\n          return Text('Hello World');\n        }),\n      ),\n    );\n  }\n}\n\nvoid myGlobalMethod() {\n\n}\n\n// Ignore this simple comment\nclass Simple {\n  String value;\n}\n\n```\n\nAnd that would produce this output:\n\n```json\n{\n  \"file\": {\n    \"name\": null,\n    \"imports\": [\n      \"package:flutter/material.dart\"\n    ],\n    \"classes\": [\n      {\n        \"name\": \"MyScreen\",\n        \"comments\": [\n          \"This is a doc comment\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"routeName\",\n            \"type\": \"String\"\n          },\n          {\n            \"name\": \"myField\",\n            \"type\": \"bool\"\n          },\n          {\n            \"name\": \"mySecondField\",\n            \"type\": \"double\"\n          },\n          {\n            \"name\": \"numField\",\n            \"type\": \"num\"\n          },\n          {\n            \"name\": \"mapField\",\n            \"type\": \"Map\"\n          },\n          {\n            \"name\": \"dateField\",\n            \"type\": \"DateTime\"\n          },\n          {\n            \"name\": \"listField\",\n            \"type\": \"List\"\n          },\n          {\n            \"name\": \"position\",\n            \"type\": \"int\"\n          }\n        ],\n        \"constructors\": [\n          {\n            \"name\": \"MyScreen\",\n            \"properties\": [\n              {\n                \"value\": null,\n                \"name\": \"key\",\n                \"type\": \"Key\",\n                \"isConst\": false,\n                \"isFinal\": false,\n                \"isNamed\": true,\n                \"isOptional\": true,\n                \"isPositional\": false,\n                \"isRequired\": false,\n                \"isRequiredPositional\": false,\n                \"isSynthetic\": false,\n                \"isRequiredNamed\": false,\n                \"isOptionalNamed\": true\n              },\n              {\n                \"value\": \"false\",\n                \"name\": \"myField\",\n                \"type\": \"bool\",\n                \"isConst\": false,\n                \"isFinal\": false,\n                \"isNamed\": true,\n                \"isOptional\": true,\n                \"isPositional\": false,\n                \"isRequired\": false,\n                \"isRequiredPositional\": false,\n                \"isSynthetic\": false,\n                \"isRequiredNamed\": false,\n                \"isOptionalNamed\": true\n              },\n              {\n                \"value\": \"1\",\n                \"name\": \"mySecondField\",\n                \"type\": \"double\",\n                \"isConst\": false,\n                \"isFinal\": false,\n                \"isNamed\": true,\n                \"isOptional\": true,\n                \"isPositional\": false,\n                \"isRequired\": false,\n                \"isRequiredPositional\": false,\n                \"isSynthetic\": false,\n                \"isRequiredNamed\": false,\n                \"isOptionalNamed\": true\n              },\n              {\n                \"value\": \"3\",\n                \"name\": \"numField\",\n                \"type\": \"num\",\n                \"isConst\": false,\n                \"isFinal\": false,\n                \"isNamed\": true,\n                \"isOptional\": true,\n                \"isPositional\": false,\n                \"isRequired\": false,\n                \"isRequiredPositional\": false,\n                \"isSynthetic\": false,\n                \"isRequiredNamed\": false,\n                \"isOptionalNamed\": true\n              },\n              {\n                \"value\": \"const {}\",\n                \"name\": \"mapField\",\n                \"type\": \"Map\",\n                \"isConst\": false,\n                \"isFinal\": false,\n                \"isNamed\": true,\n                \"isOptional\": true,\n                \"isPositional\": false,\n                \"isRequired\": false,\n                \"isRequiredPositional\": false,\n                \"isSynthetic\": false,\n                \"isRequiredNamed\": false,\n                \"isOptionalNamed\": true\n              },\n              {\n                \"value\": null,\n                \"name\": \"dateField\",\n                \"type\": \"DateTime\",\n                \"isConst\": false,\n                \"isFinal\": false,\n                \"isNamed\": true,\n                \"isOptional\": true,\n                \"isPositional\": false,\n                \"isRequired\": false,\n                \"isRequiredPositional\": false,\n                \"isSynthetic\": false,\n                \"isRequiredNamed\": false,\n                \"isOptionalNamed\": true\n              },\n              {\n                \"value\": \"const []\",\n                \"name\": \"listField\",\n                \"type\": \"List\",\n                \"isConst\": false,\n                \"isFinal\": false,\n                \"isNamed\": true,\n                \"isOptional\": true,\n                \"isPositional\": false,\n                \"isRequired\": false,\n                \"isRequiredPositional\": false,\n                \"isSynthetic\": false,\n                \"isRequiredNamed\": false,\n                \"isOptionalNamed\": true\n              }\n            ]\n          },\n          {\n            \"name\": \"alt\",\n            \"properties\": [\n              {\n                \"value\": null,\n                \"name\": \"key\",\n                \"type\": \"Key\",\n                \"isConst\": false,\n                \"isFinal\": false,\n                \"isNamed\": true,\n                \"isOptional\": true,\n                \"isPositional\": false,\n                \"isRequired\": false,\n                \"isRequiredPositional\": false,\n                \"isSynthetic\": false,\n                \"isRequiredNamed\": false,\n                \"isOptionalNamed\": true\n              },\n              {\n                \"value\": null,\n                \"name\": \"mySecondField\",\n                \"type\": \"double\",\n                \"isConst\": false,\n                \"isFinal\": false,\n                \"isNamed\": true,\n                \"isOptional\": true,\n                \"isPositional\": false,\n                \"isRequired\": false,\n                \"isRequiredPositional\": false,\n                \"isSynthetic\": false,\n                \"isRequiredNamed\": false,\n                \"isOptionalNamed\": true\n              },\n              {\n                \"value\": \"3\",\n                \"name\": \"numField\",\n                \"type\": \"num\",\n                \"isConst\": false,\n                \"isFinal\": false,\n                \"isNamed\": true,\n                \"isOptional\": true,\n                \"isPositional\": false,\n                \"isRequired\": false,\n                \"isRequiredPositional\": false,\n                \"isSynthetic\": false,\n                \"isRequiredNamed\": false,\n                \"isOptionalNamed\": true\n              },\n              {\n                \"value\": \"const {}\",\n                \"name\": \"mapField\",\n                \"type\": \"Map\",\n                \"isConst\": false,\n                \"isFinal\": false,\n                \"isNamed\": true,\n                \"isOptional\": true,\n                \"isPositional\": false,\n                \"isRequired\": false,\n                \"isRequiredPositional\": false,\n                \"isSynthetic\": false,\n                \"isRequiredNamed\": false,\n                \"isOptionalNamed\": true\n              },\n              {\n                \"value\": \"const []\",\n                \"name\": \"listField\",\n                \"type\": \"List\",\n                \"isConst\": false,\n                \"isFinal\": false,\n                \"isNamed\": true,\n                \"isOptional\": true,\n                \"isPositional\": false,\n                \"isRequired\": false,\n                \"isRequiredPositional\": false,\n                \"isSynthetic\": false,\n                \"isRequiredNamed\": false,\n                \"isOptionalNamed\": true\n              },\n              {\n                \"value\": null,\n                \"name\": \"dateField\",\n                \"type\": \"DateTime\",\n                \"isConst\": false,\n                \"isFinal\": false,\n                \"isNamed\": true,\n                \"isOptional\": true,\n                \"isPositional\": false,\n                \"isRequired\": false,\n                \"isRequiredPositional\": false,\n                \"isSynthetic\": false,\n                \"isRequiredNamed\": false,\n                \"isOptionalNamed\": true\n              }\n            ]\n          }\n        ],\n        \"methods\": [\n          {\n            \"name\": \"toJson\",\n            \"body\": {\n              \"name\": \"method_declaration\",\n              \"values\": [\n                {\n                  \"name\": \"type\",\n                  \"props\": {\n                    \"0\": \"Map\u003cString, dynamic\u003e\"\n                  }\n                },\n                {\n                  \"name\": \"declaration\",\n                  \"values\": []\n                },\n                {\n                  \"name\": \"block_body\",\n                  \"values\": [\n                    {\n                      \"name\": \"block\",\n                      \"values\": [\n                        {\n                          \"name\": \"return\",\n                          \"values\": [\n                            {\n                              \"name\": \"value\",\n                              \"props\": {\n                                \"0\": {\n                                  \"type\": \"Map\",\n                                  \"value\": \"{}\"\n                                }\n                              }\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  ]\n                }\n              ]\n            },\n            \"parameters\": []\n          },\n          {\n            \"name\": \"build\",\n            \"body\": {\n              \"name\": \"method_declaration\",\n              \"values\": [\n                {\n                  \"name\": \"type\",\n                  \"props\": {\n                    \"0\": \"Widget\"\n                  }\n                },\n                {\n                  \"name\": \"declaration\",\n                  \"values\": []\n                },\n                {\n                  \"name\": \"block_body\",\n                  \"values\": [\n                    {\n                      \"name\": \"block\",\n                      \"values\": [\n                        {\n                          \"name\": \"if\",\n                          \"values\": [\n                            {\n                              \"name\": \"name\",\n                              \"props\": {\n                                \"0\": \"myField\"\n                              }\n                            },\n                            {\n                              \"name\": \"block\",\n                              \"values\": [\n                                {\n                                  \"name\": \"return\",\n                                  \"values\": [\n                                    {\n                                      \"name\": \"conditional\",\n                                      \"values\": [\n                                        {\n                                          \"name\": \"binary\",\n                                          \"left\": {\n                                            \"name\": \"name\",\n                                            \"props\": {\n                                              \"0\": \"mySecondField\"\n                                            }\n                                          },\n                                          \"right\": {\n                                            \"name\": \"value\",\n                                            \"props\": {\n                                              \"0\": {\n                                                \"type\": \"int\",\n                                                \"value\": \"1\"\n                                              }\n                                            }\n                                          },\n                                          \"operation\": \"==\"\n                                        },\n                                        {\n                                          \"name\": \"constructor\",\n                                          \"value\": \"Container\",\n                                          \"arguments\": {\n                                            \"color\": null\n                                          }\n                                        },\n                                        {\n                                          \"name\": \"constructor\",\n                                          \"value\": \"Container\",\n                                          \"arguments\": {\n                                            \"color\": null\n                                          }\n                                        }\n                                      ]\n                                    }\n                                  ]\n                                }\n                              ]\n                            }\n                          ]\n                        },\n                        {\n                          \"name\": \"return\",\n                          \"values\": [\n                            {\n                              \"name\": \"constructor\",\n                              \"value\": \"Container\",\n                              \"arguments\": {\n                                \"color\": null,\n                                \"width\": {\n                                  \"name\": \"value\",\n                                  \"props\": {\n                                    \"0\": {\n                                      \"type\": \"int\",\n                                      \"value\": \"20\"\n                                    }\n                                  }\n                                },\n                                \"child\": {\n                                  \"name\": \"constructor\",\n                                  \"value\": \"Center\",\n                                  \"arguments\": {\n                                    \"child\": {\n                                      \"name\": \"constructor\",\n                                      \"value\": \"Builder\",\n                                      \"arguments\": {}\n                                    }\n                                  }\n                                }\n                              }\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  ]\n                }\n              ]\n            },\n            \"parameters\": []\n          }\n        ],\n        \"tree\": {\n          \"name\": null,\n          \"body\": {\n            \"name\": \"block_body\",\n            \"values\": [\n              {\n                \"name\": \"block\",\n                \"values\": [\n                  {\n                    \"name\": \"if\",\n                    \"values\": [\n                      {\n                        \"name\": \"name\",\n                        \"props\": {\n                          \"0\": \"myField\"\n                        }\n                      },\n                      {\n                        \"name\": \"block\",\n                        \"values\": [\n                          {\n                            \"name\": \"return\",\n                            \"values\": [\n                              {\n                                \"name\": \"conditional\",\n                                \"values\": [\n                                  {\n                                    \"name\": \"binary\",\n                                    \"left\": {\n                                      \"name\": \"name\",\n                                      \"props\": {\n                                        \"0\": \"mySecondField\"\n                                      }\n                                    },\n                                    \"right\": {\n                                      \"name\": \"value\",\n                                      \"props\": {\n                                        \"0\": {\n                                          \"type\": \"int\",\n                                          \"value\": \"1\"\n                                        }\n                                      }\n                                    },\n                                    \"operation\": \"==\"\n                                  },\n                                  {\n                                    \"name\": \"constructor\",\n                                    \"value\": \"Container\",\n                                    \"arguments\": {\n                                      \"color\": null\n                                    }\n                                  },\n                                  {\n                                    \"name\": \"constructor\",\n                                    \"value\": \"Container\",\n                                    \"arguments\": {\n                                      \"color\": null\n                                    }\n                                  }\n                                ]\n                              }\n                            ]\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"return\",\n                    \"values\": [\n                      {\n                        \"name\": \"constructor\",\n                        \"value\": \"Container\",\n                        \"arguments\": {\n                          \"color\": null,\n                          \"width\": {\n                            \"name\": \"value\",\n                            \"props\": {\n                              \"0\": {\n                                \"type\": \"int\",\n                                \"value\": \"20\"\n                              }\n                            }\n                          },\n                          \"child\": {\n                            \"name\": \"constructor\",\n                            \"value\": \"Center\",\n                            \"arguments\": {\n                              \"child\": {\n                                \"name\": \"constructor\",\n                                \"value\": \"Builder\",\n                                \"arguments\": {}\n                              }\n                            }\n                          }\n                        }\n                      }\n                    ]\n                  }\n                ]\n              }\n            ]\n          },\n          \"parameters\": []\n        }\n      },\n      {\n        \"name\": \"Simple\",\n        \"comments\": [],\n        \"fields\": [\n          {\n            \"name\": \"value\",\n            \"type\": \"String\"\n          }\n        ],\n        \"constructors\": [],\n        \"methods\": []\n      }\n    ],\n    \"enums\": [\n      {\n        \"name\": \"MyEnum\",\n        \"values\": [\n          \"one\",\n          \"type\",\n          \"three\"\n        ]\n      }\n    ],\n    \"fields\": [\n      {\n        \"name\": \"kGlobalField\",\n        \"type\": \"int\"\n      }\n    ],\n    \"methods\": [\n      {\n        \"name\": \"myGlobalMethod\",\n        \"body\": {\n          \"name\": \"function_declaration\",\n          \"values\": [\n            {\n              \"name\": \"type\",\n              \"props\": {\n                \"0\": \"void\"\n              }\n            },\n            {\n              \"name\": \"declaration\",\n              \"values\": []\n            },\n            {\n              \"name\": \"function\",\n              \"values\": [\n                {\n                  \"name\": \"block_body\",\n                  \"values\": [\n                    {\n                      \"name\": \"block\",\n                      \"values\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        },\n        \"parameters\": []\n      }\n    ]\n  },\n  \"errors\": []\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodydavis%2Fflutter_ast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frodydavis%2Fflutter_ast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodydavis%2Fflutter_ast/lists"}