blob: 54049df2e663c92aee214231b098dbc53cc294fd [file] [log] [blame]
// Copyright (c) 2014, 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.
/// Describes a chunk of source code that is to be formatted or has been
/// formatted.
class SourceCode {
/// The [uri] where the source code is from.
///
/// Used in error messages if the code cannot be parsed.
final String? uri;
/// The Dart source code text.
final String text;
/// Whether the source is a compilation unit or a bare statement.
final bool isCompilationUnit;
/// The offset in [text] where the selection begins, or `null` if there is
/// no selection.
final int? selectionStart;
/// The number of selected characters or `null` if there is no selection.
final int? selectionLength;
/// Gets the source code before the beginning of the selection.
///
/// If there is no selection, returns [text].
String get textBeforeSelection {
if (selectionStart == null) return text;
return text.substring(0, selectionStart);
}
/// Gets the selected source code, if any.
///
/// If there is no selection, returns an empty string.
String get selectedText {
if (selectionStart == null) return '';
return text.substring(selectionStart!, selectionStart! + selectionLength!);
}
/// Gets the source code following the selection.
///
/// If there is no selection, returns an empty string.
String get textAfterSelection {
if (selectionStart == null) return '';
return text.substring(selectionStart! + selectionLength!);
}
SourceCode(this.text,
{this.uri,
this.isCompilationUnit = true,
this.selectionStart,
this.selectionLength}) {
// Must either provide both selection bounds or neither.
if ((selectionStart == null) != (selectionLength == null)) {
throw ArgumentError(
'If selectionStart is provided, selectionLength must be too.');
}
if (selectionStart != null) {
if (selectionStart! < 0) {
throw ArgumentError('selectionStart must be non-negative.');
}
if (selectionStart! > text.length) {
throw ArgumentError('selectionStart must be within text.');
}
}
if (selectionLength != null) {
if (selectionLength! < 0) {
throw ArgumentError('selectionLength must be non-negative.');
}
if (selectionStart! + selectionLength! > text.length) {
throw ArgumentError('selectionLength must end within text.');
}
}
}
}