blob: ecc9442abfc1d26bf1fbcc49e4d103764907cc5a [file] [log] [blame]
// Copyright (c) 2019, 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.
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analyzer/exception/exception.dart';
import 'package:analyzer/instrumentation/instrumentation.dart';
/// An instrumentation service to show instrumentation errors as error
/// notifications to the user.
class ErrorNotifier extends NoopInstrumentationService {
AnalysisServer? server;
bool sendSilentExceptionsToClient = false;
@override
void logException(
Object exception, [
StackTrace? stackTrace,
List<InstrumentationServiceAttachment>? attachments,
]) {
var server = this.server;
if (server == null) {
return;
}
// Silent exceptions should not be reported to the user unless this
// flag is set (this is used by 'dart analyze').
if (exception is SilentException && !sendSilentExceptionsToClient) {
return;
}
var message = 'Internal error';
if (exception is CaughtException) {
var message = exception.message;
if (message != null) {
// TODO(mfairhurst): Use the outermost exception once crash reporting is
// fixed and this becomes purely user-facing.
exception = exception.rootCaughtException;
// TODO(mfairhurst): Use the outermost message rather than the innermost
// exception as its own message.
message = message;
}
}
server.sendServerErrorNotification(
message,
exception,
stackTrace,
fatal: exception is FatalException,
);
}
}
/// Server may throw a [FatalException] to send a fatal error response to the
/// IDEs.
class FatalException extends CaughtException {
FatalException(String super.message, super.exception, super.stackTrace)
: super.withMessage();
}