1// Copyright 2014 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
5// The gorename command performs precise type-safe renaming of
6// identifiers in Go source code.
7//
8// Run with -help for usage information, or view the Usage constant in
9// package golang.org/x/tools/refactor/rename, which contains most of
10// the implementation.
11//
12package main // import "golang.org/x/tools/cmd/gorename"
13
14import (
15	"flag"
16	"fmt"
17	"go/build"
18	"log"
19	"os"
20
21	"golang.org/x/tools/go/buildutil"
22	"golang.org/x/tools/refactor/rename"
23)
24
25var (
26	offsetFlag = flag.String("offset", "", "file and byte offset of identifier to be renamed, e.g. 'file.go:#123'.  For use by editors.")
27	fromFlag   = flag.String("from", "", "identifier to be renamed; see -help for formats")
28	toFlag     = flag.String("to", "", "new name for identifier")
29	helpFlag   = flag.Bool("help", false, "show usage message")
30)
31
32func init() {
33	flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc)
34	flag.BoolVar(&rename.Force, "force", false, "proceed, even if conflicts were reported")
35	flag.BoolVar(&rename.Verbose, "v", false, "print verbose information")
36	flag.BoolVar(&rename.Diff, "d", false, "display diffs instead of rewriting files")
37	flag.StringVar(&rename.DiffCmd, "diffcmd", "diff", "diff command invoked when using -d")
38}
39
40func main() {
41	log.SetPrefix("gorename: ")
42	log.SetFlags(0)
43	flag.Parse()
44	if len(flag.Args()) > 0 {
45		log.Fatal("surplus arguments")
46	}
47
48	if *helpFlag || (*offsetFlag == "" && *fromFlag == "" && *toFlag == "") {
49		fmt.Println(rename.Usage)
50		return
51	}
52
53	if err := rename.Main(&build.Default, *offsetFlag, *fromFlag, *toFlag); err != nil {
54		if err != rename.ConflictError {
55			log.Fatal(err)
56		}
57		os.Exit(1)
58	}
59}
60