gofmt2

command module
v0.0.0-...-9fd3f59 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 15, 2017 License: BSD-3-Clause Imports: 19 Imported by: 0

README

gofmt2

strict version of gofmt improved and idempotent

Desc

Gofmt formats Go programs. This is improved version.

Features

  • remove empty lines between import specs in block (-import_whitespaces enabled by default)
  • join all import blocks (-join_imports)
  • fix lines
  • show ast (-ast)

Code style changes to original gofmt

func always separated by an empty line if its not sequential block of one-liners:

func a() {}
func b() {}
                <-- added
func c() {
    //
}
                <-- added
func d() {}

empty blocks are not allowed on multiple lines:

func a() {

} -> func a() {}

func b() {
} -> func b() {}

for {
} -> for {}

switch {
} -> switch {}

no empty lines are allowed before closing right bracket and after opening left bracket:

func a() int {
                <-- would be deleted
    if {
                <-- would be deleted
        fmt.Print(1)
                <-- would be deleted
    }

    return 1
                <-- would be deleted
}

by default imports in a single block are concatenated.

Usage:


	gofmt [flags] [path ...]

The flags are:
	-d
		Do not print reformatted sources to standard output.
		If a file's formatting is different than gofmt's, print diffs
		to standard output.
	-e
		Print all (including spurious) errors.
	-l
		Do not print reformatted sources to standard output.
		If a file's formatting is different from gofmt's, print its name
		to standard output.
	-r rule
		Apply the rewrite rule to the source before reformatting.
	-s
		Try to simplify code (after applying the rewrite rule, if any).
	-w
		Do not print reformatted sources to standard output.
		If a file's formatting is different from gofmt's, overwrite it
		with gofmt's version. If an error occurred during overwriting,
		the original file is restored from an automatic backup.
	-import_whitespaces
		Remove empty lines in import blocks (default true).
	-join_imports
		Join imports blocks (default false).
	-ast
		Print AST.

TODO

  • rewrite expressions in which {rvalue ? lvalue} -> {lvalue ? rvalue}
  • do not allow comments in form //*, ***, /**
  • surround operators with spaces
  • remove unnec tabs for comments

Documentation

Overview

Gofmt formats Go programs. It uses tabs (width = 8) for indentation and blanks for alignment.

Without an explicit path, it processes the standard input. Given a file, it operates on that file; given a directory, it operates on all .go files in that directory, recursively. (Files starting with a period are ignored.) By default, gofmt prints the reformatted sources to standard output.

Usage:

gofmt [flags] [path ...]

The flags are:

-d
	Do not print reformatted sources to standard output.
	If a file's formatting is different than gofmt's, print diffs
	to standard output.
-e
	Print all (including spurious) errors.
-l
	Do not print reformatted sources to standard output.
	If a file's formatting is different from gofmt's, print its name
	to standard output.
-r rule
	Apply the rewrite rule to the source before reformatting.
-s
	Try to simplify code (after applying the rewrite rule, if any).
-w
	Do not print reformatted sources to standard output.
	If a file's formatting is different from gofmt's, overwrite it
	with gofmt's version. If an error occurred during overwriting,
	the original file is restored from an automatic backup.

Debugging support:

-cpuprofile filename
	Write cpu profile to the specified file.

The rewrite rule specified with the -r flag must be a string of the form:

pattern -> replacement

Both pattern and replacement must be valid Go expressions. In the pattern, single-character lowercase identifiers serve as wildcards matching arbitrary sub-expressions; those expressions will be substituted for the same identifiers in the replacement.

When gofmt reads from standard input, it accepts either a full Go program or a program fragment. A program fragment must be a syntactically valid declaration list, statement list, or expression. When formatting such a fragment, gofmt preserves leading indentation as well as leading and trailing spaces, so that individual sections of a Go program can be formatted by piping them through gofmt.

Examples

To check files for unnecessary parentheses:

gofmt -r '(a) -> a' -l *.go

To remove the parentheses:

gofmt -r '(a) -> a' -w *.go

To convert the package tree from explicit slice upper bounds to implicit ones:

gofmt -r 'α[β:len(α)] -> α[β:]' -w $GOROOT/src

The simplify command

When invoked with -s gofmt will make the following source transformations where possible.

An array, slice, or map composite literal of the form:
	[]T{T{}, T{}}
will be simplified to:
	[]T{{}, {}}

A slice expression of the form:
	s[a:len(s)]
will be simplified to:
	s[a:]

A range of the form:
	for x, _ = range v {...}
will be simplified to:
	for x = range v {...}

A range of the form:
	for _ = range v {...}
will be simplified to:
	for range v {...}

This may result in changes that are incompatible with earlier versions of Go.

Notes

Bugs

  • The implementation of -r is a bit slow.

  • If -w fails, the restored original file may not have some of the

    original file attributes.
    

Directories

Path Synopsis
Package printer implements printing of AST nodes.
Package printer implements printing of AST nodes.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL