| Index: pkg/front_end/lib/src/fasta/errors.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/errors.dart b/pkg/front_end/lib/src/fasta/errors.dart
|
| deleted file mode 100644
|
| index 98493c4db5d06d7e8356d6e7c71f9b973cbe13a5..0000000000000000000000000000000000000000
|
| --- a/pkg/front_end/lib/src/fasta/errors.dart
|
| +++ /dev/null
|
| @@ -1,183 +0,0 @@
|
| -// Copyright (c) 2016, 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 fasta.errors;
|
| -
|
| -import 'dart:async' show Future;
|
| -
|
| -import 'dart:convert' show JSON;
|
| -
|
| -import 'dart:io'
|
| - show ContentType, HttpClient, HttpClientRequest, SocketException, stderr;
|
| -
|
| -import 'colors.dart' show red;
|
| -
|
| -import 'messages.dart' show errorsAreFatal, format, isVerbose;
|
| -
|
| -const String defaultServerAddress = "http://127.0.0.1:59410/";
|
| -
|
| -/// Tracks if there has been a crash reported through [reportCrash]. Should be
|
| -/// reset between each compilation by calling [resetCrashReporting].
|
| -bool hasCrashed = false;
|
| -
|
| -/// Tracks the first source URI that has been read and is used as a fall-back
|
| -/// for [reportCrash]. Should be reset between each compilation by calling
|
| -/// [resetCrashReporting].
|
| -Uri firstSourceUri;
|
| -
|
| -/// Used to report an internal error.
|
| -///
|
| -/// Internal errors should be avoided as best as possible, but are preferred
|
| -/// over assertion failures. Favor error messages that starts with "Internal
|
| -/// error: " and a short description that may help a developer debug the issue.
|
| -/// This method should be called instead of using `throw`, as this allows us to
|
| -/// ensure that there are no throws anywhere in the codebase.
|
| -dynamic internalError(Object error, [Uri uri, int charOffset = -1]) {
|
| - if (uri == null && charOffset == -1) {
|
| - throw error;
|
| - } else {
|
| - throw format(uri, charOffset, "Internal error: ${safeToString(error)}");
|
| - }
|
| -}
|
| -
|
| -/// Used to report an error in input.
|
| -///
|
| -/// Avoid using this for reporting compile-time errors, instead use
|
| -/// `LibraryBuilder.addCompileTimeError` for those.
|
| -///
|
| -/// An input error is any error that isn't an internal error. We use the term
|
| -/// "input error" in favor of "user error". This way, if an input error isn't
|
| -/// handled correctly, the user will never see a stack trace that says "user
|
| -/// error".
|
| -dynamic inputError(Uri uri, int charOffset, Object error) {
|
| - if (errorsAreFatal && isVerbose) {
|
| - print(StackTrace.current);
|
| - }
|
| - throw new InputError(uri, charOffset, error);
|
| -}
|
| -
|
| -String printUnexpected(Uri uri, int charOffset, String message) {
|
| - String formattedMessage = formatUnexpected(uri, charOffset, message);
|
| - if (errorsAreFatal) {
|
| - print(formattedMessage);
|
| - if (isVerbose) print(StackTrace.current);
|
| - throw new InputError(uri, charOffset, message);
|
| - }
|
| - print(formattedMessage);
|
| - return formattedMessage;
|
| -}
|
| -
|
| -String formatUnexpected(Uri uri, int charOffset, String message) {
|
| - return format(uri, charOffset, colorError("Error: $message"));
|
| -}
|
| -
|
| -String colorError(String message) {
|
| - // TODO(ahe): Colors need to be optional. Doesn't work well in Emacs or on
|
| - // Windows.
|
| - return red(message);
|
| -}
|
| -
|
| -class InputError {
|
| - final Uri uri;
|
| -
|
| - final int charOffset;
|
| -
|
| - final Object error;
|
| -
|
| - InputError(this.uri, int charOffset, this.error)
|
| - : this.charOffset = charOffset ?? -1;
|
| -
|
| - toString() => "InputError: $error";
|
| -
|
| - String format() => formatUnexpected(uri, charOffset, safeToString(error));
|
| -}
|
| -
|
| -class Crash {
|
| - final Uri uri;
|
| -
|
| - final int charOffset;
|
| -
|
| - final Object error;
|
| -
|
| - final StackTrace trace;
|
| -
|
| - Crash(this.uri, this.charOffset, this.error, this.trace);
|
| -
|
| - String toString() {
|
| - return """
|
| -Crash when compiling $uri,
|
| -at character offset $charOffset:
|
| -$error${trace == null ? '' : '\n$trace'}
|
| -""";
|
| - }
|
| -}
|
| -
|
| -void resetCrashReporting() {
|
| - firstSourceUri = null;
|
| - hasCrashed = false;
|
| -}
|
| -
|
| -Future reportCrash(error, StackTrace trace, [Uri uri, int charOffset]) async {
|
| - note(String note) async {
|
| - stderr.write(note);
|
| - await stderr.flush();
|
| - }
|
| -
|
| - if (hasCrashed) return new Future.error(error, trace);
|
| - if (error is Crash) {
|
| - trace = error.trace ?? trace;
|
| - uri = error.uri ?? uri;
|
| - charOffset = error.charOffset ?? charOffset;
|
| - error = error.error;
|
| - }
|
| - uri ??= firstSourceUri;
|
| - hasCrashed = true;
|
| - Map<String, dynamic> data = <String, dynamic>{};
|
| - data["type"] = "crash";
|
| - data["client"] = "package:fasta";
|
| - if (uri != null) data["uri"] = "$uri";
|
| - if (charOffset != null) data["offset"] = charOffset;
|
| - data["error"] = safeToString(error);
|
| - data["trace"] = "$trace";
|
| - String json = JSON.encode(data);
|
| - HttpClient client = new HttpClient();
|
| - try {
|
| - Uri uri = Uri.parse(defaultServerAddress);
|
| - HttpClientRequest request;
|
| - try {
|
| - request = await client.postUrl(uri);
|
| - } on SocketException {
|
| - // Assume the crash logger isn't running.
|
| - await client.close(force: true);
|
| - return new Future.error(error, trace);
|
| - }
|
| - if (request != null) {
|
| - await note("\nSending crash report data");
|
| - request.persistentConnection = false;
|
| - request.bufferOutput = false;
|
| - String host = request?.connectionInfo?.remoteAddress?.host;
|
| - int port = request?.connectionInfo?.remotePort;
|
| - await note(" to $host:$port");
|
| - await request
|
| - ..headers.contentType = ContentType.JSON
|
| - ..write(json);
|
| - await request.close();
|
| - await note(".");
|
| - }
|
| - } catch (e, s) {
|
| - await note("\n${safeToString(e)}\n$s\n");
|
| - await note("\n\n\nFE::ERROR::$json\n\n\n");
|
| - }
|
| - await client.close(force: true);
|
| - await note("\n");
|
| - return new Future.error(error, trace);
|
| -}
|
| -
|
| -String safeToString(Object object) {
|
| - try {
|
| - return "$object";
|
| - } catch (e) {
|
| - return "Error when converting ${object.runtimeType} to string.";
|
| - }
|
| -}
|
|
|