| package source |
| |
| import ( |
| "context" |
| |
| "golang.org/x/tools/go/analysis" |
| "golang.org/x/tools/internal/lsp/protocol" |
| "golang.org/x/tools/internal/span" |
| ) |
| |
| type SuggestedFix struct { |
| Title string |
| Edits map[span.URI][]protocol.TextEdit |
| } |
| |
| func suggestedFixes(ctx context.Context, view View, pkg Package, diag analysis.Diagnostic) ([]SuggestedFix, error) { |
| var fixes []SuggestedFix |
| for _, fix := range diag.SuggestedFixes { |
| edits := make(map[span.URI][]protocol.TextEdit) |
| for _, e := range fix.TextEdits { |
| posn := view.Session().Cache().FileSet().Position(e.Pos) |
| uri := span.FileURI(posn.Filename) |
| ph, _, err := pkg.FindFile(ctx, uri) |
| if err != nil { |
| return nil, err |
| } |
| _, m, _, err := ph.Cached(ctx) |
| if err != nil { |
| return nil, err |
| } |
| mrng, err := posToRange(ctx, view, m, e.Pos, e.End) |
| if err != nil { |
| return nil, err |
| } |
| rng, err := mrng.Range() |
| if err != nil { |
| return nil, err |
| } |
| edits[uri] = append(edits[uri], protocol.TextEdit{ |
| Range: rng, |
| NewText: string(e.NewText), |
| }) |
| } |
| fixes = append(fixes, SuggestedFix{ |
| Title: fix.Message, |
| Edits: edits, |
| }) |
| } |
| return fixes, nil |
| } |
| |
| // onlyDeletions returns true if all of the suggested fixes are deletions. |
| func onlyDeletions(fixes []SuggestedFix) bool { |
| for _, fix := range fixes { |
| for _, edits := range fix.Edits { |
| for _, edit := range edits { |
| if edit.NewText != "" { |
| return false |
| } |
| if protocol.ComparePosition(edit.Range.Start, edit.Range.End) == 0 { |
| return false |
| } |
| } |
| } |
| } |
| return true |
| } |