diff --git a/CHANGELOG.md b/CHANGELOG.md index cd3f5b0a..1845e8b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## dev branch / next version (1.x.x) +- Fixed conditional line ends / wrapping ([#654](https://github.com/HaxeCheckstyle/haxe-formatter/issues/654)) +- Fixed whitespace after from/to with arrow functions ([#654](https://github.com/HaxeCheckstyle/haxe-formatter/issues/654)) + ## version 1.13.0 (2022-03-18) - Added default type parameter support, fixes [#650](https://github.com/HaxeCheckstyle/haxe-formatter/issues/650) ([#651](https://github.com/HaxeCheckstyle/haxe-formatter/issues/651)) diff --git a/src/formatter/marker/MarkLineEnds.hx b/src/formatter/marker/MarkLineEnds.hx index 88053559..dd9a9e29 100644 --- a/src/formatter/marker/MarkLineEnds.hx +++ b/src/formatter/marker/MarkLineEnds.hx @@ -565,10 +565,26 @@ class MarkLineEnds extends MarkerBase { } switch (sharpEnd.tok) { case Sharp(SHARP_END): - if (parsedCode.linesBetweenOriginal(token, sharpEnd) > 5) { + var count:Int = parsedCode.linesBetweenOriginal(token, sharpEnd); + var next:Null = getNextToken(sharpEnd); + if (next != null) { + switch (next.token.tok) { + case Comma, Semicolon: + if (count > 5) { + return false; + } + return true; + default: + } + } + + if (count == 0) { + return true; + } + if (count > 3) { return false; } - case Comma, Semicolon: + case Comma | Semicolon: sharpEnd = sharpEnd.previousSibling; if (sharpEnd == null) { return false; @@ -593,12 +609,10 @@ class MarkLineEnds extends MarkerBase { return false; } switch (prev.token.tok) { - case Semicolon: - return false; - case BrClose: - return false; - case Comment(_), CommentLine(_): + case Semicolon | BrClose | Comment(_) | CommentLine(_) | BkOpen | Comma: return false; + case Binop(_): + return true; case PClose: if (parsedCode.isOriginalSameLine(prev.token, token)) { return true; diff --git a/src/formatter/marker/MarkWhitespace.hx b/src/formatter/marker/MarkWhitespace.hx index 279fdcb4..546f958f 100644 --- a/src/formatter/marker/MarkWhitespace.hx +++ b/src/formatter/marker/MarkWhitespace.hx @@ -231,6 +231,15 @@ class MarkWhitespace extends MarkerBase { policy = policy.add(Before); default: } + case Const(CIdent("from")) | Const(CIdent("to")): + var parent:Null = prev.token.parent; + if (parent != null) { + switch (parent.tok) { + case Const(_): + policy = policy.add(Before); + default: + } + } default: } } @@ -470,7 +479,7 @@ class MarkWhitespace extends MarkerBase { var prev:Null = getPreviousToken(token); if (prev != null) { switch (prev.token.tok) { - case Const(_), Kwd(_): + case Const(_) | Kwd(_) | Binop(_): whitespace(token, Before); default: } @@ -505,7 +514,7 @@ class MarkWhitespace extends MarkerBase { } } case Sharp("error"): - whitespace(token, After); + whitespace(token, Around); default: } } diff --git a/src/formatter/marker/wrapping/MarkWrappingBase.hx b/src/formatter/marker/wrapping/MarkWrappingBase.hx index 95fc2cb8..90b42d2f 100644 --- a/src/formatter/marker/wrapping/MarkWrappingBase.hx +++ b/src/formatter/marker/wrapping/MarkWrappingBase.hx @@ -134,11 +134,6 @@ class MarkWrappingBase extends MarkerBase { for (item in items) { additionalIndent(item.first, addIndent); lineEndBefore(item.first); - switch (item.last.tok) { - case Sharp(_): - lineEndBefore(item.last); - default: - } } } if (keepFirst) { diff --git a/test/testcases/lineends/conditional_array.hxtest b/test/testcases/lineends/conditional_array.hxtest new file mode 100644 index 00000000..13a1fdff --- /dev/null +++ b/test/testcases/lineends/conditional_array.hxtest @@ -0,0 +1,115 @@ +{ + "lineEnds": { + "metadataFunction": "none" + } +} + +--- + +class Main{ + function main() { + var test = [ + new Node ("test", result.test, Leaf, node), + #if true + new Node ("test", result.test, Leaf, node), + #end + new Node ("test", result.test, Leaf, node), + ]; + var test = [ + #if true + new Node ("test", result.test, Leaf, node), + #end + new Node ("test", result.test, Leaf, node), + new Node ("test", result.test, Leaf, node), + ]; + var test = [ + new Node ("test", result.test, Leaf, node), + new Node ("test", result.test, Leaf, node), + #if true + new Node ("test", result.test, Leaf, node), + #end + ]; + var test = [ + new Node ("test", result.test, Leaf, node), + new Node ("test", result.test, Leaf, node), + #if true + new Node ("test", result.test, Leaf, node) + #end + ]; + var test = [ + #if true new Node ("test", result.test, Leaf, node), #end + new Node ("test", result.test, Leaf, node), + new Node ("test", result.test, Leaf, node), + ]; + var test = [ + new Node ("test", result.test, Leaf, node), + #if true new Node ("test", result.test, Leaf, node), #end + new Node ("test", result.test, Leaf, node), + ]; + var test = [ + new Node ("test", result.test, Leaf, node), + new Node ("test", result.test, Leaf, node), + #if true new Node ("test", result.test, Leaf, node), #end + ]; + var test = [ + new Node ("test", result.test, Leaf, node), + new Node ("test", result.test, Leaf, node), + #if true new Node ("test", result.test, Leaf, node) #end + ]; + } +} + +--- + +class Main { + function main() { + var test = [ + new Node("test", result.test, Leaf, node), + #if true + new Node("test", result.test, Leaf, node), + #end + new Node("test", result.test, Leaf, node), + ]; + var test = [ + #if true + new Node("test", result.test, Leaf, node), + #end + new Node("test", result.test, Leaf, node), + new Node("test", result.test, Leaf, node), + ]; + var test = [ + new Node("test", result.test, Leaf, node), + new Node("test", result.test, Leaf, node), + #if true + new Node("test", result.test, Leaf, node), + #end + ]; + var test = [ + new Node("test", result.test, Leaf, node), + new Node("test", result.test, Leaf, node), + #if true + new Node("test", result.test, Leaf, node) + #end + ]; + var test = [ + #if true new Node("test", result.test, Leaf, node), #end + new Node("test", result.test, Leaf, node), + new Node("test", result.test, Leaf, node), + ]; + var test = [ + new Node("test", result.test, Leaf, node), + #if true new Node("test", result.test, Leaf, node), #end + new Node("test", result.test, Leaf, node), + ]; + var test = [ + new Node("test", result.test, Leaf, node), + new Node("test", result.test, Leaf, node), + #if true new Node("test", result.test, Leaf, node), #end + ]; + var test = [ + new Node("test", result.test, Leaf, node), + new Node("test", result.test, Leaf, node), + #if true new Node("test", result.test, Leaf, node) #end + ]; + } +} diff --git a/test/testcases/lineends/issue_17_lineend_aftersharp_error.hxtest b/test/testcases/lineends/issue_17_lineend_aftersharp_error.hxtest index 46e754e3..f820a0f0 100644 --- a/test/testcases/lineends/issue_17_lineend_aftersharp_error.hxtest +++ b/test/testcases/lineends/issue_17_lineend_aftersharp_error.hxtest @@ -4,8 +4,19 @@ #if js #error "js is defined" #elseif php #else #end +#if js trace("js is defined"); #elseif php #else #end + +#if js +#error "js is defined" +#elseif php +#else +#end + + --- +#if js #error "js is defined" #elseif php #else #end +#if js trace("js is defined"); #elseif php #else #end #if js #error "js is defined" #elseif php diff --git a/test/testcases/other/issue_29_execption_conditionals_before_type.hxtest b/test/testcases/other/issue_29_execption_conditionals_before_type.hxtest index 86aba89a..d74c265b 100644 --- a/test/testcases/other/issue_29_execption_conditionals_before_type.hxtest +++ b/test/testcases/other/issue_29_execption_conditionals_before_type.hxtest @@ -8,7 +8,5 @@ class Foo {} --- -#if foo -@:keep -#end +#if foo @:keep #end class Foo {} diff --git a/test/testcases/sameline/inline_conditional.hxtest b/test/testcases/sameline/inline_conditional.hxtest index 8fb3f5db..099f3308 100644 --- a/test/testcases/sameline/inline_conditional.hxtest +++ b/test/testcases/sameline/inline_conditional.hxtest @@ -38,7 +38,12 @@ class Main { class Main { static function main() { var debugDraw = #if debug System..... #else false #end; - var debugDraw = #if (debug) System.url.queryString.exists("debugDraw"); #else false; #end + var debugDraw = + #if (debug) + System.url.queryString.exists("debugDraw"); + #else + false; + #end #if (debug) var debugDraw = System.url.queryString.exists("debugDraw"); #else diff --git a/test/testcases/whitespace/abstract_from_function.hxtest b/test/testcases/whitespace/abstract_from_function.hxtest new file mode 100644 index 00000000..740decab --- /dev/null +++ b/test/testcases/whitespace/abstract_from_function.hxtest @@ -0,0 +1,14 @@ +{} + + +--- + +abstract A(Dynamic) from (String, Int) -> Int from (String, Bool) -> Bool from (Int) -> Void {} +abstract A(Dynamic) to (String, Int) -> Int to (String, Bool) -> Bool to (Int) -> Void {} +abstract A(Dynamic) from (String, Int) -> Int from (Int) -> Void to (String, Int) -> Int to (Int) -> Void {} + +--- + +abstract A(Dynamic) from (String, Int) -> Int from (String, Bool) -> Bool from (Int) -> Void {} +abstract A(Dynamic) to (String, Int) -> Int to (String, Bool) -> Bool to (Int) -> Void {} +abstract A(Dynamic) from (String, Int) -> Int from (Int) -> Void to (String, Int) -> Int to (Int) -> Void {}