Closed
Description
Consider the following code, which I admit could use strings.Cut
instead:
// Variable "c" is of type string.
// We wish to split it on an embedded space character, if any.
switch i := strings.IndexByte(c, ' '); {
case i == -1:
return c, "", nil
case i == 0:
return "", "", errors.New("value starts with a space character")
default:
return c[:i], c[i+1:], nil
}
My LSP implementation—gopls—reports the following:
could use tagged switch on i [default]
It then offers a quick fix: "Replace with tagged switch". If I accept that suggestion, though, the resulting code is invalid, since I lose access to the "i" variable used in the return statement in the default case.
// Note the extra "i" here.
switch i i := strings.IndexByte(c, ' '); {
case -1:
return c, "", nil
case 0:
return "", "", errors.New("value starts with a space character")
default:
// We can no longer use "i" here.
return c[:i], c[i+1:], nil
}
Note also the strange insertion of an extra "i" in the initial simple statement.
It seems that there are three things wrong here:
- The recommendation is unjustified, as we can't eliminate the "i" variable, given its use in the return statement.
- The applied fix changes the first two case clauses, but leaves the default case clause with dangling references to a nonexistent variable.
- The applied fix mangles the initial simple statement.
I don't know whether any of these are to blame on Emacs's lsp-mode that's making use of gopls.