diff --git a/pkg/golinters/unused.go b/pkg/golinters/unused.go index 5f6d8371..ac5a90d4 100644 --- a/pkg/golinters/unused.go +++ b/pkg/golinters/unused.go @@ -33,7 +33,7 @@ func NewUnused() *goanalysis.Linter { for _, ur := range u.Result() { p := u.ProblemObject(lintCtx.Packages[0].Fset, ur) pkg := typesToPkg[ur.Pkg()] - issues = append(issues, goanalysis.NewIssue(&result.Issue{ //nolint:scopelint + i := &result.Issue{ FromLinter: name, Text: p.Message, Pos: p.Pos, @@ -42,11 +42,16 @@ func NewUnused() *goanalysis.Linter { From: p.Pos.Line, To: p.End.Line, }, - Replacement: &result.Replacement{ + } + // See https://github.com/golangci/golangci-lint/issues/1048 + // If range is invalid, this will break `--fix` mode. + if i.LineRange.To >= i.LineRange.From { + i.Replacement = &result.Replacement{ // Suggest deleting unused stuff. NeedOnlyDelete: true, - }, - }, nil)) + } + } + issues = append(issues, goanalysis.NewIssue(i, nil)) } return issues }).WithContextSetter(func(lintCtx *linter.Context) { diff --git a/pkg/result/processors/fixer.go b/pkg/result/processors/fixer.go index 3f7abbc8..29313d7f 100644 --- a/pkg/result/processors/fixer.go +++ b/pkg/result/processors/fixer.go @@ -223,6 +223,12 @@ func (f Fixer) writeFixedFile(origFileLines [][]byte, issues []result.Issue, tmp } else { nextIssueIndex++ rng := nextIssue.GetLineRange() + if rng.From > rng.To { + // Maybe better decision is to skip such issues, re-evaluate if regressed. + f.log.Warnf("[fixer]: issue line range is probably invalid, fix can be incorrect (from=%d, to=%d, linter=%s)", + rng.From, rng.To, nextIssue.FromLinter, + ) + } i += rng.To - rng.From if nextIssue.Replacement.NeedOnlyDelete { continue diff --git a/test/testdata/fix/in/unused.go b/test/testdata/fix/in/unused.go new file mode 100644 index 00000000..fa8979c2 --- /dev/null +++ b/test/testdata/fix/in/unused.go @@ -0,0 +1,8 @@ +//args: -Eunused +package p + +type ( + unused struct{} +) + +func X() {} diff --git a/test/testdata/fix/out/unused.go b/test/testdata/fix/out/unused.go new file mode 100644 index 00000000..fa8979c2 --- /dev/null +++ b/test/testdata/fix/out/unused.go @@ -0,0 +1,8 @@ +//args: -Eunused +package p + +type ( + unused struct{} +) + +func X() {}