blob: 3b73eb251a82d10e0a68af1910de5bd304b8d483 [file] [log] [blame]
// Copyright (c) 2025, 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/session_logger/entry_keys.dart' as key;
import 'package:analysis_server/src/session_logger/entry_kind.dart';
import 'package:analysis_server/src/session_logger/process_id.dart';
/// A representation of an entry in a [Log].
///
/// Every entry has a [time] and a [kind]. Other properties are dependent on the
/// [kind]. See [EntryKind] for a description of the properties associated with
/// each [kind].
extension type LogEntry(JsonMap map) {
/// Returns the command-line arguments used to start the server.
List<String> get argList =>
(map[key.argList] as List<dynamic>).cast<String>();
/// Whether this entry is a command line entry.
bool get isCommandLine => kind == EntryKind.commandLine;
/// Whether this entry is a message entry.
bool get isMessage => kind == EntryKind.message;
/// Returns the kind of this log entry.
EntryKind get kind => EntryKind.forName(map[key.kind] as String);
/// Returns the message for this log entry.
Message get message => Message(map[key.message] as JsonMap);
/// Returns the receiver of the message.
ProcessId get receiver => ProcessId.forName(map[key.receiver] as String);
/// Returns the sender of the message.
ProcessId get sender => ProcessId.forName(map[key.sender] as String);
}
/// A representation of a message sent from one process to another.
extension type Message(JsonMap map) {
/// The ID of the message. All messages have IDs.
int get id => map['id'] as int;
/// Whether this message is a request for the server to exit.
bool get isExit => method == 'exit';
/// Whether this message is a request for the server to initialize itself.
bool get isInitialize => method == 'initialize';
/// Whether this message is a notification to the server indicating that the
/// client is initialized.
bool get isInitialized => method == 'initialized';
/// Whether this message is a request from the server to log a message.
bool get isLogMessage => method == 'window/logMessage';
/// Whether this message is a request for the server to connect with DTD.
bool get isRequestToConnectWithDtd => method == 'dart/connectToDtd';
/// Whether this is a response to a request.
bool get isResponse => method == null;
/// Whether this message is a request from the server to show a document to
/// the user.
bool get isShowDocument => method == 'window/showDocument';
/// Whether this message is a request from the server to show a message to the
/// user.
bool get isShowMessage => method == 'window/showMessage';
/// Whether this message is a request from the server to show a message to the
/// user.
bool get isShowMessageRequest => method == 'window/showMessageRequest';
/// Whether this message is a request for the server to shut down.
bool get isShutdown => method == 'shutdown';
/// The method being sent in this message, or `null` if this message isn't an
/// LSP request
String? get method => map['method'] as String?;
/// Only present if [method] is non-null, and still optional in that case.
JsonMap? get params => map['params'] as Map<String, Object?>?;
/// If [method] is null, this should be non-null.
///
/// Could be any valid type for a result, which is dependent on the [method].
Object? get result => map['result'];
}