比如有个需求:

通过分析注解,来生成一段dart代码。

dart上如果要自动生成代码,那么就需要用到代码生成器,code generator,这和Android里面apt类似。一般我们会引用source_gen声明一些generator,然后放在build.yaml里面,调用build_runner来生成代码。

如果不想使用框架,而是自己手写这个过程呢?

1.从dart文件读入代码

2.分析代码,读出里面的annotation对应的value值。

3.根据value值,自己再生成代码字符串content

4.把代码字符串写到一个dart文件中

如果是简单的第二个过程,可以想到一种,通过正则匹配来读出对应的annotation里面的值。然后用来生成代码字符串content。如果类很复杂,那么自己来手动分析就会比较繁琐。

dart中有一个工具analyzer,来分析代码。它会把一段代码内容导入进来,进行分析,然后生成一个ast抽象语法树。

我们现在利用它写一个demo读取出dart里面的注解内容。

我们先定义好一些注解类:

class SFLegoClass{final String host;final String source;const SFLegoClass(this.host,this.source);
}class SFLegoField{final String fieldAlias;const SFLegoField(this.fieldAlias);
}class SFLegoMethod{final String method;const SFLegoMethod(this.method);
}@SFLegoClass("www.baidu.com", "dart")
class ExampleClass{@SFLegoField("mason")String name;@SFLegoMethod("method1")void myMethod(){}

我们的目标是,读出注解类上的值。

import 'dart:io';import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/analysis/utilities.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';main(List<String> args) {read(File("annotation_example.dart"));
}read(File file){// print(file.readAsStringSync());String content = file.readAsStringSync();// RegExp regExp = RegExp("");ParseStringResult result  = parseString(content: content);CompilationUnit unit = result.unit;unit.visitChildren(MyVisitor());
}class MyVisitor extends RecursiveAstVisitor{@overridevisitAnnotation(Annotation node) {print("annotation node:"+node.toString()+",${node.name},${node.arguments}");return super.visitAnnotation(node);}
}

我们来分析一下上面的代码。

1.读出上面的类中的文件到一个字符串中

2.通过analyzer的静态方法parseString()来分析代码

3.取出其中的代码解析产物CompilationUnit

4.对其进行遍历

AstVistor里面定义了很多的方法,我们在遍历的过程中,就可以分别读到不通的内容。

abstract class AstVisitor<R> {R visitAdjacentStrings(AdjacentStrings node);R visitAnnotation(Annotation node);R visitArgumentList(ArgumentList node);R visitAsExpression(AsExpression node);R visitAssertInitializer(AssertInitializer node);R visitAssertStatement(AssertStatement assertStatement);...
}

analyzer定义了一些基本的vistor实现类。

这里主要说一下RecursiveAstVisitor。

看名字就知道它会递归遍历整棵抽象语法树。我们可以用它来查找我们要的变量。运行一下上面的代码,得到如下结果。

我们就可以取出annotation里面的值了。本文仅借此例子来了解dart analyzer的用法。

此外,dart sdk还自带了dartAnalyzer工具,帮我们做静态代码分析。

比如在某个dart类中加入错误的一段代码。"A {"

它就能帮我们分析出其中错误的地方。

通过analyzer分析dart代码相关推荐

  1. swift/dart代码规范检查工具介绍

    swift/dart代码规范检查工具介绍 简介: 本篇主要介绍swift和dart代码规范检查工具,以及他们的工作原理,操作过程,代码规范规则. 1 swift代码检查工具-swiftlint 1.1 ...

  2. Android性能优化——使用 APK Analyzer 分析你的 APK

    Android Studio 2.2包含了APK Analyzer,通过它我们能够直观地看到APK的组成.使用APK Analyzer不仅能够减少你花在debug上的时间,而且还能减少你的APK大小. ...

  3. 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    实验目的: 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 实验过程: 通过vi程序进行编程: int g(int x) { return x + 3; } int f(int x) ...

  4. delphi 实现屏幕旋转代码_X86指令混淆之函数分析和代码块粉碎

    本文为看雪论坛优秀文章看雪论坛作者ID:三猫原理二进制分析的时候经常遇到经过混淆的函数,所以一直想自己学习实现一个简单的指令乱序demo,也不需要太复杂(其实就是自己菜而已).能阻止IDA F5党(就 ...

  5. python画直方图代码-Python绘制直方图及子图的方法分析(代码示例)

    本篇文章给大家带来的内容是关于Python绘制直方图及子图的方法分析(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.直方图的绘制也需要用到matplotlib下的py ...

  6. 【Flutter】Flutter 混合开发 ( Dart 代码调试 | Flutter 单独调试 | 混合模式下 Flutter 调试 )

    文章目录 前言 一.单独运行 Flutter 代码时调试 Dart 代码 二.混合模式下 Flutter 调试 Dart 代码 三.相关资源 前言 Flutter 混合开发集成步骤 : ① 在 And ...

  7. html中放大镜案列,Canvas实现放大镜效果完整案例分析(附代码)

    本文主要记录 canvas 在图像.文字处理.离屏技术和放大镜特效的实现过程中使用到的api.先看下效果吧: 一张模糊的图片: 鼠标点击任意位置,产生放大效果: 哇塞~ 一个帅哥,哈哈哈哈~ 1.放大 ...

  8. ML/DL之预测分析类:利用机器学习算法进行预测分析的简介、分析、代码实现之详细攻略

    ML/DL之预测分析类:利用机器学习算法进行预测分析的简介.分析.代码实现之详细攻略 目录 机器学习算法进行预测的简介 机器学习算法进行预测的分析 机器学习算法进行预测的代码实现 机器学习算法进行预测 ...

  9. DL之Keras:基于Keras框架建立模型实现【预测】功能的简介、设计思路、案例分析、代码实现之详细攻略(经典,建议收藏)

    DL之Keras:基于Keras框架建立模型实现[预测]功能的简介.设计思路.案例分析.代码实现之详细攻略(经典,建议收藏) 目录 Keras框架使用分析 Keras框架设计思路 案例分析 代码实现 ...

最新文章

  1. Maven向本地仓库导入官方仓库没有的jar包
  2. sql server 海量数据速度提升:SQL优化-索引(11) 【转】
  3. 【相机标定】四个坐标系之间的变换关系
  4. Auto-Machine-Learning初探
  5. burpsuite https 社区版_微软推出Visual Studio 2019 RC版 正式版预计四月到来
  6. Python之创建单元素tuple
  7. java classifier_Java ZeroR.buildClassifier方法代码示例
  8. spring boot实战(第四篇)分散配置
  9. 使用Freemarker来页面静态化,与Spring整合使用
  10. Struts1之Action小结
  11. 文献记录(part75)--基于最大平均熵率的大数据关联聚类算法
  12. 工作260:js判断一个数组是否包含一个指定的值
  13. Nginx的应用之动静分离
  14. (转载)解决eclipse安装maven的问题:Unable to update index for central|http://repo1.maven.org/maven2...
  15. 声音均衡器怎么调好听_调音师必备:如何调出最佳人声?
  16. 记账软件哪个好用,亲测有效
  17. csol永恒python属性_狗神弑神参上!CSOL缔造者新添Lua功能脚本
  18. 鸡汤来了,成为数据分析师的快速指南
  19. PNETLAB模拟器汉化使用
  20. 使用Pytorch实现NLP深度学习

热门文章

  1. 三维空间刚体运动1:旋转矩阵与变换矩阵(详解加代码示例)
  2. 超级账本成员身份管理
  3. 2022年湖南成考潇湘成招健康打卡时间已调整
  4. 我的oracle 健康检查报告
  5. 学了python可以做什么兼职,学python真的能做兼职吗?
  6. 128篇论文,21大领域,深度学习最值得看的资源全在这里
  7. 利用C语言实现文件的读写操作
  8. 印刷机软件测试,印刷生产流程标准化测试方案——测试方法
  9. 阿里云ACP/ACE线上考试报名
  10. 质量基础设施“一站式”服务平台建设,NQI系统开发方案