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 }