From 2025ede9f902f6ab724720368f6c5bb3f0fde325 Mon Sep 17 00:00:00 2001 From: yincong Date: Tue, 24 Sep 2024 10:18:52 +0800 Subject: [PATCH 1/3] fix rename command line fail --- gopls/internal/server/rename.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gopls/internal/server/rename.go b/gopls/internal/server/rename.go index 93b2ac6f9c4..c98af90bb56 100644 --- a/gopls/internal/server/rename.go +++ b/gopls/internal/server/rename.go @@ -52,9 +52,10 @@ func (s *server) Rename(ctx context.Context, params *protocol.RenameParams) (*pr // Update the last component of the file's enclosing directory. oldDir := filepath.Dir(fh.URI().Path()) newDir := filepath.Join(filepath.Dir(oldDir), params.NewName) + fileName := filepath.Base(fh.URI().Path()) change := protocol.DocumentChangeRename( - protocol.URIFromPath(oldDir), - protocol.URIFromPath(newDir)) + protocol.URIFromPath(fmt.Sprintf("%s/%s", oldDir, fileName)), + protocol.URIFromPath(fmt.Sprintf("%s/%s", newDir, fileName))) changes = append(changes, change) } From 5e05fb06af237de816220cfd6d9aad8bf37336f7 Mon Sep 17 00:00:00 2001 From: yincong Date: Wed, 25 Sep 2024 17:48:35 +0800 Subject: [PATCH 2/3] reasonable modification --- gopls/internal/cmd/cmd.go | 44 +++++++++++++++++++++++++++------ gopls/internal/server/rename.go | 5 ++-- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/gopls/internal/cmd/cmd.go b/gopls/internal/cmd/cmd.go index 9ec5b630d6c..89889fbf09c 100644 --- a/gopls/internal/cmd/cmd.go +++ b/gopls/internal/cmd/cmd.go @@ -563,15 +563,21 @@ func (cli *cmdClient) applyWorkspaceEdit(wsedit *protocol.WorkspaceEdit) error { case c.RenameFile != nil: // Analyze as creation + deletion. (NB: loses file mode.) - f := cli.openFile(c.RenameFile.OldURI) - if f.err != nil { - return f.err - } - if err := create(c.RenameFile.NewURI, f.mapper.Content); err != nil { + fs, err := cli.openFiles(c.RenameFile.OldURI) + if err != nil { return err } - if err := delete(f.mapper.URI, f.mapper.Content); err != nil { - return err + for _, f := range fs { + if f.err != nil { + return f.err + } + fileName := protocol.DocumentURI(filepath.Join(string(c.RenameFile.NewURI), filepath.Base(f.uri.Path()))) + if err := create(fileName, f.mapper.Content); err != nil { + return err + } + if err := delete(f.mapper.URI, f.mapper.Content); err != nil { + return err + } } case c.DeleteFile != nil: @@ -788,6 +794,30 @@ func (c *cmdClient) openFile(uri protocol.DocumentURI) *cmdFile { return c.getFile(uri) } +func (c *cmdClient) openFiles(uri protocol.DocumentURI) ([]*cmdFile, error) { + c.filesMu.Lock() + defer c.filesMu.Unlock() + s, err := os.Stat(uri.Path()) + if err != nil { + return nil, err + } + + if s.IsDir() { + entries, err := os.ReadDir(uri.Path()) + if err != nil { + return nil, err + } + files := make([]*cmdFile, len(entries)) + for i, e := range entries { + files[i] = c.getFile(protocol.DocumentURI(filepath.Join(string(uri), e.Name()))) + } + + return files, nil + } + + return []*cmdFile{c.getFile(uri)}, nil +} + // TODO(adonovan): provide convenience helpers to: // - map a (URI, protocol.Range) to a MappedRange; // - parse a command-line argument to a MappedRange. diff --git a/gopls/internal/server/rename.go b/gopls/internal/server/rename.go index c98af90bb56..93b2ac6f9c4 100644 --- a/gopls/internal/server/rename.go +++ b/gopls/internal/server/rename.go @@ -52,10 +52,9 @@ func (s *server) Rename(ctx context.Context, params *protocol.RenameParams) (*pr // Update the last component of the file's enclosing directory. oldDir := filepath.Dir(fh.URI().Path()) newDir := filepath.Join(filepath.Dir(oldDir), params.NewName) - fileName := filepath.Base(fh.URI().Path()) change := protocol.DocumentChangeRename( - protocol.URIFromPath(fmt.Sprintf("%s/%s", oldDir, fileName)), - protocol.URIFromPath(fmt.Sprintf("%s/%s", newDir, fileName))) + protocol.URIFromPath(oldDir), + protocol.URIFromPath(newDir)) changes = append(changes, change) } From 82a2ef27fb415917d16c79f741f1fb8d11f62e4e Mon Sep 17 00:00:00 2001 From: yincong Date: Wed, 25 Sep 2024 18:32:37 +0800 Subject: [PATCH 3/3] bugfix --- gopls/internal/cmd/cmd.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gopls/internal/cmd/cmd.go b/gopls/internal/cmd/cmd.go index 89889fbf09c..5576beb59f5 100644 --- a/gopls/internal/cmd/cmd.go +++ b/gopls/internal/cmd/cmd.go @@ -807,9 +807,11 @@ func (c *cmdClient) openFiles(uri protocol.DocumentURI) ([]*cmdFile, error) { if err != nil { return nil, err } - files := make([]*cmdFile, len(entries)) - for i, e := range entries { - files[i] = c.getFile(protocol.DocumentURI(filepath.Join(string(uri), e.Name()))) + files := make([]*cmdFile, 0) + for _, e := range entries { + if !e.IsDir() { + files = append(files, c.getFile(protocol.DocumentURI(filepath.Join(string(uri), e.Name())))) + } } return files, nil