From 45db7a9bf98ee9abba0d009d21f08101d27bf77c Mon Sep 17 00:00:00 2001 From: WebFreak001 Date: Fri, 13 Oct 2023 02:26:52 +0200 Subject: [PATCH] allow `@nolint(dscanner)` to disable all scanners among groups like dscanner.abc would disable all of dscanner.abc.* --- src/dscanner/analysis/nolint.d | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/dscanner/analysis/nolint.d b/src/dscanner/analysis/nolint.d index 1b707a6..4d2ab41 100644 --- a/src/dscanner/analysis/nolint.d +++ b/src/dscanner/analysis/nolint.d @@ -7,14 +7,24 @@ import dparse.lexer; import std.algorithm : canFind; import std.regex : matchAll, regex; -import std.string : strip; +import std.string : lastIndexOf, strip; import std.typecons; struct NoLint { - bool containsCheck(in string check) const + bool containsCheck(scope const(char)[] check) const { - return disabledChecks.get(check, 0) > 0; + while (true) + { + if (disabledChecks.get((() @trusted => cast(string) check)(), 0) > 0) + return true; + + auto dot = check.lastIndexOf('.'); + if (dot == -1) + break; + check = check[0 .. dot]; + } + return false; } // automatic pop when returned value goes out of scope @@ -236,6 +246,7 @@ unittest const s3 = " nolint ( abc , efg ) "; const s4 = "nolint(dscanner.style.abc_efg-ijh)"; const s5 = "OtherUda(abc)"; + const s6 = "nolint(dscanner)"; assert(NoLintFactory.fromString(s1).get.containsCheck("abc")); @@ -250,6 +261,10 @@ unittest assert(NoLintFactory.fromString(s5).isNull); + assert(NoLintFactory.fromString(s6).get.containsCheck("dscanner")); + assert(!NoLintFactory.fromString(s6).get.containsCheck("dscanner2")); + assert(NoLintFactory.fromString(s6).get.containsCheck("dscanner.foo")); + import std.stdio : stderr, writeln; (() @trusted => stderr.writeln("Unittest for NoLint passed."))();