diff --git a/src/dscanner/analysis/del.d b/src/dscanner/analysis/del.d index a97de00..abc60ff 100644 --- a/src/dscanner/analysis/del.d +++ b/src/dscanner/analysis/del.d @@ -6,74 +6,47 @@ module dscanner.analysis.del; import std.stdio; -import dparse.ast; -import dparse.lexer; import dscanner.analysis.base; +import dscanner.analysis.helpers; import dsymbol.scope_; /** * Checks for use of the deprecated 'delete' keyword */ -final class DeleteCheck : BaseAnalyzer +extern(C++) class DeleteCheck(AST) : BaseAnalyzerDmd { - alias visit = BaseAnalyzer.visit; - + // alias visit = BaseAnalyzerDmd!AST.visit; + alias visit = BaseAnalyzerDmd.visit; mixin AnalyzerInfo!"delete_check"; - this(BaseAnalyzerArguments args) + extern(D) this(string fileName) { - super(args); + super(fileName); } - override void visit(const DeleteExpression d) + override void visit(AST.DeleteExp d) { - addErrorMessage(d.tokens[0], KEY, - "Avoid using the 'delete' keyword.", - [AutoFix.replacement(d.tokens[0], `destroy(`, "Replace delete with destroy()") - .concat(AutoFix.insertionAfter(d.tokens[$ - 1], ")"))]); - d.accept(this); + addErrorMessage(cast(ulong) d.loc.linnum, cast(ulong) d.loc.charnum, "dscanner.deprecated.delete_keyword", + "Avoid using the 'delete' keyword."); + super.visit(d); } - - private enum string KEY = "dscanner.deprecated.delete_keyword"; } unittest { - import dscanner.analysis.config : Check, disabledConfig, StaticAnalysisConfig; - import dscanner.analysis.helpers : assertAnalyzerWarnings, assertAutoFix; + import dscanner.analysis.config : StaticAnalysisConfig, Check, disabledConfig; + import dscanner.analysis.helpers : assertAnalyzerWarnings; StaticAnalysisConfig sac = disabledConfig(); sac.delete_check = Check.enabled; - assertAnalyzerWarnings(q{ + assertAnalyzerWarningsDMD(q{ void testDelete() { int[int] data = [1 : 2]; - delete data[1]; /+ - ^^^^^^ [warn]: Avoid using the 'delete' keyword. +/ + delete data[1]; // [warn]: Avoid using the 'delete' keyword. auto a = new Class(); - delete a; /+ - ^^^^^^ [warn]: Avoid using the 'delete' keyword. +/ - } - }c, sac); - - assertAutoFix(q{ - void testDelete() - { - int[int] data = [1 : 2]; - delete data[1]; // fix - - auto a = new Class(); - delete a; // fix - } - }c, q{ - void testDelete() - { - int[int] data = [1 : 2]; - destroy(data[1]); // fix - - auto a = new Class(); - destroy(a); // fix + delete a; // [warn]: Avoid using the 'delete' keyword. } }c, sac); diff --git a/src/dscanner/analysis/run.d b/src/dscanner/analysis/run.d index a3ff0fa..44899f7 100644 --- a/src/dscanner/analysis/run.d +++ b/src/dscanner/analysis/run.d @@ -848,10 +848,6 @@ private BaseAnalyzer[] getAnalyzersForModuleAndConfig(string fileName, checks ~= new UnmodifiedFinder(args.setSkipTests( analysisConfig.could_be_immutable_check == Check.skipTests && !ut)); - if (moduleName.shouldRun!DeleteCheck(analysisConfig)) - checks ~= new DeleteCheck(args.setSkipTests( - analysisConfig.delete_check == Check.skipTests && !ut)); - if (moduleName.shouldRun!DuplicateAttributeCheck(analysisConfig)) checks ~= new DuplicateAttributeCheck(args.setSkipTests( analysisConfig.duplicate_attribute == Check.skipTests && !ut)); @@ -1332,6 +1328,9 @@ MessageSet analyzeDmd(string fileName, ASTBase.Module m, const char[] moduleName if (moduleName.shouldRunDmd!(EnumArrayVisitor!ASTBase)(config)) visitors ~= new EnumArrayVisitor!ASTBase(fileName); + if (moduleName.shouldRunDmd!(DeleteCheck!ASTBase)(config)) + visitors ~= new DeleteCheck!ASTBase(fileName); + foreach (visitor; visitors) { m.accept(visitor);