1 // Copyright Brian Schott (Hackerpilot) 2015. 2 // Distributed under the Boost Software License, Version 1.0. 3 // (See accompanying file LICENSE_1_0.txt or copy at 4 // http://www.boost.org/LICENSE_1_0.txt) 5 6 module analysis.redundant_parens; 7 8 import std.d.ast; 9 import std.d.lexer; 10 import analysis.base; 11 12 class RedundantParenCheck : BaseAnalyzer 13 { 14 alias visit = BaseAnalyzer.visit; 15 16 this(string fileName) 17 { 18 super(fileName); 19 } 20 21 override void visit(const IfStatement statement) 22 { 23 UnaryExpression unary; 24 if (statement.expression is null || statement.expression.items.length != 1) 25 goto end; 26 unary = cast(UnaryExpression) statement.expression.items[0]; 27 if (unary is null) 28 goto end; 29 if (unary.primaryExpression is null) 30 goto end; 31 if (unary.primaryExpression.expression is null) 32 goto end; 33 addErrorMessage(unary.primaryExpression.expression.line, 34 unary.primaryExpression.expression.column, KEY, "Redundant parenthesis"); 35 end: 36 statement.accept(this); 37 } 38 39 override void visit(const PrimaryExpression primaryExpression) 40 { 41 UnaryExpression unary; 42 if (primaryExpression.expression is null) 43 goto end; 44 unary = cast(UnaryExpression) primaryExpression.expression.items[0]; 45 if (unary is null) 46 goto end; 47 if (unary.primaryExpression is null) 48 goto end; 49 if (unary.primaryExpression.expression is null) 50 goto end; 51 addErrorMessage(primaryExpression.expression.line, 52 primaryExpression.expression.column, KEY, "Redundant parenthesis"); 53 end: 54 primaryExpression.accept(this); 55 } 56 57 private: 58 enum KEY = "dscanner.suspicious.redundant_parens"; 59 }