diff --git a/src/dscanner/analysis/lambda_return_check.d b/src/dscanner/analysis/lambda_return_check.d index 11c18d5..32f8468 100644 --- a/src/dscanner/analysis/lambda_return_check.d +++ b/src/dscanner/analysis/lambda_return_check.d @@ -8,7 +8,6 @@ module dscanner.analysis.lambda_return_check; import dscanner.analysis.base; import dmd.tokens : Token, TOK; -// TODO: Fix AutoFix extern (C++) class LambdaReturnCheck(AST) : BaseAnalyzerDmd { alias visit = BaseAnalyzerDmd.visit; @@ -52,15 +51,45 @@ extern (C++) class LambdaReturnCheck(AST) : BaseAnalyzerDmd if (lambda.fbody.isReturnStatement() is null) return; - auto tokenRange = tokens.filter!(t => t.loc.fileOffset > lambda.loc.fileOffset) - .filter!(t => t.loc.fileOffset < lambda.endloc.fileOffset) - .find!(t => t.value == TOK.goesTo); + auto lambdaRange = tokens.filter!(t => t.loc.fileOffset > lambda.loc.fileOffset) + .filter!(t => t.loc.fileOffset < lambda.endloc.fileOffset); + auto tokenRange = lambdaRange.find!(t => t.value == TOK.goesTo); if (!tokenRange.canFind!(t => t.value == TOK.leftCurly)) return; if (!tokenRange.canFind!(t => t.value == TOK.leftParenthesis)) - addErrorMessage(cast(ulong) lambda.loc.linnum, cast(ulong) lambda.loc.charnum, KEY, MSG); + { + auto start = tokenRange.front.loc.fileOffset; + AutoFix fix0; + auto firstParam = (*(lambda.getParameterList().parameters))[0]; + + if (hasParensOnParams((*(lambda.getParameterList().parameters))[0])) + fix0 = AutoFix.replacement(start, start + 3, "", "Remove arrow (use function body)"); + else + fix0 = AutoFix.insertionAt(firstParam.loc.fileOffset, "(") + .concat(AutoFix.insertionAt(start - 1, ")")) + .concat(AutoFix.replacement(start, start + 3, "", "Remove arrow (use function body)")); + + addErrorMessage( + cast(ulong) lambda.loc.linnum, cast(ulong) lambda.loc.charnum, KEY, MSG, + [fix0, AutoFix.insertionAt(start + 2, " ()")] + ); + } + } + + private bool hasParensOnParams(AST.Parameter param) + { + int idx; + + foreach (token; tokens) + { + if (token.loc.fileOffset == param.loc.fileOffset) + break; + idx++; + } + + return tokens[idx - 1].value == TOK.leftParenthesis && tokens[idx - 2].value == TOK.leftParenthesis; } } @@ -88,7 +117,6 @@ unittest } }c.format(msg, msg, msg), sac); - /+ TODO: Fix AutoFix assertAutoFix(q{ void main() { @@ -111,7 +139,7 @@ unittest pragma(msg, typeof((a) { return a; })); // fix:0 pragma(msg, typeof((a) => () { return a; })); // fix:1 } - }c, sac);+/ + }c, sac, true); stderr.writeln("Unittest for LambdaReturnCheck passed."); }