Skip to content

Quick fix 1002 suggests use of tagged switch statement inappropriately #1613

Closed
@seh

Description

@seh

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions