Skip to content

Commit d3c7651

Browse files
authored
fixed BrOpen handling of NeedBraces check (#446)
* fixed BrOpen handling of NeedBraces check
1 parent c8a4ac8 commit d3c7651

File tree

3 files changed

+119
-46
lines changed

3 files changed

+119
-46
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
- Fixed indentation calculation for functions bodys without curly braces [#443](https://github.com/HaxeCheckstyle/haxe-checkstyle/issues/443)
1212
- Fixed segmentaion faults in NeedBraces and CatchParameterName checks [#443](https://github.com/HaxeCheckstyle/haxe-checkstyle/issues/443)
1313
- Fixed reported position of EmptyBlock check [#444](https://github.com/HaxeCheckstyle/haxe-checkstyle/issues/444)
14+
- Fixed BrOpen detection in NeedBraces check [#446](https://github.com/HaxeCheckstyle/haxe-checkstyle/issues/446)
1415
- Changed message of NestedForLoop check [#443](https://github.com/HaxeCheckstyle/haxe-checkstyle/issues/443)
1516
- Changed autodetection for nested for/if/try checks to start at zero [#444](https://github.com/HaxeCheckstyle/haxe-checkstyle/issues/444)
1617
- Refactored `Checker.getLinePos` to use binary search, reduces runtime from O(N/2) to O(log N) [#439](https://github.com/HaxeCheckstyle/haxe-checkstyle/issues/439)

src/checkstyle/checks/block/NeedBracesCheck.hx

Lines changed: 20 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class NeedBracesCheck extends Check {
6767
case Kwd(KwdFunction):
6868
checkFunctionChild(tok);
6969
case Kwd(KwdDo):
70-
checkDoWhileChild(tok);
70+
checkLastChild(tok);
7171
case Kwd(KwdWhile):
7272
checkWhileChild(tok);
7373
default:
@@ -94,57 +94,35 @@ class NeedBracesCheck extends Check {
9494
function checkFunctionChild(token:TokenTree) {
9595
if (token == null || !token.hasChildren()) return;
9696

97-
var lastChild:TokenTree = token.getLastChild();
98-
switch (lastChild.tok) {
99-
case Const(CIdent(_)), Kwd(KwdNew):
100-
if (!lastChild.hasChildren()) return;
101-
lastChild = lastChild.getLastChild();
102-
default:
103-
}
104-
switch (lastChild.tok) {
105-
case BrOpen:
106-
return;
107-
case Semicolon:
108-
return;
109-
default:
110-
checkNoBraces(token, lastChild);
97+
var accessHelper:TokenTreeAccessHelper;
98+
if (token.children.length == 1) {
99+
accessHelper = TokenTreeAccessHelper.access(token).firstChild();
111100
}
112-
}
113-
114-
function checkDoWhileChild(token:TokenTree) {
115-
if (token == null || !token.hasChildren()) return;
116-
117-
var lastChild:TokenTree = token.getLastChild();
118-
var expr:TokenTree = lastChild.previousSibling;
119-
switch (expr.tok) {
120-
case BrOpen:
121-
return;
122-
default:
123-
checkNoBraces(token, lastChild);
101+
else {
102+
accessHelper = TokenTreeAccessHelper.access(token);
124103
}
104+
// function bodies
105+
var lastChild:TokenTree = accessHelper.firstOf(BrOpen).token;
106+
if (lastChild != null) return;
107+
// interfaces
108+
lastChild = accessHelper.firstOf(Semicolon).token;
109+
if (lastChild != null) return;
110+
lastChild = accessHelper.lastChild().token;
111+
112+
checkNoBraces(token, lastChild);
125113
}
126114

127115
function checkWhileChild(token:TokenTree) {
128116
if (token == null || !token.hasChildren() || Type.enumEq(token.parent.tok, Kwd(KwdDo))) return;
129-
var lastChild:TokenTree = token.getLastChild();
130-
switch (lastChild.tok) {
131-
case BrOpen:
132-
return;
133-
default:
134-
checkNoBraces(token, lastChild);
135-
}
117+
checkLastChild(token);
136118
}
137119

138120
function checkLastChild(token:TokenTree) {
139121
if (token == null || !token.hasChildren()) return;
140-
141-
var lastChild:TokenTree = token.getLastChild();
142-
switch (lastChild.tok) {
143-
case BrOpen:
144-
return;
145-
default:
146-
checkNoBraces(token, lastChild);
147-
}
122+
var lastChild:TokenTree = TokenTreeAccessHelper.access(token).firstOf(BrOpen).token;
123+
if (lastChild != null) return;
124+
lastChild = TokenTreeAccessHelper.access(token).lastChild().token;
125+
checkNoBraces(token, lastChild);
148126
}
149127

150128
function checkNoBraces(parent:TokenTree, child:TokenTree) {

test/checks/block/NeedBracesCheckTest.hx

Lines changed: 98 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ class NeedBracesCheckTest extends CheckTestCase<NeedBracesCheckTests> {
1515
static inline var MSG_SAME_LINE_FOR:String = 'Body of "for" on same line';
1616
static inline var MSG_SAME_LINE_WHILE:String = 'Body of "while" on same line';
1717

18+
static inline var MSG_SAME_LINE_FUNCTION:String = 'Body of "function" on same line';
19+
static inline var MSG_SAME_LINE_DO_WHILE:String = 'Body of "do" on same line';
20+
1821
@Test
1922
public function testCorrectBraces() {
2023
var check = new NeedBracesCheck();
@@ -28,6 +31,8 @@ class NeedBracesCheckTest extends CheckTestCase<NeedBracesCheckTests> {
2831
assertNoMsg(check, TEST13);
2932
assertNoMsg(check, TEST14);
3033
assertNoMsg(check, INTERFACE_DEF);
34+
assertNoMsg(check, ANON_FUNCTION);
35+
assertNoMsg(check, ANON_FUNCTION_NO_BRACES);
3136
}
3237

3338
@Test
@@ -177,6 +182,62 @@ class NeedBracesCheckTest extends CheckTestCase<NeedBracesCheckTests> {
177182
check.allowSingleLineStatement = false;
178183
assertMsg(check, TEST, MSG_SAME_LINE_WHILE);
179184
}
185+
186+
@Test
187+
public function testTokenFunction() {
188+
var check = new NeedBracesCheck();
189+
check.tokens = [FUNCTION];
190+
191+
assertNoMsg(check, TEST);
192+
assertNoMsg(check, TEST1);
193+
assertNoMsg(check, TEST2);
194+
assertNoMsg(check, TEST3);
195+
assertNoMsg(check, TEST4);
196+
assertNoMsg(check, TEST5);
197+
assertNoMsg(check, TEST6);
198+
assertNoMsg(check, TEST7);
199+
assertNoMsg(check, TEST8);
200+
assertNoMsg(check, TEST9);
201+
assertNoMsg(check, TEST10);
202+
assertNoMsg(check, TEST11);
203+
assertNoMsg(check, TEST12);
204+
assertNoMsg(check, TEST13);
205+
assertNoMsg(check, TEST14);
206+
assertNoMsg(check, ANON_FUNCTION);
207+
assertNoMsg(check, ANON_FUNCTION_NO_BRACES);
208+
209+
check.allowSingleLineStatement = false;
210+
assertNoMsg(check, ANON_FUNCTION);
211+
assertMsg(check, ANON_FUNCTION_NO_BRACES, MSG_SAME_LINE_FUNCTION);
212+
}
213+
214+
@Test
215+
public function testTokenDoWhile() {
216+
var check = new NeedBracesCheck();
217+
check.tokens = [DO_WHILE];
218+
219+
assertNoMsg(check, TEST);
220+
assertNoMsg(check, TEST1);
221+
assertNoMsg(check, TEST2);
222+
assertNoMsg(check, TEST3);
223+
assertNoMsg(check, TEST4);
224+
assertNoMsg(check, TEST5);
225+
assertNoMsg(check, TEST6);
226+
assertNoMsg(check, TEST7);
227+
assertNoMsg(check, TEST8);
228+
assertNoMsg(check, TEST9);
229+
assertNoMsg(check, TEST10);
230+
assertNoMsg(check, TEST11);
231+
assertNoMsg(check, TEST12);
232+
assertNoMsg(check, TEST13);
233+
assertNoMsg(check, TEST14);
234+
assertNoMsg(check, DO_WHILE);
235+
assertNoMsg(check, DO_WHILE_NO_BRACES);
236+
237+
check.allowSingleLineStatement = false;
238+
assertNoMsg(check, DO_WHILE);
239+
assertMsg(check, DO_WHILE_NO_BRACES, MSG_SAME_LINE_DO_WHILE);
240+
}
180241
}
181242

182243
@:enum
@@ -346,12 +407,12 @@ abstract NeedBracesCheckTests(String) to String {
346407
var TEST15 = "
347408
class Test {
348409
public function test(a:Bool, b:Bool) {
349-
if (a) {
410+
if (a) {
350411
351-
}
352-
else if (!b) {
412+
}
413+
else if (!b) {
353414
354-
}
415+
}
355416
}
356417
}";
357418

@@ -369,4 +430,37 @@ abstract NeedBracesCheckTests(String) to String {
369430
interface Test {
370431
function test();
371432
}";
433+
434+
var ANON_FUNCTION = "
435+
abstractAndClass Test {
436+
function test() {
437+
doSomething(function() {
438+
doIt();
439+
}, false);
440+
}
441+
}";
442+
443+
var ANON_FUNCTION_NO_BRACES = "
444+
abstractAndClass Test {
445+
function test() {
446+
doSomething(function() doIt(), false);
447+
}
448+
}";
449+
450+
var DO_WHILE = "
451+
class Test {
452+
function test() {
453+
do {
454+
return i;
455+
}
456+
while (true);
457+
}
458+
}";
459+
460+
var DO_WHILE_NO_BRACES = "
461+
class Test {
462+
function test() {
463+
do return i while (true);
464+
}
465+
}";
372466
}

0 commit comments

Comments
 (0)