blob: c4050639fc2635bdc471758db6131d3b257efea5 [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.
library dart_style.src.whitespace;
/// Constants for the number of spaces for various kinds of indentation.
class Indent {
/// The number of spaces in a block or collection body.
static const block = 2;
/// How much wrapped cascade sections indent.
static const cascade = 2;
/// The number of spaces in a single level of expression nesting.
static const expression = 4;
/// The ":" on a wrapped constructor initialization list.
static const constructorInitializer = 4;
}
/// The kind of pending whitespace that has been "written", but not actually
/// physically output yet.
///
/// We defer actually writing whitespace until a non-whitespace token is
/// encountered to avoid trailing whitespace.
class Whitespace {
/// No whitespace.
static const none = const Whitespace._("none");
/// A single non-breaking space.
static const space = const Whitespace._("space");
/// A single newline.
static const newline = const Whitespace._("newline");
/// A single newline that takes into account the current expression nesting
/// for the next line.
static const nestedNewline = const Whitespace._("nestedNewline");
/// A single newline with all indentation eliminated at the beginning of the
/// next line.
///
/// Used for subsequent lines in a multiline string.
static const newlineFlushLeft = const Whitespace._("newlineFlushLeft");
/// Two newlines, a single blank line of separation.
static const twoNewlines = const Whitespace._("twoNewlines");
/// A split or newline should be output based on whether the current token is
/// on the same line as the previous one or not.
///
/// In general, we like to avoid using this because it makes the formatter
/// less prescriptive over the user's whitespace.
static const splitOrNewline = const Whitespace._("splitOrNewline");
/// A split or blank line (two newlines) should be output based on whether
/// the current token is on the same line as the previous one or not.
///
/// This is used between enum cases, which will collapse if possible but
/// also allow a blank line to be preserved between cases.
///
/// In general, we like to avoid using this because it makes the formatter
/// less prescriptive over the user's whitespace.
static const splitOrTwoNewlines = const Whitespace._("splitOrTwoNewlines");
/// One or two newlines should be output based on how many newlines are
/// present between the next token and the previous one.
///
/// In general, we like to avoid using this because it makes the formatter
/// less prescriptive over the user's whitespace.
static const oneOrTwoNewlines = const Whitespace._("oneOrTwoNewlines");
final String name;
/// Gets the minimum number of newlines contained in this whitespace.
int get minimumLines {
switch (this) {
case Whitespace.newline:
case Whitespace.nestedNewline:
case Whitespace.newlineFlushLeft:
case Whitespace.oneOrTwoNewlines:
return 1;
case Whitespace.twoNewlines:
return 2;
default:
return 0;
}
}
const Whitespace._(this.name);
String toString() => name;
}