Support disabling automatic line breaks
Support disabling automatic line breaks With --keep_line_breaks.
This commit is contained in:
parent
399041c84f
commit
5f0d2843e6
|
@ -55,6 +55,7 @@ found there.
|
|||
* `--split_operator_at_line_end`: *see dfmt_split_operator_at_line_end [below](#dfmt-specific-properties)*
|
||||
* `--tab_width`: *see tab_width [below](#standard-editorconfig-properties)*
|
||||
* `--template_constraint_style`: *see dfmt_template_constraint_style [below](#dfmt-specific-properties)*
|
||||
* `--keep_line_breaks`: *see dfmt_keep_line_breaks [below](#dfmt-specific-properties)*
|
||||
|
||||
### Example
|
||||
```
|
||||
|
@ -114,6 +115,7 @@ dfmt_compact_labeled_statements | **`true`**, `false` | Place labels on the same
|
|||
dfmt_template_constraint_style | **`conditional_newline_indent`** `conditional_newline` `always_newline` `always_newline_indent` | Control the formatting of template constraints.
|
||||
dfmt_single_template_constraint_indent | `true`, **`false`** | Set if the constraints are indented by a single tab instead of two. Has only an effect if the style set to `always_newline_indent` or `conditional_newline_indent`.
|
||||
dfmt_space_before_aa_colon | `true`, **`false`** | Adds a space after an associative array key before the `:` like in older dfmt versions.
|
||||
dfmt_keep_line_breaks | `true`, **`false`** | Keep existing line breaks if these don't violate other formatting rules.
|
||||
|
||||
## Terminology
|
||||
* Braces - `{` and `}`
|
||||
|
|
|
@ -57,6 +57,8 @@ struct Config
|
|||
OptionalBoolean dfmt_single_template_constraint_indent;
|
||||
///
|
||||
OptionalBoolean dfmt_space_before_aa_colon;
|
||||
///
|
||||
OptionalBoolean dfmt_keep_line_breaks;
|
||||
|
||||
mixin StandardEditorConfigFields;
|
||||
|
||||
|
@ -85,6 +87,7 @@ struct Config
|
|||
dfmt_template_constraint_style = TemplateConstraintStyle.conditional_newline_indent;
|
||||
dfmt_single_template_constraint_indent = OptionalBoolean.f;
|
||||
dfmt_space_before_aa_colon = OptionalBoolean.f;
|
||||
dfmt_keep_line_breaks = OptionalBoolean.f;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -567,6 +567,8 @@ private:
|
|||
}
|
||||
do
|
||||
{
|
||||
import dfmt.editorconfig : OptionalBoolean;
|
||||
|
||||
immutable p = current.type;
|
||||
regenLineBreakHintsIfNecessary(index);
|
||||
writeToken();
|
||||
|
@ -588,7 +590,23 @@ private:
|
|||
return;
|
||||
immutable bool arrayInitializerStart = p == tok!"["
|
||||
&& astInformation.arrayStartLocations.canFindIndex(tokens[index - 1].index);
|
||||
if (arrayInitializerStart && isMultilineAt(index - 1))
|
||||
|
||||
if (p == tok!"[" && config.dfmt_keep_line_breaks == OptionalBoolean.t)
|
||||
{
|
||||
IndentStack.Details detail;
|
||||
|
||||
detail.wrap = false;
|
||||
detail.temp = false;
|
||||
detail.breakEveryItem = false;
|
||||
detail.mini = tokens[index].line == tokens[index - 1].line;
|
||||
|
||||
indents.push(tok!"]", detail);
|
||||
if (!detail.mini)
|
||||
{
|
||||
newline();
|
||||
}
|
||||
}
|
||||
else if (arrayInitializerStart && isMultilineAt(index - 1))
|
||||
{
|
||||
// Use the close bracket as the indent token to distinguish
|
||||
// the array initialiazer from an array index in the newline
|
||||
|
@ -643,6 +661,10 @@ private:
|
|||
{
|
||||
newline();
|
||||
}
|
||||
else if (onNextLine)
|
||||
{
|
||||
newline();
|
||||
}
|
||||
}
|
||||
|
||||
void formatRightParen()
|
||||
|
@ -659,6 +681,10 @@ private:
|
|||
if (indents.topIs(tok!"("))
|
||||
indents.pop();
|
||||
|
||||
if (onNextLine)
|
||||
{
|
||||
newline();
|
||||
}
|
||||
if (parenDepth == 0 && (peekIs(tok!"is") || peekIs(tok!"in")
|
||||
|| peekIs(tok!"out") || peekIs(tok!"do") || peekIsBody))
|
||||
{
|
||||
|
@ -711,6 +737,7 @@ private:
|
|||
writeParens(false);
|
||||
if (tokens[index].type == tok!"{")
|
||||
return;
|
||||
|
||||
if (index < tokens.length && tokens[index - 1].line < tokens[index].line
|
||||
&& astInformation.atAttributeStartLocations.canFindIndex(atIndex))
|
||||
newline();
|
||||
|
@ -722,7 +749,16 @@ private:
|
|||
|| currentIs(tok!"extern")
|
||||
|| currentIs(tok!"identifier"))
|
||||
&& !currentIsIndentedTemplateConstraint())
|
||||
write(" ");
|
||||
{
|
||||
if (onNextLine)
|
||||
{
|
||||
newline();
|
||||
}
|
||||
else
|
||||
{
|
||||
write(" ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void formatColon()
|
||||
|
@ -1228,17 +1264,37 @@ private:
|
|||
break;
|
||||
default:
|
||||
if (peekBackIs(tok!"identifier"))
|
||||
write(" ");
|
||||
{
|
||||
if (onNextLine)
|
||||
{
|
||||
newline();
|
||||
}
|
||||
else
|
||||
{
|
||||
write(" ");
|
||||
}
|
||||
}
|
||||
if (index + 1 < tokens.length)
|
||||
{
|
||||
if (!peekIs(tok!"@") && (peekIsOperator()
|
||||
|| peekIs(tok!"out") || peekIs(tok!"in")))
|
||||
{
|
||||
writeToken();
|
||||
}
|
||||
else
|
||||
{
|
||||
writeToken();
|
||||
if (!currentIsIndentedTemplateConstraint())
|
||||
write(" ");
|
||||
{
|
||||
if (onNextLine)
|
||||
{
|
||||
newline();
|
||||
}
|
||||
else
|
||||
{
|
||||
write(" ");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -1258,6 +1314,7 @@ private:
|
|||
|
||||
void formatOperator()
|
||||
{
|
||||
import dfmt.editorconfig : OptionalBoolean;
|
||||
import std.algorithm : canFind;
|
||||
|
||||
switch (current.type)
|
||||
|
@ -1341,8 +1398,8 @@ private:
|
|||
case tok!".":
|
||||
regenLineBreakHintsIfNecessary(index);
|
||||
immutable bool ufcsWrap = astInformation.ufcsHintLocations.canFindIndex(current.index);
|
||||
if (ufcsWrap || linebreakHints.canFind(index) || (linebreakHints.length == 0
|
||||
&& currentLineLength + nextTokenLength() > config.max_line_length))
|
||||
if (ufcsWrap || linebreakHints.canFind(index) || onNextLine
|
||||
|| (linebreakHints.length == 0 && currentLineLength + nextTokenLength() > config.max_line_length))
|
||||
{
|
||||
pushWrapIndent();
|
||||
newline();
|
||||
|
@ -1398,7 +1455,38 @@ private:
|
|||
case tok!"%":
|
||||
binary:
|
||||
immutable bool isWrapToken = linebreakHints.canFind(index);
|
||||
if (config.dfmt_split_operator_at_line_end)
|
||||
if (config.dfmt_keep_line_breaks == OptionalBoolean.t && index > 0)
|
||||
{
|
||||
const operatorLine = tokens[index].line;
|
||||
const rightOperandLine = tokens[index + 1].line;
|
||||
|
||||
if (tokens[index - 1].line < operatorLine)
|
||||
{
|
||||
if (!indents.topIs(tok!"enum"))
|
||||
pushWrapIndent();
|
||||
newline();
|
||||
}
|
||||
else
|
||||
{
|
||||
write(" ");
|
||||
}
|
||||
if (rightOperandLine > operatorLine
|
||||
&& !indents.topIs(tok!"enum"))
|
||||
{
|
||||
pushWrapIndent();
|
||||
}
|
||||
writeToken();
|
||||
|
||||
if (rightOperandLine > operatorLine)
|
||||
{
|
||||
newline();
|
||||
}
|
||||
else
|
||||
{
|
||||
write(" ");
|
||||
}
|
||||
}
|
||||
else if (config.dfmt_split_operator_at_line_end)
|
||||
{
|
||||
if (isWrapToken)
|
||||
{
|
||||
|
@ -1442,9 +1530,11 @@ private:
|
|||
|
||||
void formatComma()
|
||||
{
|
||||
import dfmt.editorconfig : OptionalBoolean;
|
||||
import std.algorithm : canFind;
|
||||
|
||||
regenLineBreakHintsIfNecessary(index);
|
||||
if (config.dfmt_keep_line_breaks == OptionalBoolean.f)
|
||||
regenLineBreakHintsIfNecessary(index);
|
||||
if (indents.indentToMostRecent(tok!"enum") != -1
|
||||
&& !peekIs(tok!"}") && indents.topIs(tok!"{") && parenDepth == 0)
|
||||
{
|
||||
|
@ -1474,6 +1564,24 @@ private:
|
|||
writeToken();
|
||||
newline();
|
||||
}
|
||||
else if (config.dfmt_keep_line_breaks == OptionalBoolean.t)
|
||||
{
|
||||
const commaLine = tokens[index].line;
|
||||
|
||||
writeToken();
|
||||
if (!currentIs(tok!")") && !currentIs(tok!"]")
|
||||
&& !currentIs(tok!"}") && !currentIs(tok!"comment"))
|
||||
{
|
||||
if (tokens[index].line == commaLine)
|
||||
{
|
||||
write(" ");
|
||||
}
|
||||
else
|
||||
{
|
||||
newline();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
writeToken();
|
||||
|
@ -2023,6 +2131,15 @@ const pure @safe @nogc:
|
|||
return index < tokens.length && tokens[index].type == tokenType;
|
||||
}
|
||||
|
||||
bool onNextLine() @nogc nothrow pure @safe
|
||||
{
|
||||
import dfmt.editorconfig : OptionalBoolean;
|
||||
|
||||
return config.dfmt_keep_line_breaks == OptionalBoolean.t
|
||||
&& index > 0
|
||||
&& tokens[index - 1].line < tokens[index].line;
|
||||
}
|
||||
|
||||
/// Bugs: not unicode correct
|
||||
size_t tokenEndLine(const Token t)
|
||||
{
|
||||
|
|
|
@ -92,6 +92,9 @@ else
|
|||
case "space_before_aa_colon":
|
||||
optConfig.dfmt_space_before_aa_colon = optVal;
|
||||
break;
|
||||
case "keep_line_breaks":
|
||||
optConfig.dfmt_keep_line_breaks = optVal;
|
||||
break;
|
||||
default:
|
||||
assert(false, "Invalid command-line switch");
|
||||
}
|
||||
|
@ -121,7 +124,8 @@ else
|
|||
"single_template_constraint_indent", &handleBooleans,
|
||||
"space_before_aa_colon", &handleBooleans,
|
||||
"tab_width", &optConfig.tab_width,
|
||||
"template_constraint_style", &optConfig.dfmt_template_constraint_style);
|
||||
"template_constraint_style", &optConfig.dfmt_template_constraint_style,
|
||||
"keep_line_breaks", &handleBooleans);
|
||||
// dfmt on
|
||||
}
|
||||
catch (GetOptException e)
|
||||
|
@ -308,6 +312,7 @@ Formatting Options:
|
|||
--indent_size
|
||||
--indent_style, -t `,
|
||||
optionsToString!(typeof(Config.indent_style)), `
|
||||
--keep_line_breaks
|
||||
--soft_max_line_length
|
||||
--max_line_length
|
||||
--outdent_attributes
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
@safe nothrow
|
||||
@Read
|
||||
@NonNull
|
||||
public
|
||||
int[] func(int argument_1_1, int argument_1_2,
|
||||
int argument_2_1, int argument_2_2,
|
||||
int argument_3_1, int argument_3_2)
|
||||
{
|
||||
if (true && true
|
||||
&& true && true
|
||||
&& true && true)
|
||||
{
|
||||
}
|
||||
else if (true && true &&
|
||||
true && true &&
|
||||
true && true)
|
||||
{
|
||||
}
|
||||
|
||||
func(argument_1_1).func(argument_1_2)
|
||||
.func(argument_2_1)
|
||||
.func(argument_2_2);
|
||||
|
||||
return [
|
||||
3, 5,
|
||||
5, 7,
|
||||
11, 13,
|
||||
];
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
--keep_line_breaks true
|
|
@ -0,0 +1,29 @@
|
|||
@safe nothrow
|
||||
@Read
|
||||
@NonNull
|
||||
public
|
||||
int[] func(int argument_1_1, int argument_1_2,
|
||||
int argument_2_1, int argument_2_2,
|
||||
int argument_3_1, int argument_3_2)
|
||||
{
|
||||
if (true && true
|
||||
&& true && true
|
||||
&& true && true)
|
||||
{
|
||||
}
|
||||
else if (true && true &&
|
||||
true && true &&
|
||||
true && true)
|
||||
{
|
||||
}
|
||||
|
||||
func(argument_1_1).func(argument_1_2)
|
||||
.func(argument_2_1)
|
||||
.func(argument_2_2);
|
||||
|
||||
return [
|
||||
3, 5,
|
||||
5, 7,
|
||||
11, 13,
|
||||
];
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
@safe nothrow
|
||||
@Read
|
||||
@NonNull
|
||||
public
|
||||
int[] func(int argument_1_1, int argument_1_2,
|
||||
int argument_2_1, int argument_2_2,
|
||||
int argument_3_1, int argument_3_2) {
|
||||
if (true && true
|
||||
&& true && true
|
||||
&& true && true) {
|
||||
} else if (true && true &&
|
||||
true && true &&
|
||||
true && true) {
|
||||
}
|
||||
|
||||
func(argument_1_1).func(argument_1_2)
|
||||
.func(argument_2_1)
|
||||
.func(argument_2_2);
|
||||
|
||||
return [
|
||||
3, 5,
|
||||
5, 7,
|
||||
11, 13,
|
||||
];
|
||||
}
|
Loading…
Reference in New Issue