Add a --fix option for 2 types of single-line assignment in if statements

        if ((foo = bar(...)) < BAZ) {
expands to:
        foo = bar(..);
        if (foo < BAZ) {
and
        if ((foo = bar(...)) {
expands to:
        foo = bar(...);
        if (foo) {

if statements with assignments spanning multiple lines are
not converted with the --fix option.

if statements with additional logic are also not converted.

e.g.:   if ((foo = bar(...)) & BAZ == BAZ) {

Signed-off-by: Joe Perches <[email protected]>
---

Maybe coccinelle could do more complete conversions, but this
seems to work OK for most uses.

 scripts/checkpatch.pl | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index b06093777fd8..396dc8721d4e 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -5052,8 +5052,30 @@ sub process {
                        my ($s, $c) = ($stat, $cond);
 
                        if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
-                               ERROR("ASSIGN_IN_IF",
-                                     "do not use assignment in if condition\n" 
. $herecurr);
+                               if (ERROR("ASSIGN_IN_IF",
+                                         "do not use assignment in if 
condition\n" . $herecurr) &&
+                                   $fix && $perl_version_ok) {
+                                       if ($rawline =~ 
/^\+(\s+)if\s*\(\s*(\!)?\s*\(\s*(($Lval)\s*=\s*$LvalOrFunc)\s*\)\s*(?:($Compare)\s*($FuncArg))?\s*\)\s*(\{)?\s*$/)
 {
+                                               my $space = $1;
+                                               my $not = $2;
+                                               my $statement = $3;
+                                               my $assigned = $4;
+                                               my $test = $8;
+                                               my $against = $9;
+                                               my $brace = $15;
+                                               fix_delete_line($fixlinenr, 
$rawline);
+                                               fix_insert_line($fixlinenr, 
"$space$statement;");
+                                               my $newline = "${space}if (";
+                                               $newline .= '!' if 
defined($not);
+                                               $newline .= '(' if (defined 
$not && defined($test) && defined($against));
+                                               $newline .= "$assigned";
+                                               $newline .= " $test $against" 
if (defined($test) && defined($against));
+                                               $newline .= ')' if (defined 
$not && defined($test) && defined($against));
+                                               $newline .= ')';
+                                               $newline .= " {" if 
(defined($brace));
+                                               fix_insert_line($fixlinenr + 1, 
$newline);
+                                       }
+                               }
                        }
 
                        # Find out what is on the end of the line after the



Reply via email to