blob: 31e2029fb2909d3fd3a77edd1f3c5a5b8b8f4809 [file] [log] [blame]
Robert Findleyb15dac22022-08-30 14:40:12 -04001// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package cmd
6
7import (
8 "context"
9 "errors"
10 "flag"
11 "fmt"
12
13 "golang.org/x/tools/gopls/internal/lsp/protocol"
Alan Donovan26a95e62022-10-07 10:40:32 -040014 "golang.org/x/tools/gopls/internal/span"
Robert Findleyb15dac22022-08-30 14:40:12 -040015 "golang.org/x/tools/internal/tool"
16)
17
18// prepareRename implements the prepare_rename verb for gopls.
19type prepareRename struct {
20 app *Application
21}
22
23func (r *prepareRename) Name() string { return "prepare_rename" }
24func (r *prepareRename) Parent() string { return r.app.Name() }
25func (r *prepareRename) Usage() string { return "<position>" }
26func (r *prepareRename) ShortHelp() string { return "test validity of a rename operation at location" }
27func (r *prepareRename) DetailedHelp(f *flag.FlagSet) {
28 fmt.Fprint(f.Output(), `
29Example:
30
31 $ # 1-indexed location (:line:column or :#offset) of the target identifier
32 $ gopls prepare_rename helper/helper.go:8:6
33 $ gopls prepare_rename helper/helper.go:#53
34`)
35 printFlagDefaults(f)
36}
37
38// ErrInvalidRenamePosition is returned when prepareRename is run at a position that
39// is not a candidate for renaming.
40var ErrInvalidRenamePosition = errors.New("request is not valid at the given position")
41
42func (r *prepareRename) Run(ctx context.Context, args ...string) error {
43 if len(args) != 1 {
44 return tool.CommandLineErrorf("prepare_rename expects 1 argument (file)")
45 }
46
Rob Findley1c5ccad2023-04-18 13:48:38 -040047 conn, err := r.app.connect(ctx, nil)
Robert Findleyb15dac22022-08-30 14:40:12 -040048 if err != nil {
49 return err
50 }
51 defer conn.terminate(ctx)
52
53 from := span.Parse(args[0])
Alan Donovan54c806f2023-04-07 15:04:09 -040054 file, err := conn.openFile(ctx, from.URI())
55 if err != nil {
56 return err
Robert Findleyb15dac22022-08-30 14:40:12 -040057 }
Alan Donovana24944e2023-01-10 15:52:16 -050058 loc, err := file.mapper.SpanLocation(from)
Robert Findleyb15dac22022-08-30 14:40:12 -040059 if err != nil {
60 return err
61 }
62 p := protocol.PrepareRenameParams{
Alan Donovand093a132023-01-26 16:14:35 -050063 TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
Robert Findleyb15dac22022-08-30 14:40:12 -040064 }
65 result, err := conn.PrepareRename(ctx, &p)
66 if err != nil {
67 return fmt.Errorf("prepare_rename failed: %w", err)
68 }
69 if result == nil {
70 return ErrInvalidRenamePosition
71 }
72
Alan Donovanb7989342023-01-10 21:55:45 -050073 s, err := file.mapper.RangeSpan(result.Range)
Robert Findleyb15dac22022-08-30 14:40:12 -040074 if err != nil {
75 return err
76 }
77
78 fmt.Println(s)
79 return nil
80}