OLD | NEW |
| (Empty) |
1 #!/usr/bin/env dart | |
2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
3 // for details. All rights reserved. Use of this source code is governed by a | |
4 // BSD-style license that can be found in the LICENSE file. | |
5 | |
6 /** The entry point for the analyzer. */ | |
7 library analyzer; | |
8 | |
9 import 'dart:async'; | |
10 import 'dart:convert'; | |
11 import 'dart:io'; | |
12 | |
13 import 'package:analyzer/options.dart'; | |
14 import 'package:analyzer/src/analyzer_impl.dart'; | |
15 import 'package:analyzer/src/generated/engine.dart'; | |
16 import 'package:analyzer/src/generated/error.dart'; | |
17 import 'package:analyzer/src/generated/interner.dart'; | |
18 import 'package:analyzer/src/generated/java_core.dart' show JavaSystem; | |
19 import 'package:analyzer/src/generated/java_engine.dart'; | |
20 import 'package:analyzer/src/generated/utilities_general.dart'; | |
21 | |
22 void main(List<String> args) { | |
23 StringUtilities.INTERNER = new MappedInterner(); | |
24 CommandLineOptions options = CommandLineOptions.parse(args); | |
25 if (options.shouldBatch) { | |
26 BatchRunner.runAsBatch(args, (List<String> args) { | |
27 CommandLineOptions options = CommandLineOptions.parse(args); | |
28 return _analyzeAll(options, true); | |
29 }); | |
30 } else { | |
31 _analyzeAll(options, false); | |
32 } | |
33 } | |
34 | |
35 _analyzeAll(CommandLineOptions options, bool isBatch) { | |
36 if (!options.machineFormat) { | |
37 stdout.writeln("Analyzing ${options.sourceFiles}..."); | |
38 } | |
39 ErrorSeverity allResult = ErrorSeverity.NONE; | |
40 for (String sourcePath in options.sourceFiles) { | |
41 sourcePath = sourcePath.trim(); | |
42 // check that file exists | |
43 if (!new File(sourcePath).existsSync()) { | |
44 print('File not found: $sourcePath'); | |
45 exitCode = ErrorSeverity.ERROR.ordinal; | |
46 // fail fast; don't analyze more files | |
47 return ErrorSeverity.ERROR; | |
48 } | |
49 // check that file is Dart file | |
50 if (!AnalysisEngine.isDartFileName(sourcePath)) { | |
51 print('$sourcePath is not a Dart file'); | |
52 exitCode = ErrorSeverity.ERROR.ordinal; | |
53 // fail fast; don't analyze more files | |
54 return ErrorSeverity.ERROR; | |
55 } | |
56 ErrorSeverity status = _runAnalyzer(options, sourcePath, isBatch); | |
57 allResult = allResult.max(status); | |
58 } | |
59 return allResult; | |
60 } | |
61 | |
62 _runAnalyzer(CommandLineOptions options, String sourcePath, bool isBatch) { | |
63 if (options.warmPerf) { | |
64 int startTime = JavaSystem.currentTimeMillis(); | |
65 AnalyzerImpl analyzer = | |
66 new AnalyzerImpl(sourcePath, options, startTime, isBatch); | |
67 analyzer.analyzeSync(printMode: 2); | |
68 | |
69 for (int i = 0; i < 8; i++) { | |
70 startTime = JavaSystem.currentTimeMillis(); | |
71 analyzer = new AnalyzerImpl(sourcePath, options, startTime, isBatch); | |
72 analyzer.analyzeSync(printMode: 0); | |
73 } | |
74 | |
75 PerformanceTag.reset(); | |
76 startTime = JavaSystem.currentTimeMillis(); | |
77 analyzer = new AnalyzerImpl(sourcePath, options, startTime, isBatch); | |
78 return analyzer.analyzeSync(); | |
79 } | |
80 int startTime = JavaSystem.currentTimeMillis(); | |
81 AnalyzerImpl analyzer = | |
82 new AnalyzerImpl(sourcePath, options, startTime, isBatch); | |
83 var errorSeverity = analyzer.analyzeSync(); | |
84 if (errorSeverity == ErrorSeverity.ERROR) { | |
85 exitCode = errorSeverity.ordinal; | |
86 } | |
87 if (options.warningsAreFatal && errorSeverity == ErrorSeverity.WARNING) { | |
88 exitCode = errorSeverity.ordinal; | |
89 } | |
90 return errorSeverity; | |
91 } | |
92 | |
93 typedef ErrorSeverity BatchRunnerHandler(List<String> args); | |
94 | |
95 /// Provides a framework to read command line options from stdin and feed them t
o a callback. | |
96 class BatchRunner { | |
97 /** | |
98 * Run the tool in 'batch' mode, receiving command lines through stdin and ret
urning pass/fail | |
99 * status through stdout. This feature is intended for use in unit testing. | |
100 */ | |
101 static void runAsBatch(List<String> sharedArgs, BatchRunnerHandler handler) { | |
102 stdout.writeln('>>> BATCH START'); | |
103 Stopwatch stopwatch = new Stopwatch(); | |
104 stopwatch.start(); | |
105 int testsFailed = 0; | |
106 int totalTests = 0; | |
107 ErrorSeverity batchResult = ErrorSeverity.NONE; | |
108 // read line from stdin | |
109 Stream cmdLine = | |
110 stdin.transform(UTF8.decoder).transform(new LineSplitter()); | |
111 cmdLine.listen((String line) { | |
112 // may be finish | |
113 if (line.isEmpty) { | |
114 var time = stopwatch.elapsedMilliseconds; | |
115 stdout.writeln( | |
116 '>>> BATCH END (${totalTests - testsFailed}/$totalTests) ${time}ms')
; | |
117 exitCode = batchResult.ordinal; | |
118 } | |
119 // prepare aruments | |
120 var args; | |
121 { | |
122 var lineArgs = line.split(new RegExp('\\s+')); | |
123 args = new List<String>(); | |
124 args.addAll(sharedArgs); | |
125 args.addAll(lineArgs); | |
126 args.remove('-b'); | |
127 args.remove('--batch'); | |
128 } | |
129 // analyze single set of arguments | |
130 try { | |
131 totalTests++; | |
132 ErrorSeverity result = handler(args); | |
133 bool resultPass = result != ErrorSeverity.ERROR; | |
134 if (!resultPass) { | |
135 testsFailed++; | |
136 } | |
137 batchResult = batchResult.max(result); | |
138 // Write stderr end token and flush. | |
139 stderr.writeln('>>> EOF STDERR'); | |
140 String resultPassString = resultPass ? 'PASS' : 'FAIL'; | |
141 stdout.writeln( | |
142 '>>> TEST $resultPassString ${stopwatch.elapsedMilliseconds}ms'); | |
143 } catch (e, stackTrace) { | |
144 stderr.writeln(e); | |
145 stderr.writeln(stackTrace); | |
146 stderr.writeln('>>> EOF STDERR'); | |
147 stdout.writeln('>>> TEST CRASH'); | |
148 } | |
149 }); | |
150 } | |
151 } | |
OLD | NEW |