Index: pkg/analyzer_experimental/lib/src/services/runtime/coverage/models.dart |
diff --git a/pkg/analyzer_experimental/lib/src/services/runtime/coverage/models.dart b/pkg/analyzer_experimental/lib/src/services/runtime/coverage/models.dart |
deleted file mode 100644 |
index 463a0cdb0b5b7e239117808736c84dcbb9813b33..0000000000000000000000000000000000000000 |
--- a/pkg/analyzer_experimental/lib/src/services/runtime/coverage/models.dart |
+++ /dev/null |
@@ -1,168 +0,0 @@ |
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-/// A library with code coverage models. |
-library runtime.coverage.model; |
- |
-import 'dart:collection' show SplayTreeMap; |
- |
-import 'package:analyzer_experimental/src/generated/source.dart' show Source, SourceRange; |
-import 'package:analyzer_experimental/src/generated/ast.dart' show ASTNode; |
- |
-import 'utils.dart'; |
- |
- |
-/// Contains information about the application. |
-class AppInfo { |
- final nodeStack = new List<NodeInfo>(); |
- final units = new List<UnitInfo>(); |
- final pathToFile = new Map<String, UnitInfo>(); |
- NodeInfo currentNode; |
- int nextId = 0; |
- |
- void enterUnit(String path, String content) { |
- var unit = new UnitInfo(this, path, content); |
- units.add(unit); |
- currentNode = unit; |
- } |
- |
- void enter(String kind, String name) { |
- nodeStack.add(currentNode); |
- currentNode = new NodeInfo(this, currentNode, kind, name); |
- } |
- |
- void leave() { |
- currentNode = nodeStack.removeLast(); |
- } |
- |
- int addNode(ASTNode node) { |
- return currentNode.addNode(node); |
- } |
- |
- void write(StringSink sink, Set<int> executedIds) { |
- sink.writeln('{'); |
- units.fold(null, (prev, unit) { |
- if (prev != null) sink.writeln(','); |
- return unit..write(sink, executedIds, ' '); |
- }); |
- sink.writeln(); |
- sink.writeln('}'); |
- } |
-} |
- |
-/// Information about some node - unit, class, method, function. |
-class NodeInfo { |
- final AppInfo appInfo; |
- final NodeInfo parent; |
- final String kind; |
- final String name; |
- final idToRange = new SplayTreeMap<int, SourceRange>(); |
- final children = <NodeInfo>[]; |
- |
- NodeInfo(this.appInfo, this.parent, this.kind, this.name) { |
- if (parent != null) { |
- parent.children.add(this); |
- } |
- } |
- |
- int addNode(ASTNode node) { |
- var id = appInfo.nextId++; |
- var range = new SourceRange(node.offset, node.length); |
- idToRange[id] = range; |
- return id; |
- } |
- |
- void write(StringSink sink, Set<int> executedIds, String prefix) { |
- sink.writeln('$prefix"$name": {'); |
- // Kind. |
- sink.writeln('$prefix "kind": "$kind",'); |
- // Print children. |
- if (children.isNotEmpty) { |
- sink.writeln('$prefix "children": {'); |
- children.fold(null, (prev, child) { |
- if (prev != null) sink.writeln(','); |
- return child..write(sink, executedIds, '$prefix '); |
- }); |
- sink.writeln(); |
- sink.writeln('$prefix }'); |
- } |
- // Print source and line ranges. |
- if (children.isEmpty) { |
- sink.write('${prefix} "ranges": ['); |
- var rangePrinter = new RangePrinter(unit, sink, executedIds); |
- idToRange.forEach(rangePrinter.handle); |
- rangePrinter.printRange(); |
- sink.writeln(']'); |
- } |
- // Close this node. |
- sink.write('$prefix}'); |
- } |
- |
- UnitInfo get unit => parent.unit; |
-} |
- |
-/// Helper for printing merged source/line intervals. |
-class RangePrinter { |
- final UnitInfo unit; |
- final StringSink sink; |
- final Set<int> executedIds; |
- |
- bool first = true; |
- int startId = -1; |
- int startOffset = -1; |
- int endId = -1; |
- int endOffset = -1; |
- |
- RangePrinter(this.unit, this.sink, this.executedIds); |
- |
- handle(int id, SourceRange range) { |
- if (executedIds.contains(id)) { |
- printRange(); |
- } else { |
- if (endId == id - 1) { |
- endId = id; |
- endOffset = range.end; |
- } else { |
- startId = id; |
- endId = id; |
- startOffset = range.offset; |
- endOffset = range.end; |
- } |
- } |
- } |
- |
- void printRange() { |
- if (endId == -1) return; |
- printSeparator(); |
- var startLine = unit.getLine(startOffset); |
- var endLine = unit.getLine(endOffset); |
- sink.write('$startOffset,$endOffset,$startLine,$endLine'); |
- startId = startOffset = startLine = -1; |
- endId = endOffset = endLine = -1; |
- } |
- |
- void printSeparator() { |
- if (first) { |
- first = false; |
- } else { |
- sink.write(', '); |
- } |
- } |
-} |
- |
-/// Contains information about the single unit of the application. |
-class UnitInfo extends NodeInfo { |
- List<int> lineOffsets; |
- |
- UnitInfo(AppInfo appInfo, String path, String content) |
- : super(appInfo, null, 'unit', path) { |
- lineOffsets = getLineOffsets(content); |
- } |
- |
- UnitInfo get unit => this; |
- |
- int getLine(int offset) { |
- return binarySearch(lineOffsets, (x) => x >= offset); |
- } |
-} |