Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit 88dabce

Browse files
committed
Add a reporter, remove caching of source files and recording of info (in progress)
[email protected], [email protected] Review URL: https://chromereviews.googleplex.com/132767014
1 parent 3d19116 commit 88dabce

File tree

15 files changed

+351
-197
lines changed

15 files changed

+351
-197
lines changed

bin/devc.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ void main(List<String> argv) {
6161
Level level = Level.LEVELS.firstWhere((Level l) => l.name == levelName,
6262
orElse: () => Level.SEVERE);
6363
var useColors = stdioType(stdout) == StdioType.TERMINAL;
64-
if (!args['dump-info']) setupLogger(level, print, useColors: useColors);
64+
if (!args['dump-info']) setupLogger(level, print);
6565

6666
var typeResolver = new TypeResolver(shouldMockSdk ?
6767
TypeResolver.sdkResolverFromMock(mockSdkSources) :

lib/devc.dart

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,21 @@ library ddc.devc;
33

44
import 'dart:async';
55

6-
import 'package:path/path.dart' as path;
7-
import 'package:analyzer/analyzer.dart';
8-
import 'package:analyzer/src/generated/ast.dart';
96
import 'package:logging/logging.dart' show Level, Logger, LogRecord;
7+
import 'package:path/path.dart' as path;
108

119
import 'package:ddc/src/checker/checker.dart';
1210
import 'package:ddc/src/checker/resolver.dart' show TypeResolver;
1311
import 'package:ddc/src/codegen/dart_codegen.dart';
1412
import 'package:ddc/src/codegen/js_codegen.dart';
1513
import 'package:ddc/src/report.dart';
16-
import 'package:ddc/src/utils.dart';
1714

1815
/// Sets up the type checker logger to print a span that highlights error
1916
/// messages.
20-
StreamSubscription setupLogger(Level level, printFn, {bool useColors: true}) {
17+
StreamSubscription setupLogger(Level level, printFn) {
2118
Logger.root.level = level;
2219
return Logger.root.onRecord.listen((LogRecord rec) {
23-
AstNode node = rec.error;
24-
if (node == null) {
25-
printFn('${rec.level.name.toLowerCase()}: ${rec.message}');
26-
return;
27-
}
28-
29-
final span = spanForNode(node);
30-
final color = useColors ? colorOf(rec.level.name) : null;
31-
printFn('${span.message(rec.message, color: color)}');
20+
printFn('${rec.level.name.toLowerCase()}: ${rec.message}');
3221
});
3322
}
3423

@@ -37,15 +26,13 @@ Future<bool> compile(String inputFile, TypeResolver resolver,
3726
String outputDir, bool dumpInfo: false, bool useColors: true}) {
3827

3928
// Run checker
29+
var reporter = dumpInfo ? new SummaryReporter() : new LogReporter(useColors);
4030
var uri = new Uri.file(path.absolute(inputFile));
41-
var results =
42-
checkProgram(uri, resolver, checkSdk: checkSdk, useColors: useColors);
31+
var results = checkProgram(uri, resolver, reporter,
32+
checkSdk: checkSdk, useColors: useColors);
4333

44-
if (dumpInfo) {
45-
// TODO(sigmund): return right after?
46-
var summary = checkerResultsToSummary(results);
47-
print(summaryToString(summary));
48-
}
34+
// TODO(sigmund): return right after?
35+
if (dumpInfo) print(summaryToString(reporter.result));
4936

5037
if (results.failure) return new Future.value(false);
5138

lib/src/checker/checker.dart

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,20 @@ import 'package:analyzer/src/generated/resolver.dart';
77
import 'package:logging/logging.dart' as logger;
88

99
import 'package:ddc/src/info.dart';
10+
import 'package:ddc/src/report.dart' show CheckerReporter;
1011
import 'package:ddc/src/utils.dart';
1112
import 'resolver.dart';
1213
import 'rules.dart';
1314

1415
/// Runs the program checker using the restricted type rules on [fileUri].
1516
CheckerResults checkProgram(Uri fileUri, TypeResolver resolver,
16-
{bool checkSdk: false, bool useColors: true}) {
17+
CheckerReporter reporter, {bool checkSdk: false, bool useColors: true}) {
1718

1819
// Invoke the checker on the entry point.
1920
TypeProvider provider = resolver.context.typeProvider;
20-
var rules = new RestrictedRules(provider);
21-
final visitor = new ProgramChecker(resolver, rules, fileUri, checkSdk);
21+
var rules = new RestrictedRules(provider, reporter);
22+
final visitor = new ProgramChecker(
23+
resolver, rules, fileUri, checkSdk, reporter);
2224
visitor.check();
2325
return new CheckerResults(visitor.libraries, rules, visitor.failure);
2426
}
@@ -28,26 +30,32 @@ class ProgramChecker extends RecursiveAstVisitor {
2830
final TypeRules _rules;
2931
final Uri _root;
3032
final bool _checkSdk;
33+
final CheckerReporter _reporter;
3134
final List<LibraryInfo> libraries = <LibraryInfo>[];
3235

3336
LibraryInfo _current;
3437
bool failure = false;
3538

36-
ProgramChecker(this._resolver, this._rules, this._root, this._checkSdk);
39+
ProgramChecker(
40+
this._resolver, this._rules, this._root, this._checkSdk, this._reporter);
3741

3842
void check() {
3943
var startLibrary = _resolver.context
4044
.computeLibraryElement(_resolver.findSource(_root));
4145
for (var lib in reachableLibraries(startLibrary)) {
4246
if (!_checkSdk && lib.isInSdk) continue;
4347
_current = new LibraryInfo(lib);
48+
_reporter.enterLibrary(_current);
4449
libraries.add(_current);
4550
_rules.currentLibraryInfo = _current;
4651
for (var unit in lib.units) {
52+
_reporter.enterSource(unit.source);
4753
// TODO(sigmund): integrate analyzer errors with static-info (issue #6).
48-
failure = _resolver.logErrors(unit.source) || failure;
54+
failure = _resolver.logErrors(unit.source, _reporter) || failure;
4955
unit.node.visitChildren(this);
56+
_reporter.leaveSource();
5057
}
58+
_reporter.leaveLibrary();
5159
}
5260
}
5361

@@ -361,15 +369,12 @@ class ProgramChecker extends RecursiveAstVisitor {
361369
final semanticNode = _getSemanticNode(node);
362370
assert(semanticNode.dynamicInvoke == null);
363371
semanticNode.dynamicInvoke = info;
364-
semanticNode.messages.add(info);
365-
logCheckerMessage(info);
372+
_reporter.log(info);
366373
}
367374

368375
void _recordMessage(StaticInfo info) {
369376
if (info == null) return;
370-
371377
if (info.level >= logger.Level.SEVERE) failure = true;
372-
_getSemanticNode(info.node).messages.add(info);
373-
logCheckerMessage(info);
378+
_reporter.log(info);
374379
}
375380
}

lib/src/checker/resolver.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'package:analyzer/src/generated/source_io.dart';
1616
import 'package:logging/logging.dart' as logger;
1717

1818
import 'package:ddc/src/utils.dart';
19+
import 'package:ddc/src/report.dart';
1920
import 'dart_sdk.dart';
2021
import 'multi_package_resolver.dart';
2122

@@ -52,19 +53,17 @@ class TypeResolver {
5253

5354
/// Log any errors encountered when resolving [source] and return whether any
5455
/// errors were found.
55-
bool logErrors(Source source) {
56+
bool logErrors(Source source, CheckerReporter reporter) {
5657
List<AnalysisError> errors = context.getErrors(source).errors;
5758
bool failure = false;
5859
if (errors.isNotEmpty) {
5960
for (var error in errors) {
60-
var offset = error.offset;
61-
var span = spanFor(error.source, offset, offset + error.length);
6261
var severity = error.errorCode.errorSeverity;
6362
var isError = severity == ErrorSeverity.ERROR;
6463
if (isError) failure = true;
6564
var level = isError ? logger.Level.SEVERE : logger.Level.WARNING;
66-
_log.log(level, span.message('[from analyzer]: ${error.message}',
67-
color: colorOf(severity.name)));
65+
reporter.logAnalyzerError(error.message,
66+
level, error.offset, error.offset + error.length);
6867
}
6968
}
7069
return failure;

lib/src/checker/rules.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import 'package:analyzer/src/generated/resolver.dart';
66
import 'package:analyzer/src/generated/utilities_dart.dart';
77

88
import 'package:ddc/src/info.dart';
9-
import 'package:ddc/src/utils.dart' show logCheckerMessage;
9+
import 'package:ddc/src/report.dart' show CheckerReporter;
1010

1111
abstract class TypeRules {
1212
final TypeProvider provider;
@@ -56,18 +56,17 @@ class DartRules extends TypeRules {
5656
}
5757

5858
class RestrictedRules extends TypeRules {
59+
final CheckerReporter _reporter;
5960

60-
RestrictedRules(TypeProvider provider) : super(provider);
61+
RestrictedRules(TypeProvider provider, this._reporter) : super(provider);
6162

6263
DartType getStaticType(Expression expr) {
6364
var type = expr.staticType;
6465
if (type != null) return type;
6566

6667
var node = currentLibraryInfo.nodeInfo
6768
.putIfAbsent(expr, () => new SemanticNode(expr));
68-
var info = new MissingTypeError(expr);
69-
node.messages.add(info);
70-
logCheckerMessage(info);
69+
_reporter.log(new MissingTypeError(expr));
7170
return provider.dynamicType;
7271
}
7372

lib/src/info.dart

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,6 @@ class SemanticNode {
5454
/// If this operation is dynamically dispatched, this will be set.
5555
DynamicInvoke dynamicInvoke;
5656

57-
/// All error or warning messages about this node, including [dynamicInvoke].
58-
/// Except for [dynamicInvoke] all other messages here are not used when
59-
/// generating code.
60-
final messages = <StaticInfo>[];
61-
6257
SemanticNode(this.node);
6358
}
6459

0 commit comments

Comments
 (0)