diff --git a/src/dfmt/formatter.d b/src/dfmt/formatter.d index e22a9b1..b24def6 100644 --- a/src/dfmt/formatter.d +++ b/src/dfmt/formatter.d @@ -47,14 +47,18 @@ immutable(short[]) generateDepthInfo(const Token[] tokens) pure nothrow @trusted { switch (t.type) { - case tok!"{": - case tok!"(": case tok!"[": + depth++; + goto case; + case tok!"{": + case tok!"(": depth++; break; + case tok!"]": + depth--; + goto case; case tok!"}": case tok!")": - case tok!"]": depth--; break; default: @@ -968,6 +972,7 @@ private: formatRightBrace(); break; case tok!".": + regenLineBreakHintsIfNecessary(index); if (linebreakHints.canFind(index) || (linebreakHints.length == 0 && currentLineLength + nextTokenLength() > config.max_line_length)) { diff --git a/src/dfmt/tokens.d b/src/dfmt/tokens.d index 1c96773..c5d09e7 100644 --- a/src/dfmt/tokens.d +++ b/src/dfmt/tokens.d @@ -103,9 +103,9 @@ bool isBreakToken(IdType t) pure nothrow @safe @nogc } } -int breakCost(IdType t) pure nothrow @safe @nogc +int breakCost(IdType p, IdType c) pure nothrow @safe @nogc { - switch (t) + switch (c) { case tok!"||": case tok!"&&": @@ -160,7 +160,7 @@ int breakCost(IdType t) pure nothrow @safe @nogc case tok!"+=": return 200; case tok!".": - return 900; + return p == tok!")" ? 0 : 900; default: return 1000; } @@ -170,7 +170,7 @@ pure nothrow @safe @nogc unittest { foreach (ubyte u; 0 .. ubyte.max) if (isBreakToken(u)) - assert(breakCost(u) != 1000); + assert(breakCost(tok!".", u) != 1000); } diff --git a/src/dfmt/wrapping.d b/src/dfmt/wrapping.d index 586c584..a42c5da 100644 --- a/src/dfmt/wrapping.d +++ b/src/dfmt/wrapping.d @@ -40,13 +40,14 @@ struct State } else { - for (size_t i = 0; i != uint.sizeof * 8; ++i) + foreach (size_t i; 0 .. (uint.sizeof * 8)) { if (((1 << i) & breaks) == 0) continue; - immutable b = tokens[i].type; + immutable prevType = i > 0 ? tokens[i - 1].type : tok!""; + immutable currentType = tokens[i].type; immutable p = abs(depths[i]); - immutable bc = breakCost(b) * (p == 0 ? 1 : p * 2); + immutable bc = breakCost(prevType, currentType) * (p == 0 ? 1 : p * 2); this._cost += bc; } diff --git a/tests/allman/breakOnDots.d.ref b/tests/allman/breakOnDots.d.ref new file mode 100644 index 0000000..41b611f --- /dev/null +++ b/tests/allman/breakOnDots.d.ref @@ -0,0 +1,14 @@ +unittest +{ + { + { + foreach (abcde, def; abcdef.map!(battlecruiser => battlecruiser[123 .. 1231231]) + .filter!(bravo => charlie[10] > 90000).sum()) + { + + } + abcdeabcdeabcde(12341234).abcdeabcdeabcde(12341234) + .abcdeabcdeabcde(12341234).abcdeabcdeabcde(12341234).abcdeabcdeabcde(12341234); + } + } +} diff --git a/tests/breakOnDots.d b/tests/breakOnDots.d new file mode 100644 index 0000000..b9d4cef --- /dev/null +++ b/tests/breakOnDots.d @@ -0,0 +1,12 @@ +unittest +{ + { + { + foreach (abcde, def; abcdef.map!(battlecruiser => battlecruiser[123 .. 1231231]).filter!(bravo => charlie[10] > 90000).sum()) + { + + } + abcdeabcdeabcde(12341234).abcdeabcdeabcde(12341234).abcdeabcdeabcde(12341234).abcdeabcdeabcde(12341234).abcdeabcdeabcde(12341234); + } + } +} diff --git a/tests/otbs/breakOnDots.d.ref b/tests/otbs/breakOnDots.d.ref new file mode 100644 index 0000000..ad1fa0e --- /dev/null +++ b/tests/otbs/breakOnDots.d.ref @@ -0,0 +1,12 @@ +unittest { + { + { + foreach (abcde, def; abcdef.map!(battlecruiser => battlecruiser[123 .. 1231231]) + .filter!(bravo => charlie[10] > 90000).sum()) { + + } + abcdeabcdeabcde(12341234).abcdeabcdeabcde(12341234) + .abcdeabcdeabcde(12341234).abcdeabcdeabcde(12341234).abcdeabcdeabcde(12341234); + } + } +}