| // 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. | |
| // Test that dart2js produces the expected static type warnings to ensures that | |
| // the analyzer and dart2js agrees on the tests. | |
| import 'dart:async'; | |
| import 'dart:io'; | |
| import 'package:expect/expect.dart'; | |
| import 'package:async_helper/async_helper.dart'; | |
| import 'memory_compiler.dart'; | |
| import 'package:compiler/implementation/filenames.dart'; | |
| import 'package:compiler/implementation/source_file.dart'; | |
| import 'package:compiler/implementation/source_file_provider.dart'; | |
| import 'package:compiler/implementation/util/uri_extras.dart'; | |
| import 'dart:convert'; | |
| void checkWarnings(Map<String, dynamic> tests, [List<String> arguments]) { | |
| bool isWindows = Platform.isWindows; | |
| Uri script = currentDirectory.resolveUri(Platform.script); | |
| bool warningsMismatch = false; | |
| bool verbose = arguments != null && arguments.contains('-v'); | |
| asyncTest(() => Future.forEach(tests.keys, (String test) { | |
| Uri uri = script.resolve('../../$test'); | |
| String source = UTF8.decode(readAll(uriPathToNative(uri.path))); | |
| SourceFile file = new StringSourceFile( | |
| relativize(currentDirectory, uri, isWindows), source); | |
| Map<int,String> expectedWarnings = {}; | |
| int lineNo = 0; | |
| for (String line in source.split('\n')) { | |
| if (line.contains('///') && | |
| (line.contains('static type warning') || | |
| line.contains('static warning'))) { | |
| expectedWarnings[lineNo] = line; | |
| } | |
| lineNo++; | |
| } | |
| Set<int> unseenWarnings = new Set<int>.from(expectedWarnings.keys); | |
| DiagnosticCollector collector = new DiagnosticCollector(); | |
| var compiler = compilerFor(const {}, | |
| diagnosticHandler: collector, | |
| options: ['--analyze-only'], | |
| showDiagnostics: verbose); | |
| return compiler.run(uri).then((_) { | |
| Map<String, List<int>> statusMap = tests[test]; | |
| // Line numbers with known unexpected warnings. | |
| List<int> unexpectedStatus = []; | |
| if (statusMap != null && statusMap.containsKey('unexpected')) { | |
| unexpectedStatus = statusMap['unexpected']; | |
| } | |
| // Line numbers with known missing warnings. | |
| List<int> missingStatus = []; | |
| if (statusMap != null && statusMap.containsKey('missing')) { | |
| missingStatus = statusMap['missing']; | |
| } | |
| for (DiagnosticMessage message in collector.warnings) { | |
| Expect.equals(uri, message.uri); | |
| int lineNo = file.getLine(message.begin); | |
| if (expectedWarnings.containsKey(lineNo)) { | |
| unseenWarnings.remove(lineNo); | |
| } else if (!unexpectedStatus.contains(lineNo+1)) { | |
| warningsMismatch = true; | |
| print(file.getLocationMessage( | |
| 'Unexpected warning: ${message.message}', | |
| message.begin, message.end, true, (x) => x)); | |
| } | |
| } | |
| if (!unseenWarnings.isEmpty) { | |
| for (int lineNo in unseenWarnings) { | |
| if (!missingStatus.contains(lineNo+1)) { | |
| warningsMismatch = true; | |
| String line = expectedWarnings[lineNo]; | |
| print('$uri [${lineNo+1}]: Missing static type warning.'); | |
| print(line); | |
| } | |
| } | |
| } | |
| }); | |
| }).then((_) { | |
| Expect.isFalse(warningsMismatch); | |
| })); | |
| } |