Skip to content

Commit 46a34e0

Browse files
committed
Merge pull request #110 from alykhank/at-100-bracket-style-4
#100: Bracket style 4
2 parents 8af18dc + 0c4d23c commit 46a34e0

8 files changed

Lines changed: 323 additions & 70 deletions

File tree

src/main/java/com/sleekbyte/tailor/common/Messages.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ public class Messages {
7474
public static final String ENCLOSED_PARENTHESIS = "should not be enclosed within parentheses";
7575
public static final String K_PREFIXED = "should not be prefixed with 'k' or 'K'";
7676
public static final String MULTIPLE_IMPORTS = "should be on separate lines";
77-
public static final String BRACKET_STYLE = "should not have any line breaks before the opening brace";
77+
public static final String OPEN_BRACKET_STYLE = "should not have any line breaks before the opening brace";
78+
public static final String CLOSE_BRACKET_STYLE = "closing brace should be isolated on a separate line";
79+
public static final String EMPTY_BODY = "Empty construct body should not contain any whitespace";
7880
public static final String SPACE_BEFORE = "must have exactly one space before it";
7981
public static final String SPACE_AFTER = "must have exactly one space after it";
8082
public static final String NO_SPACE_BEFORE = "must have no spaces before it";

src/main/java/com/sleekbyte/tailor/listeners/MainListener.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,13 @@ public void enterProtocolMemberDeclaration(SwiftParser.ProtocolMemberDeclaration
9999
@Override
100100
public void enterClassBody(SwiftParser.ClassBodyContext ctx) {
101101
verifier.verifyConstructLength(Messages.CLASS, verifier.maxLengths.maxClassLength, ctx);
102-
verifier.verifyClassOpenBraceStyle(ctx);
102+
verifier.verifyClassBraceStyle(ctx);
103103
}
104104

105105
@Override
106106
public void enterClosureExpression(SwiftParser.ClosureExpressionContext ctx) {
107107
verifier.verifyConstructLength(Messages.CLOSURE, verifier.maxLengths.maxClosureLength, ctx);
108-
verifier.verifyClosureExpressionOpenBraceStyle(ctx);
108+
verifier.verifyClosureExpressionBraceStyle(ctx);
109109
}
110110

111111
@Override
@@ -116,7 +116,7 @@ public void enterFunctionBody(SwiftParser.FunctionBodyContext ctx) {
116116
@Override
117117
public void enterStructBody(SwiftParser.StructBodyContext ctx) {
118118
verifier.verifyConstructLength(Messages.STRUCT, verifier.maxLengths.maxStructLength, ctx);
119-
verifier.verifyStructOpenBraceStyle(ctx);
119+
verifier.verifyStructBraceStyle(ctx);
120120
}
121121

122122
@Override
@@ -240,13 +240,13 @@ public void enterConditionClause(SwiftParser.ConditionClauseContext ctx) {
240240
@Override
241241
public void enterSwitchStatement(SwiftParser.SwitchStatementContext ctx) {
242242
verifier.verifyRedundantExpressionParenthesis(Messages.SWITCH_EXPRESSION, ctx.expression());
243-
verifier.verifySwitchStatementOpenBraceStyle(ctx);
243+
verifier.verifySwitchStatementBraceStyle(ctx);
244244
}
245245

246246
@Override
247247
public void enterForStatement(SwiftParser.ForStatementContext ctx) {
248248
verifier.verifyRedundantForLoopParenthesis(ctx);
249-
verifier.verifyForLoopOpenBraceStyle(ctx);
249+
verifier.verifyForLoopBraceStyle(ctx);
250250
}
251251

252252
@Override
@@ -284,38 +284,38 @@ public void enterImportDeclaration(SwiftParser.ImportDeclarationContext ctx) {
284284

285285
@Override
286286
public void enterFunctionDeclaration(SwiftParser.FunctionDeclarationContext ctx) {
287-
verifier.verifyFunctionOpenBraceStyle(ctx);
287+
verifier.verifyFunctionBraceStyle(ctx);
288288
verifier.verifyBlankLinesAroundFunction(ctx);
289289
}
290290

291291
@Override
292292
public void enterElseClause(SwiftParser.ElseClauseContext ctx) {
293-
verifier.verifyElseClauseOpenBraceStyle(ctx);
293+
verifier.verifyElseClauseBraceStyle(ctx);
294294
}
295295

296296
@Override
297297
public void enterIfStatement(SwiftParser.IfStatementContext ctx) {
298-
verifier.verifyIfStatementOpenBraceStyle(ctx);
298+
verifier.verifyIfStatementBraceStyle(ctx);
299299
}
300300

301301
@Override
302302
public void enterWhileStatement(SwiftParser.WhileStatementContext ctx) {
303-
verifier.verifyWhileLoopOpenBraceStyle(ctx);
303+
verifier.verifyWhileLoopBraceStyle(ctx);
304304
}
305305

306306
@Override
307307
public void enterRepeatWhileStatement(SwiftParser.RepeatWhileStatementContext ctx) {
308-
verifier.verifyRepeatWhileLoopOpenBraceStyle(ctx);
308+
verifier.verifyRepeatWhileLoopBraceStyle(ctx);
309309
}
310310

311311
@Override
312312
public void enterInitializerDeclaration(SwiftParser.InitializerDeclarationContext ctx) {
313-
verifier.verifyInitializerOpenBraceStyle(ctx);
313+
verifier.verifyInitializerBraceStyle(ctx);
314314
}
315315

316316
@Override
317317
public void enterForInStatement(SwiftParser.ForInStatementContext ctx) {
318-
verifier.verifyForInStatementOpenBraceStyle(ctx);
318+
verifier.verifyForInStatementBraceStyle(ctx);
319319
}
320320

321321
@Override
@@ -330,17 +330,17 @@ public void enterTypeAnnotation(SwiftParser.TypeAnnotationContext ctx) {
330330

331331
@Override
332332
public void enterProtocolBody(SwiftParser.ProtocolBodyContext ctx) {
333-
verifier.verifyProtocolOpenBraceStyle(ctx);
333+
verifier.verifyProtocolBraceStyle(ctx);
334334
}
335335

336336
@Override
337337
public void enterUnionStyleEnum(SwiftParser.UnionStyleEnumContext ctx) {
338-
verifier.verifyEnumOpenBraceStyle(ctx);
338+
verifier.verifyEnumBraceStyle(ctx);
339339
}
340340

341341
@Override
342342
public void enterRawValueStyleEnum(SwiftParser.RawValueStyleEnumContext ctx) {
343-
verifier.verifyEnumOpenBraceStyle(ctx);
343+
verifier.verifyEnumBraceStyle(ctx);
344344
}
345345

346346
@Override
@@ -375,17 +375,17 @@ public void enterGenericParameter(SwiftParser.GenericParameterContext ctx) {
375375

376376
@Override
377377
public void enterExtensionBody(SwiftParser.ExtensionBodyContext ctx) {
378-
verifier.verifyExtensionOpenBraceStyle(ctx);
378+
verifier.verifyExtensionBraceStyle(ctx);
379379
}
380380

381381
@Override
382382
public void enterGetterClause(SwiftParser.GetterClauseContext ctx) {
383-
verifier.verifyGetterOpenBraceStyle(ctx);
383+
verifier.verifyGetterBraceStyle(ctx);
384384
}
385385

386386
@Override
387387
public void enterSetterClause(SwiftParser.SetterClauseContext ctx) {
388-
verifier.verifySetterOpenBraceStyle(ctx);
388+
verifier.verifySetterBraceStyle(ctx);
389389
}
390390

391391
@Override

src/main/java/com/sleekbyte/tailor/listeners/ParseTreeVerifier.java

Lines changed: 98 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)