diff --git a/src/analysis/asm_style.d b/src/analysis/asm_style.d index 2a110a4..063b48c 100644 --- a/src/analysis/asm_style.d +++ b/src/analysis/asm_style.d @@ -38,7 +38,8 @@ class AsmStyleCheck : BaseAnalyzer unittest { - import analysis.config; + import analysis.config : StaticAnalysisConfig; + StaticAnalysisConfig sac; sac.asm_style_check = true; assertAnalyzerWarnings(q{ diff --git a/src/analysis/base.d b/src/analysis/base.d index 883433b..f984ef3 100644 --- a/src/analysis/base.d +++ b/src/analysis/base.d @@ -51,8 +51,6 @@ protected: } } - import core.vararg; - void addErrorMessage(size_t line, size_t column, string key, string message) { _messages.insert(Message(fileName, line, column, key, message)); diff --git a/src/analysis/constructors.d b/src/analysis/constructors.d index e9ad351..3d9eb09 100644 --- a/src/analysis/constructors.d +++ b/src/analysis/constructors.d @@ -91,7 +91,8 @@ private: unittest { - import analysis.config; + import analysis.config : StaticAnalysisConfig; + StaticAnalysisConfig sac; sac.constructor_check = true; assertAnalyzerWarnings(q{ diff --git a/src/analysis/del.d b/src/analysis/del.d index 6613220..c6ee938 100644 --- a/src/analysis/del.d +++ b/src/analysis/del.d @@ -33,7 +33,8 @@ class DeleteCheck : BaseAnalyzer unittest { - import analysis.config; + import analysis.config : StaticAnalysisConfig; + StaticAnalysisConfig sac; sac.delete_check = true; assertAnalyzerWarnings(q{ diff --git a/src/analysis/duplicate_attribute.d b/src/analysis/duplicate_attribute.d index 93c5d47..1c1eb6c 100644 --- a/src/analysis/duplicate_attribute.d +++ b/src/analysis/duplicate_attribute.d @@ -156,7 +156,7 @@ class DuplicateAttributeCheck : BaseAnalyzer unittest { - import analysis.config; + import analysis.config : StaticAnalysisConfig; StaticAnalysisConfig sac; sac.duplicate_attribute = true; assertAnalyzerWarnings(q{ diff --git a/src/analysis/fish.d b/src/analysis/fish.d index fe39afc..2bc5dea 100644 --- a/src/analysis/fish.d +++ b/src/analysis/fish.d @@ -45,7 +45,8 @@ class FloatOperatorCheck : BaseAnalyzer unittest { - import analysis.config; + import analysis.config : StaticAnalysisConfig; + StaticAnalysisConfig sac; sac.float_operator_check = true; assertAnalyzerWarnings(q{ diff --git a/src/analysis/helpers.d b/src/analysis/helpers.d index 454ec63..b0955d8 100644 --- a/src/analysis/helpers.d +++ b/src/analysis/helpers.d @@ -52,9 +52,8 @@ S after(S)(S value, S separator) */ void assertAnalyzerWarnings(string code, const StaticAnalysisConfig config, string file=__FILE__, size_t line=__LINE__) { - import analysis.run; + import analysis.run : ParseAllocator, parseModule; import std.d.lexer : StringCache; - import std.d.parser; StringCache cache = StringCache(StringCache.defaultBucketCount); ParseAllocator p = new ParseAllocator; diff --git a/src/analysis/ifelsesame.d b/src/analysis/ifelsesame.d index 109a262..f260da0 100644 --- a/src/analysis/ifelsesame.d +++ b/src/analysis/ifelsesame.d @@ -79,7 +79,8 @@ class IfElseSameCheck : BaseAnalyzer unittest { - import analysis.config; + import analysis.config : StaticAnalysisConfig; + StaticAnalysisConfig sac; sac.if_else_same_check = true; assertAnalyzerWarnings(q{ diff --git a/src/analysis/length_subtraction.d b/src/analysis/length_subtraction.d index 63ad720..0fbef2b 100644 --- a/src/analysis/length_subtraction.d +++ b/src/analysis/length_subtraction.d @@ -59,7 +59,8 @@ class LengthSubtractionCheck : BaseAnalyzer unittest { - import analysis.config; + import analysis.config : StaticAnalysisConfig; + StaticAnalysisConfig sac; sac.length_subtraction_check = true; assertAnalyzerWarnings(q{ diff --git a/src/analysis/linespan.d b/src/analysis/linespan.d index 22cbbb3..60e6a48 100644 --- a/src/analysis/linespan.d +++ b/src/analysis/linespan.d @@ -63,7 +63,8 @@ private: unittest { - import std.stdio; + import std.stdio:stderr; + LineSpans l; l.addLine(5); foreach (i; 2 .. 9) diff --git a/src/analysis/logic_precedence.d b/src/analysis/logic_precedence.d index 8f2d7b1..c78dc6a 100644 --- a/src/analysis/logic_precedence.d +++ b/src/analysis/logic_precedence.d @@ -44,7 +44,8 @@ class LogicPrecedenceCheck : BaseAnalyzer unittest { - import analysis.config; + import analysis.config : StaticAnalysisConfig; + StaticAnalysisConfig sac; sac.logical_precedence_check = true; assertAnalyzerWarnings(q{ diff --git a/src/analysis/opequals_without_tohash.d b/src/analysis/opequals_without_tohash.d index 44d58ba..290a805 100644 --- a/src/analysis/opequals_without_tohash.d +++ b/src/analysis/opequals_without_tohash.d @@ -91,7 +91,8 @@ class OpEqualsWithoutToHashCheck : BaseAnalyzer unittest { - import analysis.config; + import analysis.config : StaticAnalysisConfig; + StaticAnalysisConfig sac; sac.opequals_tohash_check = true; assertAnalyzerWarnings(q{ diff --git a/src/analysis/pokemon.d b/src/analysis/pokemon.d index e66e9ae..7d61571 100644 --- a/src/analysis/pokemon.d +++ b/src/analysis/pokemon.d @@ -84,7 +84,8 @@ class PokemonExceptionCheck : BaseAnalyzer unittest { - import analysis.config; + import analysis.config : StaticAnalysisConfig; + StaticAnalysisConfig sac; sac.exception_check = true; assertAnalyzerWarnings(q{ diff --git a/src/analysis/range.d b/src/analysis/range.d index dd16287..1d2644e 100644 --- a/src/analysis/range.d +++ b/src/analysis/range.d @@ -19,8 +19,13 @@ class BackwardsRangeCheck : BaseAnalyzer { alias visit = BaseAnalyzer.visit; + /// Key for this check in the report output enum string KEY = "dscanner.bugs.backwards_slices"; + /** + * Params: + * fileName = the name of the file being analyzed + */ this(string fileName) { super(fileName); @@ -30,7 +35,7 @@ class BackwardsRangeCheck : BaseAnalyzer { if (foreachStatement.low !is null && foreachStatement.high !is null) { - import std.string; + import std.string : format; state = State.left; visit(foreachStatement.low); state = State.right; @@ -67,7 +72,7 @@ class BackwardsRangeCheck : BaseAnalyzer override void visit(const PrimaryExpression primary) { - import std.conv; + import std.conv : to, ConvException; if (state == State.ignore || !isNumberLiteral(primary.primary.type)) return; @@ -99,7 +104,7 @@ class BackwardsRangeCheck : BaseAnalyzer state = State.ignore; if (hasLeft && hasRight && left > right) { - import std.string; + import std.string : format; string message = format( "%d is larger than %d. This slice is likely incorrect.", left, right); diff --git a/src/analysis/style.d b/src/analysis/style.d index f09d728..6d30e80 100644 --- a/src/analysis/style.d +++ b/src/analysis/style.d @@ -93,7 +93,8 @@ class StyleChecker : BaseAnalyzer unittest { - import analysis.config; + import analysis.config : StaticAnalysisConfig; + StaticAnalysisConfig sac; sac.style_check = true; diff --git a/src/analysis/unused.d b/src/analysis/unused.d index b8e210c..7b23dbe 100644 --- a/src/analysis/unused.d +++ b/src/analysis/unused.d @@ -18,6 +18,10 @@ class UnusedVariableCheck : BaseAnalyzer { alias visit = BaseAnalyzer.visit; + /** + * Params: + * fileName = the name of the file being analyzed + */ this(string fileName) { super(fileName); @@ -54,18 +58,6 @@ class UnusedVariableCheck : BaseAnalyzer popScope(); } -// override void visit(const Type type) {} - - mixin template PartsUseVariables(NodeType) - { - override void visit(const NodeType node) - { - interestDepth++; - node.accept(this); - interestDepth--; - } - } - mixin PartsUseVariables!AliasInitializer; mixin PartsUseVariables!ArgumentList; mixin PartsUseVariables!AssertExpression; @@ -327,6 +319,16 @@ class UnusedVariableCheck : BaseAnalyzer private: + mixin template PartsUseVariables(NodeType) + { + override void visit(const NodeType node) + { + interestDepth++; + node.accept(this); + interestDepth--; + } + } + void variableDeclared(string name, size_t line, size_t column, bool isParameter, bool isRef) { diff --git a/src/main.d b/src/main.d index 95dde3a..9047b36 100644 --- a/src/main.d +++ b/src/main.d @@ -378,9 +378,9 @@ options: programName); } -void doNothing(string, size_t, size_t, string, bool) {} +private void doNothing(string, size_t, size_t, string, bool) {} -enum CONFIG_FILE_NAME = "dscanner.ini"; +private enum CONFIG_FILE_NAME = "dscanner.ini"; version(linux) version = useXDG; version(BSD) version = useXDG; version(FreeBSD) version = useXDG; @@ -393,8 +393,7 @@ string getConfigurationLocation() { version (useXDG) { - int x; - import std.process; + import std.process : environment; string configDir = environment.get("XDG_CONFIG_HOME", null); if (configDir is null) {