项目作者: rodydavis

项目描述 :
Flutter and Dart AST Analyzer/Parser
高级语言: Dart
项目地址: git://github.com/rodydavis/flutter_ast.git
创建时间: 2020-09-22T17:15:30Z
项目社区:https://github.com/rodydavis/flutter_ast

开源协议:MIT License

下载


Dart/Flutter AST Generator

Parse 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.

You can pass an input as a file or directory:

  1. $ dart ./bin/generator.dart -p samples/example.dart
  2. $ dart ./bin/generator.dart -p samples

Or you can call the method directly:

  1. final DartResult result = parseSource("Dart Code Here");
  2. print(result.toJson());

Features

  • ✅ Classes
  • ✅ Enums
  • ✅ Logic Tree
  • ✅ Flutter Support
  • ✅ Top Level Methods and Variables
  • ✅ Methods
  • ✅ Fields
  • ✅ Constructors

Example

Here is a sample input:

  1. import 'package:flutter/material.dart';
  2. enum MyEnum { one, type, three }
  3. const int kGlobalField = 1;
  4. /// This is a doc comment
  5. class MyScreen extends StatelessWidget {
  6. const MyScreen(this.position, {Key key, this.myField = false, this.mySecondField = 1,
  7. this.numField = 3,
  8. this.mapField = const {},
  9. this.dateField,
  10. this.listField = const [],
  11. }) : super(key: key);
  12. const MyScreen.alt(this.position, {Key key, this.mySecondField = double.infinity,
  13. this.numField = 3,
  14. this.mapField = const {},
  15. this.listField = const [],
  16. this.dateField,
  17. }) : this.myField = true, super(key: key);
  18. static const String routeName = '/my_route';
  19. final bool myField;
  20. final double mySecondField;
  21. final num numField;
  22. final Map mapField;
  23. final DateTime dateField;
  24. final List listField;
  25. final int position;
  26. // This is a normal comment
  27. Map<String, dynamic> toJson() {
  28. return {};
  29. }
  30. @override
  31. Widget build(BuildContext context) {
  32. if (myField) {
  33. return mySecondField == 1 ? Container(color: Colors.red) : Container(color: Colors.blue);
  34. }
  35. return Container(
  36. color: Colors.red,
  37. width: 20,
  38. child: Center(
  39. child: Builder((context) {
  40. return Text('Hello World');
  41. }),
  42. ),
  43. );
  44. }
  45. }
  46. void myGlobalMethod() {
  47. }
  48. // Ignore this simple comment
  49. class Simple {
  50. String value;
  51. }

And that would produce this output:

  1. {
  2. "file": {
  3. "name": null,
  4. "imports": [
  5. "package:flutter/material.dart"
  6. ],
  7. "classes": [
  8. {
  9. "name": "MyScreen",
  10. "comments": [
  11. "This is a doc comment"
  12. ],
  13. "fields": [
  14. {
  15. "name": "routeName",
  16. "type": "String"
  17. },
  18. {
  19. "name": "myField",
  20. "type": "bool"
  21. },
  22. {
  23. "name": "mySecondField",
  24. "type": "double"
  25. },
  26. {
  27. "name": "numField",
  28. "type": "num"
  29. },
  30. {
  31. "name": "mapField",
  32. "type": "Map"
  33. },
  34. {
  35. "name": "dateField",
  36. "type": "DateTime"
  37. },
  38. {
  39. "name": "listField",
  40. "type": "List"
  41. },
  42. {
  43. "name": "position",
  44. "type": "int"
  45. }
  46. ],
  47. "constructors": [
  48. {
  49. "name": "MyScreen",
  50. "properties": [
  51. {
  52. "value": null,
  53. "name": "key",
  54. "type": "Key",
  55. "isConst": false,
  56. "isFinal": false,
  57. "isNamed": true,
  58. "isOptional": true,
  59. "isPositional": false,
  60. "isRequired": false,
  61. "isRequiredPositional": false,
  62. "isSynthetic": false,
  63. "isRequiredNamed": false,
  64. "isOptionalNamed": true
  65. },
  66. {
  67. "value": "false",
  68. "name": "myField",
  69. "type": "bool",
  70. "isConst": false,
  71. "isFinal": false,
  72. "isNamed": true,
  73. "isOptional": true,
  74. "isPositional": false,
  75. "isRequired": false,
  76. "isRequiredPositional": false,
  77. "isSynthetic": false,
  78. "isRequiredNamed": false,
  79. "isOptionalNamed": true
  80. },
  81. {
  82. "value": "1",
  83. "name": "mySecondField",
  84. "type": "double",
  85. "isConst": false,
  86. "isFinal": false,
  87. "isNamed": true,
  88. "isOptional": true,
  89. "isPositional": false,
  90. "isRequired": false,
  91. "isRequiredPositional": false,
  92. "isSynthetic": false,
  93. "isRequiredNamed": false,
  94. "isOptionalNamed": true
  95. },
  96. {
  97. "value": "3",
  98. "name": "numField",
  99. "type": "num",
  100. "isConst": false,
  101. "isFinal": false,
  102. "isNamed": true,
  103. "isOptional": true,
  104. "isPositional": false,
  105. "isRequired": false,
  106. "isRequiredPositional": false,
  107. "isSynthetic": false,
  108. "isRequiredNamed": false,
  109. "isOptionalNamed": true
  110. },
  111. {
  112. "value": "const {}",
  113. "name": "mapField",
  114. "type": "Map",
  115. "isConst": false,
  116. "isFinal": false,
  117. "isNamed": true,
  118. "isOptional": true,
  119. "isPositional": false,
  120. "isRequired": false,
  121. "isRequiredPositional": false,
  122. "isSynthetic": false,
  123. "isRequiredNamed": false,
  124. "isOptionalNamed": true
  125. },
  126. {
  127. "value": null,
  128. "name": "dateField",
  129. "type": "DateTime",
  130. "isConst": false,
  131. "isFinal": false,
  132. "isNamed": true,
  133. "isOptional": true,
  134. "isPositional": false,
  135. "isRequired": false,
  136. "isRequiredPositional": false,
  137. "isSynthetic": false,
  138. "isRequiredNamed": false,
  139. "isOptionalNamed": true
  140. },
  141. {
  142. "value": "const []",
  143. "name": "listField",
  144. "type": "List",
  145. "isConst": false,
  146. "isFinal": false,
  147. "isNamed": true,
  148. "isOptional": true,
  149. "isPositional": false,
  150. "isRequired": false,
  151. "isRequiredPositional": false,
  152. "isSynthetic": false,
  153. "isRequiredNamed": false,
  154. "isOptionalNamed": true
  155. }
  156. ]
  157. },
  158. {
  159. "name": "alt",
  160. "properties": [
  161. {
  162. "value": null,
  163. "name": "key",
  164. "type": "Key",
  165. "isConst": false,
  166. "isFinal": false,
  167. "isNamed": true,
  168. "isOptional": true,
  169. "isPositional": false,
  170. "isRequired": false,
  171. "isRequiredPositional": false,
  172. "isSynthetic": false,
  173. "isRequiredNamed": false,
  174. "isOptionalNamed": true
  175. },
  176. {
  177. "value": null,
  178. "name": "mySecondField",
  179. "type": "double",
  180. "isConst": false,
  181. "isFinal": false,
  182. "isNamed": true,
  183. "isOptional": true,
  184. "isPositional": false,
  185. "isRequired": false,
  186. "isRequiredPositional": false,
  187. "isSynthetic": false,
  188. "isRequiredNamed": false,
  189. "isOptionalNamed": true
  190. },
  191. {
  192. "value": "3",
  193. "name": "numField",
  194. "type": "num",
  195. "isConst": false,
  196. "isFinal": false,
  197. "isNamed": true,
  198. "isOptional": true,
  199. "isPositional": false,
  200. "isRequired": false,
  201. "isRequiredPositional": false,
  202. "isSynthetic": false,
  203. "isRequiredNamed": false,
  204. "isOptionalNamed": true
  205. },
  206. {
  207. "value": "const {}",
  208. "name": "mapField",
  209. "type": "Map",
  210. "isConst": false,
  211. "isFinal": false,
  212. "isNamed": true,
  213. "isOptional": true,
  214. "isPositional": false,
  215. "isRequired": false,
  216. "isRequiredPositional": false,
  217. "isSynthetic": false,
  218. "isRequiredNamed": false,
  219. "isOptionalNamed": true
  220. },
  221. {
  222. "value": "const []",
  223. "name": "listField",
  224. "type": "List",
  225. "isConst": false,
  226. "isFinal": false,
  227. "isNamed": true,
  228. "isOptional": true,
  229. "isPositional": false,
  230. "isRequired": false,
  231. "isRequiredPositional": false,
  232. "isSynthetic": false,
  233. "isRequiredNamed": false,
  234. "isOptionalNamed": true
  235. },
  236. {
  237. "value": null,
  238. "name": "dateField",
  239. "type": "DateTime",
  240. "isConst": false,
  241. "isFinal": false,
  242. "isNamed": true,
  243. "isOptional": true,
  244. "isPositional": false,
  245. "isRequired": false,
  246. "isRequiredPositional": false,
  247. "isSynthetic": false,
  248. "isRequiredNamed": false,
  249. "isOptionalNamed": true
  250. }
  251. ]
  252. }
  253. ],
  254. "methods": [
  255. {
  256. "name": "toJson",
  257. "body": {
  258. "name": "method_declaration",
  259. "values": [
  260. {
  261. "name": "type",
  262. "props": {
  263. "0": "Map<String, dynamic>"
  264. }
  265. },
  266. {
  267. "name": "declaration",
  268. "values": []
  269. },
  270. {
  271. "name": "block_body",
  272. "values": [
  273. {
  274. "name": "block",
  275. "values": [
  276. {
  277. "name": "return",
  278. "values": [
  279. {
  280. "name": "value",
  281. "props": {
  282. "0": {
  283. "type": "Map",
  284. "value": "{}"
  285. }
  286. }
  287. }
  288. ]
  289. }
  290. ]
  291. }
  292. ]
  293. }
  294. ]
  295. },
  296. "parameters": []
  297. },
  298. {
  299. "name": "build",
  300. "body": {
  301. "name": "method_declaration",
  302. "values": [
  303. {
  304. "name": "type",
  305. "props": {
  306. "0": "Widget"
  307. }
  308. },
  309. {
  310. "name": "declaration",
  311. "values": []
  312. },
  313. {
  314. "name": "block_body",
  315. "values": [
  316. {
  317. "name": "block",
  318. "values": [
  319. {
  320. "name": "if",
  321. "values": [
  322. {
  323. "name": "name",
  324. "props": {
  325. "0": "myField"
  326. }
  327. },
  328. {
  329. "name": "block",
  330. "values": [
  331. {
  332. "name": "return",
  333. "values": [
  334. {
  335. "name": "conditional",
  336. "values": [
  337. {
  338. "name": "binary",
  339. "left": {
  340. "name": "name",
  341. "props": {
  342. "0": "mySecondField"
  343. }
  344. },
  345. "right": {
  346. "name": "value",
  347. "props": {
  348. "0": {
  349. "type": "int",
  350. "value": "1"
  351. }
  352. }
  353. },
  354. "operation": "=="
  355. },
  356. {
  357. "name": "constructor",
  358. "value": "Container",
  359. "arguments": {
  360. "color": null
  361. }
  362. },
  363. {
  364. "name": "constructor",
  365. "value": "Container",
  366. "arguments": {
  367. "color": null
  368. }
  369. }
  370. ]
  371. }
  372. ]
  373. }
  374. ]
  375. }
  376. ]
  377. },
  378. {
  379. "name": "return",
  380. "values": [
  381. {
  382. "name": "constructor",
  383. "value": "Container",
  384. "arguments": {
  385. "color": null,
  386. "width": {
  387. "name": "value",
  388. "props": {
  389. "0": {
  390. "type": "int",
  391. "value": "20"
  392. }
  393. }
  394. },
  395. "child": {
  396. "name": "constructor",
  397. "value": "Center",
  398. "arguments": {
  399. "child": {
  400. "name": "constructor",
  401. "value": "Builder",
  402. "arguments": {}
  403. }
  404. }
  405. }
  406. }
  407. }
  408. ]
  409. }
  410. ]
  411. }
  412. ]
  413. }
  414. ]
  415. },
  416. "parameters": []
  417. }
  418. ],
  419. "tree": {
  420. "name": null,
  421. "body": {
  422. "name": "block_body",
  423. "values": [
  424. {
  425. "name": "block",
  426. "values": [
  427. {
  428. "name": "if",
  429. "values": [
  430. {
  431. "name": "name",
  432. "props": {
  433. "0": "myField"
  434. }
  435. },
  436. {
  437. "name": "block",
  438. "values": [
  439. {
  440. "name": "return",
  441. "values": [
  442. {
  443. "name": "conditional",
  444. "values": [
  445. {
  446. "name": "binary",
  447. "left": {
  448. "name": "name",
  449. "props": {
  450. "0": "mySecondField"
  451. }
  452. },
  453. "right": {
  454. "name": "value",
  455. "props": {
  456. "0": {
  457. "type": "int",
  458. "value": "1"
  459. }
  460. }
  461. },
  462. "operation": "=="
  463. },
  464. {
  465. "name": "constructor",
  466. "value": "Container",
  467. "arguments": {
  468. "color": null
  469. }
  470. },
  471. {
  472. "name": "constructor",
  473. "value": "Container",
  474. "arguments": {
  475. "color": null
  476. }
  477. }
  478. ]
  479. }
  480. ]
  481. }
  482. ]
  483. }
  484. ]
  485. },
  486. {
  487. "name": "return",
  488. "values": [
  489. {
  490. "name": "constructor",
  491. "value": "Container",
  492. "arguments": {
  493. "color": null,
  494. "width": {
  495. "name": "value",
  496. "props": {
  497. "0": {
  498. "type": "int",
  499. "value": "20"
  500. }
  501. }
  502. },
  503. "child": {
  504. "name": "constructor",
  505. "value": "Center",
  506. "arguments": {
  507. "child": {
  508. "name": "constructor",
  509. "value": "Builder",
  510. "arguments": {}
  511. }
  512. }
  513. }
  514. }
  515. }
  516. ]
  517. }
  518. ]
  519. }
  520. ]
  521. },
  522. "parameters": []
  523. }
  524. },
  525. {
  526. "name": "Simple",
  527. "comments": [],
  528. "fields": [
  529. {
  530. "name": "value",
  531. "type": "String"
  532. }
  533. ],
  534. "constructors": [],
  535. "methods": []
  536. }
  537. ],
  538. "enums": [
  539. {
  540. "name": "MyEnum",
  541. "values": [
  542. "one",
  543. "type",
  544. "three"
  545. ]
  546. }
  547. ],
  548. "fields": [
  549. {
  550. "name": "kGlobalField",
  551. "type": "int"
  552. }
  553. ],
  554. "methods": [
  555. {
  556. "name": "myGlobalMethod",
  557. "body": {
  558. "name": "function_declaration",
  559. "values": [
  560. {
  561. "name": "type",
  562. "props": {
  563. "0": "void"
  564. }
  565. },
  566. {
  567. "name": "declaration",
  568. "values": []
  569. },
  570. {
  571. "name": "function",
  572. "values": [
  573. {
  574. "name": "block_body",
  575. "values": [
  576. {
  577. "name": "block",
  578. "values": []
  579. }
  580. ]
  581. }
  582. ]
  583. }
  584. ]
  585. },
  586. "parameters": []
  587. }
  588. ]
  589. },
  590. "errors": []
  591. }