Files
sdk/pkg/analysis_server/test/utils/lsp_protocol_extensions.dart
T
Danny Tuppeny 49e7d4ac83 [analysis_server] Support "Fix" CodeActions via commands if client doesn't support CodeActionLiterals
This updates fixes to return either CodeActionLiterals or Commands based on the capabilities of the client (similar to was done previously for assists).

Change-Id: I688cb80aef415d329d65092edba247e5ec7a5a13
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/428783
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
2025-05-15 10:54:48 -07:00

67 lines
1.7 KiB
Dart

import 'package:analysis_server/lsp_protocol/protocol.dart';
extension CodeActionExtensions on CodeAction {
/// A helper to assert (and return) that a this [CodeAction] is a
/// [CodeActionLiteral] and not just a bare [Command].
CodeActionLiteral get asCodeActionLiteral {
return map(
(literal) => literal,
(command) =>
throw 'Expected CodeActionLiteral, but got Command (${command.title})',
);
}
/// A helper to assert (and return) that a this [CodeAction] is just a
/// bare [Command] and not a [CodeActionLiteral].
Command get asCommand {
return map(
(literal) =>
throw 'Expected Command, but got CodeAction literal (${literal.title})',
(command) => command,
);
}
/// Whether this [CodeAction] is a [CodeActionLiteral].
bool get isCodeActionLiteral {
return map(
(_) => true, // literal
(_) => false, // command
);
}
/// Whether this [CodeAction] is a [Command].
bool get isCommand {
return map(
(_) => false, // literal
(_) => true, // command
);
}
}
extension RangeExtension on Range {
/// Checks whether the range covers [position] (inclusive).
bool containsPosition(Position position) {
// On an earlier line.
if (position.line < start.line) {
return false;
}
// On start line, but before start character.
if (position.line == start.line && position.character < start.character) {
return false;
}
// On end line, but after end character.
if (position.line == end.line && position.character > end.character) {
return false;
}
// On a later line.
if (position.line > end.line) {
return false;
}
return true;
}
}