diff --git a/internal/lsp/source/extract.go b/internal/lsp/source/extract.go index 54170fd521..43b414add9 100644 --- a/internal/lsp/source/extract.go +++ b/internal/lsp/source/extract.go @@ -995,6 +995,16 @@ func CanExtractFunction(fset *token.FileSet, rng span.Range, src []byte, file *a if start == nil || end == nil { return nil, false, false, fmt.Errorf("range does not map to AST nodes") } + // If the region is a blockStmt, use the first and last nodes in the block + // statement. + // { ... } => { ... } + if blockStmt, ok := start.(*ast.BlockStmt); ok { + if len(blockStmt.List) == 0 { + return nil, false, false, fmt.Errorf("range maps to empty block statement") + } + start, end = blockStmt.List[0], blockStmt.List[len(blockStmt.List)-1] + rng.Start, rng.End = start.Pos(), end.End() + } return &fnExtractParams{ tok: tok, path: path, diff --git a/internal/lsp/testdata/extract/extract_function/extract_basic.go b/internal/lsp/testdata/extract/extract_function/extract_basic.go index b5b9efd6c1..5e44de26ff 100644 --- a/internal/lsp/testdata/extract/extract_function/extract_basic.go +++ b/internal/lsp/testdata/extract/extract_function/extract_basic.go @@ -1,7 +1,8 @@ package extract -func _() { +func _() { //@mark(exSt25, "{") a := 1 //@mark(exSt1, "a") _ = 3 + 4 //@mark(exEn1, "4") //@extractfunc(exSt1, exEn1) -} + //@extractfunc(exSt25, exEn25) +} //@mark(exEn25, "}") diff --git a/internal/lsp/testdata/extract/extract_function/extract_basic.go.golden b/internal/lsp/testdata/extract/extract_function/extract_basic.go.golden index ba40ff2cde..18adc4db42 100644 --- a/internal/lsp/testdata/extract/extract_function/extract_basic.go.golden +++ b/internal/lsp/testdata/extract/extract_function/extract_basic.go.golden @@ -1,14 +1,30 @@ --- functionextraction_extract_basic_4_2 -- +-- functionextraction_extract_basic_3_10 -- package extract -func _() { +func _() { //@mark(exSt25, "{") //@mark(exSt1, "a") newFunction() //@mark(exEn1, "4") //@extractfunc(exSt1, exEn1) + //@extractfunc(exSt25, exEn25) } func newFunction() { a := 1 _ = 3 + 4 +} //@mark(exEn25, "}") + +-- functionextraction_extract_basic_4_2 -- +package extract + +func _() { //@mark(exSt25, "{") + //@mark(exSt1, "a") + newFunction() //@mark(exEn1, "4") + //@extractfunc(exSt1, exEn1) + //@extractfunc(exSt25, exEn25) } +func newFunction() { + a := 1 + _ = 3 + 4 +} //@mark(exEn25, "}") + diff --git a/internal/lsp/testdata/summary.txt.golden b/internal/lsp/testdata/summary.txt.golden index 9e6334a4a5..fa1bddfe55 100644 --- a/internal/lsp/testdata/summary.txt.golden +++ b/internal/lsp/testdata/summary.txt.golden @@ -14,7 +14,7 @@ FormatCount = 6 ImportCount = 8 SemanticTokenCount = 3 SuggestedFixCount = 49 -FunctionExtractionCount = 24 +FunctionExtractionCount = 25 MethodExtractionCount = 6 DefinitionsCount = 95 TypeDefinitionsCount = 18 diff --git a/internal/lsp/testdata/summary_go1.18.txt.golden b/internal/lsp/testdata/summary_go1.18.txt.golden index fefd3d2b1b..61ca3b1418 100644 --- a/internal/lsp/testdata/summary_go1.18.txt.golden +++ b/internal/lsp/testdata/summary_go1.18.txt.golden @@ -14,7 +14,7 @@ FormatCount = 6 ImportCount = 8 SemanticTokenCount = 3 SuggestedFixCount = 49 -FunctionExtractionCount = 24 +FunctionExtractionCount = 25 MethodExtractionCount = 6 DefinitionsCount = 99 TypeDefinitionsCount = 18