mirror of
https://github.com/golang/go
synced 2024-11-19 01:34:40 -07:00
4b1f3b6b16
This makes the format code use the AST that is already cached on the file to do the formatting. It also moves the core format code into the source directory. Change-Id: Iaa79169708e92525cce326ea094ab98144fe1011 Reviewed-on: https://go-review.googlesource.com/c/148198 Run-TryBot: Ian Cottrell <iancottrell@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
40 lines
1.1 KiB
Go
40 lines
1.1 KiB
Go
// Copyright 2018 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 source
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"go/format"
|
|
)
|
|
|
|
// Format formats a document with a given range.
|
|
func Format(ctx context.Context, f *File, rng Range) ([]TextEdit, error) {
|
|
fAST, err := f.GetAST()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// TODO(rstambler): use astutil.PathEnclosingInterval to
|
|
// find the largest ast.Node n contained within start:end, and format the
|
|
// region n.Pos-n.End instead.
|
|
|
|
// format.Node changes slightly from one release to another, so the version
|
|
// of Go used to build the LSP server will determine how it formats code.
|
|
// This should be acceptable for all users, who likely be prompted to rebuild
|
|
// the LSP server on each Go release.
|
|
buf := &bytes.Buffer{}
|
|
if err := format.Node(buf, f.view.Config.Fset, fAST); err != nil {
|
|
return nil, err
|
|
}
|
|
// TODO(rstambler): Compute text edits instead of replacing whole file.
|
|
return []TextEdit{
|
|
{
|
|
Range: rng,
|
|
NewText: buf.String(),
|
|
},
|
|
}, nil
|
|
}
|