Skip to content

elliotchance/ghost

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

👻 ghost

Build Status

ghost is a command-line tool for locating overly complex lines of code in Go.

It is designed with the intention that code should strive to be written in a linear, rather than nested way. This makes code easier to understand, highlights duplicate logic and ultimately leads to less bugs.

Installation

go get -u github.com/elliotchance/ghost

Usage

Pass one or multiple Go files:

ghost file1.go file2.go

CLI Options

  • -ignore-tests - Ignore test files.
  • -max-line-complexity - The maximum allowed line complexity. (default 5)
  • -never-fail - Always exit with 0.

Example

The output of ghost (with default options) describes that line 50 is too complex:

jaro.go:50: complexity is 8 (in JaroWinkler)

The line is:

prefixSize = int(math.Min(float64(len(a)), math.Min(float64(prefixSize), float64(len(b)))))

There is nothing logically incorrect with that line, but it is long, difficult to understand and can be tricky to inspect with a debugger.

There are lots of different ways the above code can be rewritten. For me, once I understand what it's really doing I can create the function:

func minInt(values ...int) int {
	sort.Ints(values)

	return values[0]
}

Now it can be simply written as:

prefixSize = minInt(prefixSize, len(a), len(b))

Ignoring Lines

Any comment that contains the string ghost:ignore will cause the next proceeding line to be ignored:

// ghost:ignore
a := lastName[baz() : foo + bar : qux()]

About

👻 Locate and fix overly complex lines of code in Go.

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages