| // Copyright 2022 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| package misc |
| |
| import ( |
| "testing" |
| |
| . "golang.org/x/tools/gopls/internal/lsp/regtest" |
| "golang.org/x/tools/gopls/internal/lsp/tests/compare" |
| |
| "golang.org/x/tools/gopls/internal/lsp/protocol" |
| ) |
| |
| func TestExtractFunction(t *testing.T) { |
| const files = ` |
| -- go.mod -- |
| module mod.com |
| |
| go 1.12 |
| -- main.go -- |
| package main |
| |
| func Foo() int { |
| a := 5 |
| return a |
| } |
| ` |
| Run(t, files, func(t *testing.T, env *Env) { |
| env.OpenFile("main.go") |
| |
| start := env.RegexpSearch("main.go", "a := 5").ToProtocolPosition() |
| end := env.RegexpSearch("main.go", "return a").ToProtocolPosition() |
| |
| actions, err := env.Editor.CodeAction(env.Ctx, "main.go", &protocol.Range{Start: start, End: end}, nil) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| // Find the extract function code action. |
| var extractFunc *protocol.CodeAction |
| for _, action := range actions { |
| if action.Kind == protocol.RefactorExtract && action.Title == "Extract function" { |
| extractFunc = &action |
| break |
| } |
| } |
| if extractFunc == nil { |
| t.Fatal("could not find extract function action") |
| } |
| |
| env.ApplyCodeAction(*extractFunc) |
| want := `package main |
| |
| func Foo() int { |
| a := newFunction() |
| return a |
| } |
| |
| func newFunction() int { |
| a := 5 |
| return a |
| } |
| ` |
| if got := env.Editor.BufferText("main.go"); got != want { |
| t.Fatalf("TestFillStruct failed:\n%s", compare.Text(want, got)) |
| } |
| }) |
| } |