@@ -255,72 +255,72 @@ private void printRedundantParenthesisWarning(ParserRuleContext ctx, String firs
255255 }
256256 //endregion
257257
258- //region Open brace style check
259- void verifySwitchStatementOpenBraceStyle (SwitchStatementContext ctx ) {
258+ //region Brace style check
259+ void verifySwitchStatementBraceStyle (SwitchStatementContext ctx ) {
260+ // Open brace
260261 Location switchExpLocation = ListenerUtil .getTokenLocation (ctx .expression ().getStop ());
261262 Location openBraceLocation = ListenerUtil .getLocationOfChildToken (ctx , 2 );
262263
263264 if (switchExpLocation .line != openBraceLocation .line ) {
264- this .printer .warn (Messages .SWITCH_STATEMENT + Messages .BRACKET_STYLE , openBraceLocation );
265+ this .printer .warn (Messages .SWITCH_STATEMENT + Messages .OPEN_BRACKET_STYLE , openBraceLocation );
265266 }
266- }
267267
268- private void verifyCodeBlockOpenBraceStyle (String constructName , Location constructLocation ,
269- ParserRuleContext codeBlockCtx ) {
270- Location openBraceLocation = ListenerUtil .getLocationOfChildToken (codeBlockCtx , 0 );
271- if (constructLocation .line != openBraceLocation .line ) {
272- this .printer .warn (constructName + Messages .BRACKET_STYLE , openBraceLocation );
273- }
268+ // Close brace
269+ verifyBodyCloseBraceStyle (ctx , Messages .SWITCH_STATEMENT );
270+
274271 }
275272
276- void verifyForInStatementOpenBraceStyle (ForInStatementContext ctx ) {
273+ void verifyForInStatementBraceStyle (ForInStatementContext ctx ) {
277274 Location expressionLocation = ListenerUtil .getContextStopLocation (ctx .expression ());
278- verifyCodeBlockOpenBraceStyle (Messages . FOR_IN_LOOP , expressionLocation , ctx . codeBlock () );
275+ verifyCodeBlockOpenBraceStyle (ctx . codeBlock () , expressionLocation , Messages . FOR_IN_LOOP );
279276 }
280277
281- void verifyInitializerOpenBraceStyle (InitializerDeclarationContext ctx ) {
278+ void verifyInitializerBraceStyle (InitializerDeclarationContext ctx ) {
282279 Location parameterClauseLocation = ListenerUtil .getContextStopLocation (ctx .parameterClause ());
283- verifyCodeBlockOpenBraceStyle (Messages . INITIALIZER_BODY , parameterClauseLocation ,
284- ctx . initializerBody (). codeBlock () );
280+ verifyCodeBlockOpenBraceStyle (ctx . initializerBody (). codeBlock () , parameterClauseLocation ,
281+ Messages . INITIALIZER_BODY );
285282 }
286283
287- void verifyRepeatWhileLoopOpenBraceStyle (RepeatWhileStatementContext ctx ) {
284+ void verifyRepeatWhileLoopBraceStyle (RepeatWhileStatementContext ctx ) {
288285 Location repeatClause = ListenerUtil .getContextStartLocation (ctx );
289- verifyCodeBlockOpenBraceStyle (Messages . REPEAT_WHILE_STATEMENT , repeatClause , ctx . codeBlock () );
286+ verifyCodeBlockOpenBraceStyle (ctx . codeBlock () , repeatClause , Messages . REPEAT_WHILE_STATEMENT );
290287 }
291288
292- void verifyWhileLoopOpenBraceStyle (WhileStatementContext ctx ) {
289+ void verifyWhileLoopBraceStyle (WhileStatementContext ctx ) {
293290 Location conditionClauseLocation = ListenerUtil .getContextStopLocation (ctx .conditionClause ());
294- verifyCodeBlockOpenBraceStyle (Messages . WHILE_STATEMENT , conditionClauseLocation , ctx . codeBlock () );
291+ verifyCodeBlockOpenBraceStyle (ctx . codeBlock () , conditionClauseLocation , Messages . WHILE_STATEMENT );
295292 }
296293
297- void verifyIfStatementOpenBraceStyle (IfStatementContext ctx ) {
294+ void verifyIfStatementBraceStyle (IfStatementContext ctx ) {
298295 Location conditionClauseLocation = ListenerUtil .getContextStopLocation (ctx .conditionClause ());
299- verifyCodeBlockOpenBraceStyle (Messages . IF_STATEMENT , conditionClauseLocation , ctx . codeBlock () );
296+ verifyCodeBlockOpenBraceStyle (ctx . codeBlock () , conditionClauseLocation , Messages . IF_STATEMENT );
300297 }
301298
302- void verifyElseClauseOpenBraceStyle (ElseClauseContext ctx ) {
299+ void verifyElseClauseBraceStyle (ElseClauseContext ctx ) {
303300 if (ctx .codeBlock () == null ) {
304301 return ;
305302 }
306303 Location elseClauseLocation = ListenerUtil .getContextStartLocation (ctx );
307- verifyCodeBlockOpenBraceStyle (Messages . ELSE_CLAUSE , elseClauseLocation , ctx . codeBlock () );
304+ verifyCodeBlockOpenBraceStyle (ctx . codeBlock () , elseClauseLocation , Messages . ELSE_CLAUSE );
308305 }
309306
310- void verifyFunctionOpenBraceStyle (FunctionDeclarationContext ctx ) {
307+ void verifyFunctionBraceStyle (FunctionDeclarationContext ctx ) {
311308 Location functionDeclarationLocation = ListenerUtil .getContextStopLocation (ctx .functionSignature ());
312- verifyCodeBlockOpenBraceStyle (Messages .FUNCTION , functionDeclarationLocation , ctx .functionBody ().codeBlock ());
309+ verifyCodeBlockOpenBraceStyle (ctx .functionBody ().codeBlock (), functionDeclarationLocation , Messages .FUNCTION );
310+ verifyBodyCloseBraceStyle (ctx .functionBody ().codeBlock (), Messages .FUNCTION );
313311 }
314312
315- void verifyClassOpenBraceStyle (ClassBodyContext ctx ) {
313+ void verifyClassBraceStyle (ClassBodyContext ctx ) {
316314 verifyBodyOpenBraceStyle (ctx , Messages .CLASS );
315+ verifyBodyCloseBraceStyle (ctx , Messages .CLASS );
317316 }
318317
319- void verifyStructOpenBraceStyle (StructBodyContext ctx ) {
318+ void verifyStructBraceStyle (StructBodyContext ctx ) {
320319 verifyBodyOpenBraceStyle (ctx , Messages .STRUCT );
320+ verifyBodyCloseBraceStyle (ctx , Messages .STRUCT );
321321 }
322322
323- void verifyForLoopOpenBraceStyle (ForStatementContext ctx ) {
323+ void verifyForLoopBraceStyle (ForStatementContext ctx ) {
324324 int numChildren = ctx .getChildCount ();
325325 Location loopEndLocation ;
326326
@@ -334,42 +334,37 @@ void verifyForLoopOpenBraceStyle(ForStatementContext ctx) {
334334 ExpressionContext expressionContext = (ExpressionContext ) constructBeforeOpenBrace ;
335335 loopEndLocation = ListenerUtil .getContextStopLocation (expressionContext );
336336 }
337- verifyCodeBlockOpenBraceStyle (Messages . FOR_LOOP , loopEndLocation , ctx . codeBlock () );
337+ verifyCodeBlockOpenBraceStyle (ctx . codeBlock () , loopEndLocation , Messages . FOR_LOOP );
338338 }
339339
340- void verifyProtocolOpenBraceStyle (ProtocolBodyContext ctx ) {
340+ void verifyProtocolBraceStyle (ProtocolBodyContext ctx ) {
341341 verifyBodyOpenBraceStyle (ctx , Messages .PROTOCOL );
342+ verifyBodyCloseBraceStyle (ctx , Messages .PROTOCOL );
342343 }
343344
344- private void verifyBodyOpenBraceStyle (ParserRuleContext ctx , String constructName ) {
345- ParserRuleContext leftSibling = (ParserRuleContext ) ParseTreeUtil .getLeftSibling (ctx );
346- Location constructLocation = ListenerUtil .getContextStopLocation (leftSibling );
347- verifyCodeBlockOpenBraceStyle (constructName , constructLocation , ctx );
348- }
349-
350- void verifyEnumOpenBraceStyle (ParserRuleContext ctx ) {
345+ void verifyEnumBraceStyle (ParserRuleContext ctx ) {
351346 for (ParseTree child : ctx .children ) {
352347 if (child instanceof TerminalNodeImpl ) {
353348 Token openBrace = ((TerminalNodeImpl ) child ).getSymbol ();
354349 Location openBraceLocation = ListenerUtil .getTokenLocation (openBrace );
355350 ParserRuleContext leftSibling = (ParserRuleContext ) ParseTreeUtil .getLeftSibling (child );
356351 Location leftSiblingLocation = ListenerUtil .getContextStopLocation (leftSibling );
357352 if (openBraceLocation .line != leftSiblingLocation .line ) {
358- this .printer .warn (Messages .ENUM + Messages .BRACKET_STYLE , openBraceLocation );
353+ this .printer .warn (Messages .ENUM + Messages .OPEN_BRACKET_STYLE , openBraceLocation );
359354 }
360355 break ;
361356 }
362357 }
363358 }
364359
365- void verifyClosureExpressionOpenBraceStyle (ClosureExpressionContext ctx ) {
360+ void verifyClosureExpressionBraceStyle (ClosureExpressionContext ctx ) {
366361 ParseTree sixthAncestor = ParseTreeUtil .getNthParent (ctx , 6 );
367362
368363 if (sixthAncestor == null || !(sixthAncestor instanceof ExpressionElementListContext )) {
369364 ParserRuleContext leftSibling = (ParserRuleContext ) ParseTreeUtil .getLeftSibling (ctx );
370365 if (leftSibling != null ) {
371366 Location leftSiblingLocation = ListenerUtil .getContextStopLocation (leftSibling );
372- verifyCodeBlockOpenBraceStyle (Messages . CLOSURE , leftSiblingLocation , ctx );
367+ verifyCodeBlockOpenBraceStyle (ctx , leftSiblingLocation , Messages . CLOSURE );
373368 }
374369 return ;
375370 }
@@ -392,25 +387,82 @@ void verifyClosureExpressionOpenBraceStyle(ClosureExpressionContext ctx) {
392387 expElementLeftSiblingLocation = ListenerUtil .getContextStopLocation (leftContext );
393388 }
394389
395- verifyCodeBlockOpenBraceStyle (Messages . CLOSURE , expElementLeftSiblingLocation , ctx );
390+ verifyCodeBlockOpenBraceStyle (ctx , expElementLeftSiblingLocation , Messages . CLOSURE );
396391 }
397392
398- void verifyExtensionOpenBraceStyle (ExtensionBodyContext ctx ) {
393+ void verifyExtensionBraceStyle (ExtensionBodyContext ctx ) {
399394 verifyBodyOpenBraceStyle (ctx , Messages .EXTENSION );
395+ verifyBodyCloseBraceStyle (ctx , Messages .EXTENSION );
400396 }
401397
402- void verifyGetterOpenBraceStyle (GetterClauseContext ctx ) {
398+ void verifyGetterBraceStyle (GetterClauseContext ctx ) {
403399 TerminalNodeImpl get = (TerminalNodeImpl ) ParseTreeUtil .getLeftSibling (ctx .codeBlock ());
404400 Location getLocation = ListenerUtil .getTokenLocation (get .getSymbol ());
405- verifyCodeBlockOpenBraceStyle (Messages . GETTER , getLocation , ctx . codeBlock () );
401+ verifyCodeBlockOpenBraceStyle (ctx . codeBlock () , getLocation , Messages . GETTER );
406402 }
407403
408- void verifySetterOpenBraceStyle (SetterClauseContext ctx ) {
404+ void verifySetterBraceStyle (SetterClauseContext ctx ) {
409405 ParseTree leftSibling = ParseTreeUtil .getLeftSibling (ctx .codeBlock ());
410406 Location setLocation = (leftSibling instanceof TerminalNodeImpl )
411407 ? ListenerUtil .getTokenLocation (((TerminalNodeImpl ) leftSibling ).getSymbol ()) :
412408 ListenerUtil .getContextStopLocation ((ParserRuleContext ) leftSibling );
413- verifyCodeBlockOpenBraceStyle (Messages .SETTER , setLocation , ctx .codeBlock ());
409+ verifyCodeBlockOpenBraceStyle (ctx .codeBlock (), setLocation , Messages .SETTER );
410+ }
411+
412+ private void verifyCodeBlockOpenBraceStyle (ParserRuleContext codeBlockCtx , Location constructLocation ,
413+ String constructName ) {
414+ Location openBraceLocation = ListenerUtil .getLocationOfChildToken (codeBlockCtx , 0 );
415+ if (constructLocation .line != openBraceLocation .line ) {
416+ this .printer .warn (constructName + Messages .OPEN_BRACKET_STYLE , openBraceLocation );
417+ }
418+ }
419+
420+ private void verifyBodyOpenBraceStyle (ParserRuleContext ctx , String constructName ) {
421+ ParserRuleContext leftSibling = (ParserRuleContext ) ParseTreeUtil .getLeftSibling (ctx );
422+ Location constructLocation = ListenerUtil .getContextStopLocation (leftSibling );
423+ verifyCodeBlockOpenBraceStyle (ctx , constructLocation , constructName );
424+ }
425+
426+ private void verifyBodyCloseBraceStyle (ParserRuleContext bodyCtx , String constructName ) {
427+
428+ ParseTree closeBrace = ParseTreeUtil .getLastChild (bodyCtx );
429+ Token closeBraceToken = ((TerminalNodeImpl )closeBrace ).getSymbol ();
430+ Location closeBraceLocation = ListenerUtil .getTokenLocation (closeBraceToken );
431+
432+ List <Token > tokens = tokenStream .getHiddenTokensToLeft (closeBraceToken .getTokenIndex ());
433+ // if comments are to the left of }
434+ if (tokens != null ) {
435+ Token commentToken = getLastCommentToken (tokens );
436+ if (commentToken != null ) {
437+ int commentEndLine = ListenerUtil .getEndLineOfToken (commentToken );
438+ if (commentEndLine == closeBraceLocation .line ) {
439+ this .printer .warn (constructName + Messages .CLOSE_BRACKET_STYLE , closeBraceLocation );
440+ return ;
441+ }
442+ }
443+ }
444+
445+ // if no comments are to the left of }
446+ ParseTree closeBraceLeftSibling = ParseTreeUtil .getLeftSibling (closeBrace );
447+ Location closeBraceLeftSiblingLocation = ListenerUtil .getParseTreeStopLocation (closeBraceLeftSibling );
448+
449+ if (closeBraceLocation .line == closeBraceLeftSiblingLocation .line ) {
450+ if (!closeBraceLeftSibling .getText ().equals ("{" )) {
451+ this .printer .warn (constructName + Messages .CLOSE_BRACKET_STYLE , closeBraceLocation );
452+ } else if (closeBraceLocation .column - closeBraceLeftSiblingLocation .column != 1 ) {
453+ this .printer .warn (Messages .EMPTY_BODY , closeBraceLeftSiblingLocation );
454+ }
455+ }
456+ }
457+
458+ private Token getLastCommentToken (List <Token > tokens ) {
459+ for (int i = tokens .size () - 1 ; i >= 0 ; i --) {
460+ if (ListenerUtil .isComment (tokens .get (i ))) {
461+ return tokens .get (i );
462+ }
463+ }
464+
465+ return null ;
414466 }
415467 //endregion
416468
0 commit comments