diff --git a/analysis/numbers.d b/analysis/numbers.d new file mode 100644 index 0000000..4ad2dd2 --- /dev/null +++ b/analysis/numbers.d @@ -0,0 +1,37 @@ +// Copyright Brian Schott (Sir Alaran) 2014. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +module analysis.numbers; + +import std.regex; +import stdx.d.ast; +import stdx.d.lexer; +import analysis.base; + +/** + * Checks for use of the deprecated "delete" keyword + */ +class NumberStyleCheck : BaseAnalyzer +{ + alias visit = BaseAnalyzer.visit; + + this(string fileName) + { + super(fileName); + } + + override void visit(Token t) + { + if (isNumberLiteral(t.type) && (t.text.matchFirst(badBinaryRegex) + || t.text.matchFirst(badDecimalRegex))) + { + addErrorMessage(t.line, t.column, + "Use underscores to improve number constant readability"); + } + } + + auto badBinaryRegex = ctRegex!(`0b[01]{9,}`); + auto badDecimalRegex = ctRegex!(`\d{4,}`); +} diff --git a/analysis/run.d b/analysis/run.d index d55a7d1..b8da31b 100644 --- a/analysis/run.d +++ b/analysis/run.d @@ -17,6 +17,7 @@ import analysis.enumarrayliteral; import analysis.pokemon; import analysis.del; import analysis.fish; +import analysis.numbers; void messageFunction(string fileName, size_t line, size_t column, string message, bool isError) @@ -71,8 +72,12 @@ void analyze(File output, string[] fileNames, bool staticAnalyze = true) auto fish = new FloatOperatorCheck(fileName); fish.visit(m); + auto numbers = new NumberStyleCheck(fileName); + numbers.visit(m); + foreach (message; sort(chain(enums.messages, style.messages, - pokemon.messages, del.messages, fish.messages).array)) + pokemon.messages, del.messages, fish.messages, numbers.messages + ).array)) { writeln(message); } diff --git a/astprinter.d b/astprinter.d index 88cad63..9b4031a 100644 --- a/astprinter.d +++ b/astprinter.d @@ -59,12 +59,12 @@ class XMLPrinter : ASTVisitor output.writeln(""); output.writeln(""); andAndExpression.left.accept(this); - output.writeln(""); + output.writeln(""); if (andAndExpression.right !is null) { output.writeln(""); andAndExpression.right.accept(this); - output.writeln(""); + output.writeln(""); } output.writeln(""); } @@ -74,12 +74,12 @@ class XMLPrinter : ASTVisitor output.writeln(""); output.writeln(""); andExpression.left.accept(this); - output.writeln(""); + output.writeln(""); if (andExpression.right !is null) { output.writeln(""); andExpression.right.accept(this); - output.writeln(""); + output.writeln(""); } output.writeln(""); } @@ -429,14 +429,14 @@ class XMLPrinter : ASTVisitor override void visit(EqualExpression equalExpression) { - output.writeln(""); + output.writeln(""); output.writeln(""); - visit(equalExpression.left); + equalExpression.left.accept(this); output.writeln(""); output.writeln(""); - visit(equalExpression.right); + equalExpression.right.accept(this); output.writeln(""); - output.writeln(""); + output.writeln(""); } override void visit(Expression expression) @@ -637,17 +637,17 @@ class XMLPrinter : ASTVisitor visit(ifStatement.type); visit(ifStatement.identifier); } - visit(ifStatement.expression); + ifStatement.expression.accept(this); output.writeln(""); output.writeln(""); - visit(ifStatement.thenStatement); + ifStatement.thenStatement.accept(this); output.writeln(""); if (ifStatement.elseStatement !is null) { output.writeln(""); - visit(ifStatement.elseStatement); + ifStatement.elseStatement.accept(this); output.writeln(""); } output.writeln(""); @@ -983,10 +983,10 @@ class XMLPrinter : ASTVisitor output.writeln(""); output.writeln(""); - visit(relExpression.left); + relExpression.left.accept(this); output.writeln(""); output.writeln(""); - visit(relExpression.right); + relExpression.right.accept(this); output.writeln(""); output.writeln(""); } @@ -1023,10 +1023,10 @@ class XMLPrinter : ASTVisitor output.writeln(""); output.writeln(""); - visit(shiftExpression.left); + shiftExpression.left.accept(this); output.writeln(""); output.writeln(""); - visit(shiftExpression.right); + shiftExpression.right.accept(this); output.writeln(""); output.writeln(""); } @@ -1404,11 +1404,11 @@ class XMLPrinter : ASTVisitor { output.writeln("", xmlEscape(unaryExpression.prefix.text), ""); - visit(unaryExpression.unaryExpression); + unaryExpression.unaryExpression.accept(this); } if (unaryExpression.suffix != tok!"") { - visit(unaryExpression.unaryExpression); + unaryExpression.unaryExpression.accept(this); output.writeln("", unaryExpression.suffix.text, ""); }