blob: 1d0c9fa2fbccea781a3f1b97a6ca4679dbeb008d [file] [log] [blame]
// 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 'command_line_reporting.dart' show shouldThrowOn;
import 'crash.dart' show safeToString;
import 'messages.dart'
show
LocatedMessage,
isVerbose,
noLength,
templateInternalProblemDebugAbort,
templateUnspecified;
import 'severity.dart' show Severity, severityTexts;
import 'crash.dart' show Crash, reportCrash, resetCrashReporting;
/// 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 deprecated_inputError(Uri uri, int charOffset, Object error) {
return deprecated_inputErrorFromMessage(templateUnspecified
.withArguments(safeToString(error))
.withLocation(uri, charOffset, noLength));
}
dynamic deprecated_inputErrorFromMessage(LocatedMessage message) {
if (shouldThrowOn(Severity.error) && isVerbose) {
print(StackTrace.current);
}
throw new deprecated_InputError(message);
}
class deprecated_InputError {
final LocatedMessage message;
deprecated_InputError(this.message);
toString() => "deprecated_InputError: ${message.message}";
}
class DebugAbort extends deprecated_InputError {
DebugAbort(Uri uri, int charOffset, Severity severity, StackTrace trace)
: super(templateInternalProblemDebugAbort
.withArguments(severityTexts[severity], "$trace")
.withLocation(uri, charOffset, noLength));
}
// TODO(ahe): Move this method to crash.dart when it's no longer using
// [deprecated_InputError].
Future<T> withCrashReporting<T>(
Future<T> Function() action, Uri Function() currentUri,
{T Function(LocatedMessage) onInputError}) async {
resetCrashReporting();
try {
return await action();
} on Crash {
rethrow;
} on DebugAbort {
rethrow;
} on deprecated_InputError catch (e, s) {
if (onInputError != null) {
return onInputError(e.message);
} else {
return reportCrash(e, s, currentUri());
}
} catch (e, s) {
return reportCrash(e, s, currentUri());
}
}