AST
一些聪明的程序员提供了一个优秀的示例:https://github.com/mythz/dart-samples/blob/master/frog/leg/scanner/keyword.dart
RecursiveASTVisitor接口:https://www.dartdocs.org/documentation/analyzer_experimental/0.8.0/analyzer/RecursiveASTVisitor-class.html
现在,示例代码已移至下面的wiki.
DART分析服务器或DART服务
IDE或编辑器检测错误所依赖的包.
GIT:https://github.com/dart-lang/dart-services
安装:
运行服务器:
- cd dart服务
- Dart./bin/services.dart--端口8082
客户端代码:
import "dart:convert";
import "dart:io";
const String url = "localhost";
const String path = r"api/dartservices/v1/analyze";
String src = """
main(){
print('hi');
}
""";
void main() {
analyse();
}
analyse() async {
Map m = {'source': src};
var client = new HttpClient();
String data = JSON.encode(m);
HttpClientRequest request = await client.post (
url, 8082, path);
request.headers.contentType = ContentType.JSON;
request.write(data);
HttpClientResponse r = await request.close();
r.transform(UTF8.decoder).listen((d){
print(d);
});
client.close(force: false);
}
该服务器为/lib/src/common_server中的CommonServer类提供服务.dart作为api."api/dartservices/v1/analyze"的帖子调用类中的以下方法.
@ApiMethod(
method: 'POST',
path: 'analyze',
description:
'Analyze the given Dart source code and return any resulting '
'analysis errors or warnings.')
Future<AnalysisResults> analyze(SourceRequest request) {
return _analyze(request.source);
}
将Analyzer用作本地对象.
import 'src/analyzer.dart';
import 'src/api_classes.dart';
import 'dart:developer';
String src = """
main(){
a.print('hi');
}
""";
main() async {
String sdkPath = r'C:\tools\dart-sdk';
var a = new Analyzer(sdkPath);
var m = {'main.dart':src};
debugger();
AnalysisResults r = await a.analyzeMulti(m);
print(r.issues);
print(r.resolvedImports);
}
Analyzer相当复杂,并且笼罩在微任务中,调试器帮不了什么忙.