Skip to content

ichiban/cyclomatic

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cyclomatic

Go cyclomatic complexity command and analysis.Analyzer.

It is important to keep your functions simple and error-free. cyclomatic lets you know when your functions get too complex and error-prone.

As a command

First, install cyclomatic command via go get.

$ go get github.com/ichiban/cyclomatic/cmd/cyclomatic

Then, run cyclomatic command at your package directory.

$ cyclomatic ./...
/Users/ichiban/src/example.com/package/foo.go:100:1: cyclomatic complexity of example.com/package.Foo exceeded limit 13 > 10
/Users/ichiban/src/example.com/package/foo.go:200:1: cyclomatic complexity of example.com/package.Bar exceeded limit 22 > 10

Also, you can relax the limit with -limit flag.

$ cyclomatic -limit 15 ./...
/Users/ichiban/src/example.com/package/foo.go:200:1: cyclomatic complexity of example.com/package.Bar exceeded limit 22 > 15

As an analysis.Analyzer

First, install the package via go get.

$ go get github.com/ichiban/cyclomatic

Then, include cyclomatic.Analyzer in your checker.

package main

import (
	"golang.org/x/tools/go/analysis"
	"golang.org/x/tools/go/analysis/multichecker"
	"golang.org/x/tools/go/analysis/passes/nilfunc"
	"golang.org/x/tools/go/analysis/passes/printf"
	"golang.org/x/tools/go/analysis/passes/shift"

	"github.com/ichiban/cyclomatic"
)

func main() {
	multichecker.Main(
		// other analyzers of your choice
		nilfunc.Analyzer,
		printf.Analyzer,
		shift.Analyzer,

		cyclomatic.Analyzer,
	)
}

Definition of complexity

For each function definition:

  • The base complexity is 1
  • When we see if or for, increment the complexity
  • When we see && or ||, increment the complexity
  • When we see switch or select, increase the complexity by the number of values listed after cases

License

This project is licensed under the MIT License - see the LICENSE.md file for details

Acknowledgments

This package is based on these packages but slightly differs on how to count complexity:

Releases

No releases published

Packages

No packages published

Languages