diff --git a/README.md b/README.md index 624ed2a..c34311b 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,11 @@ dscanner -S source/ dscanner --report source/ ``` +The `--report` switch includes all information, plus cheap to compute autofixes +that are already resolved ahead of time, as well as the names for the autofixes +that need to be resolved using the `--resolveMessage` switch like described +below. + You can also specify custom formats using `-f` / `--errorFormat`, where there are also built-in formats for GitHub Actions: @@ -101,7 +106,7 @@ dscanner -S -f github source/ dscanner -S -f '{filepath}({line}:{column})[{type}]: {message}' source/ ``` -To collect automatic issue fixes for a given location use +To resolve automatic issue fixes for a given location use ```sh # collecting automatic issue fixes diff --git a/src/dscanner/reports.d b/src/dscanner/reports.d index a54bac3..bb05859 100644 --- a/src/dscanner/reports.d +++ b/src/dscanner/reports.d @@ -55,6 +55,9 @@ class DScannerJsonReporter private static JSONValue toJson(Issue issue) { + import std.sumtype : match; + import dscanner.analysis.base : AutoFix; + // dfmt off JSONValue js = JSONValue([ "key": JSONValue(issue.message.key), @@ -80,6 +83,27 @@ class DScannerJsonReporter "message": JSONValue(a.message), ]) ).array + ), + "autofixes": JSONValue( + issue.message.autofixes.map!(a => + JSONValue([ + "name": JSONValue(a.name), + "replacements": a.replacements.match!( + (const AutoFix.CodeReplacement[] replacements) => JSONValue( + replacements.map!(r => JSONValue([ + "range": JSONValue([ + JSONValue(r.range[0]), + JSONValue(r.range[1]) + ]), + "newText": JSONValue(r.newText) + ])).array + ), + (const AutoFix.ResolveContext context) => JSONValue( + "resolvable" + ) + ) + ]) + ).array ) ]); // dfmt on diff --git a/tests/it/source_autofix.report.json b/tests/it/source_autofix.report.json index 11d08f4..eadc653 100644 --- a/tests/it/source_autofix.report.json +++ b/tests/it/source_autofix.report.json @@ -15,7 +15,45 @@ "message": "Zero-parameter '@property' function should be marked 'const', 'inout', or 'immutable'.", "name": "function_attribute_check", "supplemental": [], - "type": "warn" + "type": "warn", + "autofixes": [ + { + "name": "Mark function `const`", + "replacements": [ + { + "newText": " const", + "range": [ + 24, + 24 + ] + } + ] + }, + { + "name": "Mark function `inout`", + "replacements": [ + { + "newText": " inout", + "range": [ + 24, + 24 + ] + } + ] + }, + { + "name": "Mark function `immutable`", + "replacements": [ + { + "newText": " immutable", + "range": [ + 24, + 24 + ] + } + ] + } + ] } ], "lineOfCodeCount": 0,