| Index: sdk/lib/_internal/compiler/implementation/source_file_provider.dart
|
| diff --git a/sdk/lib/_internal/compiler/implementation/source_file_provider.dart b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0f7257bbc436141c0ef776cb500d4c514a6be4a0
|
| --- /dev/null
|
| +++ b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
|
| @@ -0,0 +1,121 @@
|
| +// Copyright (c) 2012, 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.
|
| +
|
| +library source_file_provider;
|
| +
|
| +import 'dart:async';
|
| +import 'dart:uri';
|
| +import 'dart:io';
|
| +import 'dart:utf';
|
| +
|
| +import '../compiler.dart' as api show Diagnostic;
|
| +import 'dart2js.dart' show AbortLeg;
|
| +import 'colors.dart' as colors;
|
| +import 'source_file.dart';
|
| +import 'filenames.dart';
|
| +import 'util/uri_extras.dart';
|
| +
|
| +String readAll(String filename) {
|
| + var file = (new File(filename)).openSync(FileMode.READ);
|
| + var length = file.lengthSync();
|
| + var buffer = new List<int>.fixedLength(length);
|
| + var bytes = file.readListSync(buffer, 0, length);
|
| + file.closeSync();
|
| + return new String.fromCharCodes(new Utf8Decoder(buffer).decodeRest());
|
| +}
|
| +
|
| +class SourceFileProvider {
|
| + bool isWindows = (Platform.operatingSystem == 'windows');
|
| + Uri cwd = getCurrentDirectory();
|
| + Map<String, SourceFile> sourceFiles = <String, SourceFile>{};
|
| + int dartBytesRead = 0;
|
| +
|
| + Future<String> readStringFromUri(Uri resourceUri) {
|
| + if (resourceUri.scheme != 'file') {
|
| + throw new ArgumentError(resourceUri);
|
| + }
|
| + String source;
|
| + try {
|
| + source = readAll(uriPathToNative(resourceUri.path));
|
| + } on FileIOException catch (ex) {
|
| + throw 'Error: Cannot read "${relativize(cwd, resourceUri, isWindows)}" '
|
| + '(${ex.osError}).';
|
| + }
|
| + dartBytesRead += source.length;
|
| + sourceFiles[resourceUri.toString()] =
|
| + new SourceFile(relativize(cwd, resourceUri, isWindows), source);
|
| + return new Future.immediate(source);
|
| + }
|
| +}
|
| +
|
| +class FormattingDiagnosticHandler {
|
| + final SourceFileProvider provider;
|
| + bool showWarnings = true;
|
| + bool verbose = false;
|
| + bool isAborting = false;
|
| + bool enableColors = false;
|
| + bool throwOnError = false;
|
| +
|
| + final int FATAL = api.Diagnostic.CRASH.ordinal | api.Diagnostic.ERROR.ordinal;
|
| + final int INFO =
|
| + api.Diagnostic.INFO.ordinal | api.Diagnostic.VERBOSE_INFO.ordinal;
|
| +
|
| + FormattingDiagnosticHandler(SourceFileProvider this.provider);
|
| +
|
| + void info(var message, [api.Diagnostic kind = api.Diagnostic.VERBOSE_INFO]) {
|
| + if (!verbose && identical(kind, api.Diagnostic.VERBOSE_INFO)) return;
|
| + if (enableColors) {
|
| + print('${colors.green("info:")} $message');
|
| + } else {
|
| + print('info: $message');
|
| + }
|
| + }
|
| +
|
| + void diagnosticHandler(Uri uri, int begin, int end, String message,
|
| + api.Diagnostic kind) {
|
| + // TODO(ahe): Remove this when source map is handled differently.
|
| + if (identical(kind.name, 'source map')) return;
|
| +
|
| + if (isAborting) return;
|
| + isAborting = identical(kind, api.Diagnostic.CRASH);
|
| + bool fatal = (kind.ordinal & FATAL) != 0;
|
| + bool isInfo = (kind.ordinal & INFO) != 0;
|
| + if (isInfo && uri == null && !identical(kind, api.Diagnostic.INFO)) {
|
| + info(message, kind);
|
| + return;
|
| + }
|
| + var color;
|
| + if (!enableColors) {
|
| + color = (x) => x;
|
| + } else if (identical(kind, api.Diagnostic.ERROR)) {
|
| + color = colors.red;
|
| + } else if (identical(kind, api.Diagnostic.WARNING)) {
|
| + color = colors.magenta;
|
| + } else if (identical(kind, api.Diagnostic.LINT)) {
|
| + color = colors.magenta;
|
| + } else if (identical(kind, api.Diagnostic.CRASH)) {
|
| + color = colors.red;
|
| + } else if (identical(kind, api.Diagnostic.INFO)) {
|
| + color = colors.green;
|
| + } else {
|
| + throw 'Unknown kind: $kind (${kind.ordinal})';
|
| + }
|
| + if (uri == null) {
|
| + assert(fatal);
|
| + print(color(message));
|
| + } else if (fatal || showWarnings) {
|
| + SourceFile file = provider.sourceFiles[uri.toString()];
|
| + if (file == null) {
|
| + throw '$uri: file is null';
|
| + }
|
| + print(file.getLocationMessage(color(message), begin, end, true, color));
|
| + }
|
| + if (fatal && throwOnError) {
|
| + isAborting = true;
|
| + throw new AbortLeg(message);
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
|
|