Line length linter

Related tags

Date and Time lll
Overview

Build Status Coverage Godoc license Go Report Card

lll

Line length linter, used to enforce line length in files. Support for only checking go files.

Installation

$ go get github.com/walle/lll/...

Usage

usage: lll [--maxlength MAXLENGTH] [--tabwidth TABWIDTH] [--goonly] [--skiplist SKIPLIST] [--vendor] [--files] [--exclude EXCLUDE] [INPUT [INPUT ...]]

positional arguments:
  input

options:
  --maxlength MAXLENGTH, -l MAXLENGTH
                         max line length to check for [default: 80]
  --tabwidth TABWIDTH, -w TABWIDTH
                         tab width in spaces [default: 1]
  --goonly, -g           only check .go files
  --skiplist SKIPLIST, -s SKIPLIST
                         list of dirs to skip [default: [.git vendor]]
  --vendor               check files in vendor directory
  --files                read file names from stdin one at each line
  --exclude EXCLUDE, -e EXCLUDE
                         exclude lines that matches this regex
  --help, -h             display this help and exit

Example usage to check only go files for lines more than 100 characters. Excluding lines that contain the words TODO or FIXME. lll -l 100 -g -e "TODO|FIXME" path/to/myproject.

You can also define the flags using environment variables, eg. MAXLENGTH=100 GOONLY=true lll path/to/my/project.

Testing

Use the go test tool.

$ go test -cover

Contributing

All contributions are welcome! See CONTRIBUTING for more info.

License

The code is under the MIT license. See LICENSE for more information.

Comments
  • Unable to successfully install lll under Golang 1.5 within Travis CI

    Unable to successfully install lll under Golang 1.5 within Travis CI

    I'm trying to get a PR I've put up to successfully get thru Travis for Go 1.5: https://travis-ci.org/antonlindstrom/pgstore/jobs/151870208

    It appears this package isn't installing properly. I'm not clear whether this is an issue with your package in some way, or the gometalinter package which is installing it. Could you give some direction wrt that please?

    Thank you!

    opened by wchrisjohnson 6
  • Add tabwidth argument to lll

    Add tabwidth argument to lll

    The tabwidth argument to lll makes it possible to configure how many characters a tab should be counted as. This is useful for reporting long lines which are indented.

    The default value is 1, meaning legacy behavior is kept. By setting the tabwidth, it's easy to get warnings about other tab width settings, such as 4 and 8.

    opened by perpet 3
  • Fixed a crash case and added an exclude optional parameter

    Fixed a crash case and added an exclude optional parameter

    -Fixed a crash (panic) case where the files in arguments do not exist. Instead, a clean error is back-propagated now -Added an exclude optional argument to be able to skip temporary lines (e.g., TODO)

    opened by dmoklaf 3
  • Line reporting off-by-one

    Line reporting off-by-one

    Running this on a piece of code:

    $ lll -g -l 100 main_test.go
    
    main_test.go:194: line is 104 characters
    main_test.go:211: line is 123 characters
    main_test.go:215: line is 149 characters
    main_test.go:216: line is 149 characters
    main_test.go:217: line is 149 characters
    main_test.go:219: line is 117 characters
    main_test.go:243: line is 155 characters
    main_test.go:256: line is 128 characters
    

    Running the same, but now excluding anything starting with func:

    $ lll -e func -g -l 100 main_test.go
    main_test.go:210: line is 123 characters
    main_test.go:214: line is 149 characters
    main_test.go:215: line is 149 characters
    main_test.go:216: line is 149 characters
    main_test.go:218: line is 117 characters
    main_test.go:242: line is 155 characters
    main_test.go:255: line is 128 characters
    

    The first report (line 194) is now properly skipped, but all other lines now have an off-by-one issue, where previously line 211 was reported to have 123 characters (which is correct), but now the report says that line is on line 210, which is incorrect.

    opened by JeanMertz 1
  • Allow excluding imports from lll

    Allow excluding imports from lll

    We have some long imports which exceed our lll length configuration.

    We'd like to disable lll from anything inside import ( XYZ ) as there's not really much we can do about these import lengths.

    Is there any way this could be added as a configuration?

    Thanks!

    opened by OscarVanL 0
  • Ignore go generate directives

    Ignore go generate directives

    Hello!

    We now have to do this, which is not very beautiful

    //nolint:lll
    //go:generate mockgen -source=$GOFILE --build_flags=-mod=mod -destination mocks/mocks.go -package eventsubscriptionmocks . IAvailability,IMarketsConfig,ILPClient
    
    opened by Antonboom 1
  • URLs are also reported as too long

    URLs are also reported as too long

    I find this annoying, but apparently if you have a really long link, and it's the only thing in the line, it is still being reported. I often put in comments links to other projects as a reference e.g.

    // https://github.com/walle/lll/blob/4438bccd245f7e87a5a69023625f01e7035c05c0/utils.go#L15
    

    nolint:lll is also not respected in comments

    opened by arvenil 1
  • lll should not complain about long strings

    lll should not complain about long strings

    One of, if not the most popular style guide in the world is the Airbnb JavaScript Style Guide, which represents best-practice across a lot of the JavaScript and TypeScript ecosystem.

    In the style guide, it mentions:

    6.2 Strings that cause the line to go over 100 characters should not be written across multiple lines using string concatenation.

    Why? Broken strings are painful to work with and make code less searchable.

    // bad
    const errorMessage = 'This is a super long error that was thrown because \
    of Batman. When you stop to think about how Batman had anything to do \
    with this, you would get nowhere \
    fast.';
    
    // bad
    const errorMessage = 'This is a super long error that was thrown because ' +
      'of Batman. When you stop to think about how Batman had anything to do ' +
      'with this, you would get nowhere fast.';
    
    // good
    const errorMessage = 'This is a super long error that was thrown because of Batman. When you stop to think about how Batman had anything to do with this, you would get nowhere fast.';
    

    This policy seems sensible. With the "bad" code example above, grepping through a project for "thrown because of Batman" would return 0 results.

    One other problem with using string concatenation is that realignment is tedious when you have to remove a sentence. And it introduces unnecessary Git noise. e.g.

    msg := ""Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " +
        "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud " +
        "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure " +
        "dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur."
    

    -->

    // We remove the second sentence, but now the entire code block has to be readjusted
    msg := ""Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " +
        "incididunt ut labore et dolore magna aliqua. Duis aute irure dolor in reprehenderit in " +
        "voluptate velit esse cillum dolore eu fugiat nulla pariatur."
    

    In JavaScript/TypeScript land, the most popular linter is eslint, which is similar to lll in that it has a max-len rule. It has an ignoreStrings flag which is set to true by default - a sensible default.

    The implementation for this is located here: https://github.com/eslint/eslint/blob/master/lib/rules/max-len.js#L314-L315 As you can see, it is extremely simple.

    In Golang land, I think the practice of ignoring strings should also apply, for precisely the same reasons. I was curious to see if other big Go projects were breaking up long strings, so I took a look at Kubernetes, which is probably the biggest. I was only able to find one instance of concatenated strings. Instead, most code is written like like this.

    Similar to eslint, is it possible to add an ignoreStrings flag to lll? Currently, I have gotten so fed up with adding //nolint: lll everywhere that I have stopped using the linter, but it is a great tool and I would love to be able to use it again in the future.

    opened by Zamiell 2
  • Add a new flag to control line-length of comment lines separately.

    Add a new flag to control line-length of comment lines separately.

    This allows users to have a longer line-length limit for code than for natural-language text.

    One example is a project that wants "most" code to fit in 80 columns, but will allow the occassional long line. The best way to implement this in lll right now is to have a longer line limit (say, 100 columns) with an understanding the code-reviewers will make sure most lines are not over 80 columns. But we still want all comment lines to fit within 80 columns, since there's no good reason for them not to. This new flag allows for that.

    opened by csilvers 10
Owner
Fredrik Wallgren
Fredrik Wallgren
Encode and Decode Message Length Indicators for TCP/IP socket based protocols

SimpleMLI A Message Length Indicator Encoder/Decoder Message Length Indicators (MLI) are commonly used in communications over raw TCP/IP sockets. This

American Express 24 Nov 24, 2022
Summary Pacbio reads length for golang

Usage: tgsum [-bam bamName] [-sample sample] [-output outputDir] [-threads threa

null 1 Dec 29, 2021
Generates a random alphanumeric string of a given length.

randstring randstring.Create () is fast and has minimal memory allocation. It returns a random alphanumeric string of a given length. Install go get g

null 0 Jan 7, 2022
Length-preserving encryption algorithm

hctr2 Length-preserving encryption algorithm https://eprint.iacr.org/2021/1441.pdf Security Disclosure This project uses full disclosure. If you find

Eric Lagergren 2 Nov 15, 2022
The most opinionated Go source code linter for code audit.

go-critic Highly extensible Go source code linter providing checks currently missing from other linters. There is never too much static code analysis.

null 1.5k Jan 6, 2023
[mirror] This is a linter for Go source code.

Golint is a linter for Go source code. Installation Golint requires a supported release of Go. go get -u golang.org/x/lint/golint To find out where g

Go 4k Dec 23, 2022
Staticcheck - The advanced Go linter

The advanced Go linter Staticcheck is a state of the art linter for the Go programming language. Using static analysis, it finds bugs and performance

Dominik Honnef 5.1k Jan 1, 2023
Linter for errors.Is and errors.As

erris erris is a program for checking that errors are compared or type asserted using go1.13 errors.Is and errors.As functions. Install go get -u gith

Roman Budnikov 48 Nov 27, 2022
Small Clojure interpreter, linter and formatter.

Joker is a small Clojure interpreter, linter and formatter written in Go. Installation On macOS, the easiest way to install Joker is via Homebrew: bre

Roman Bataev 1.5k Dec 30, 2022
A Go linter to check that errors from external packages are wrapped

Wrapcheck A simple Go linter to check that errors from external packages are wrapped during return to help identify the error source during debugging.

Tom Arrell 204 Dec 27, 2022
Prometheus rule linter

pint pint is a Prometheus rule linter. Usage There are two modes it works in: CI PR linting Ad-hoc linting of a selected files or directories Pull Req

Cloudflare 502 Jan 2, 2023
A linter that handles struct tags.

Tagliatelle A linter that handles struct tags. Supported string casing: camel pascal kebab snake goCamel Respects Go's common initialisms (e.g. HttpRe

Ludovic Fernandez 20 Dec 15, 2022
falco is VCL parser and linter optimized for Fastly.

falco falco is VCL parser and linter optimized for Fastly. Disclaimer This is a VCL parser, but dedicated to Fastly's VCL (version 2.x), so we don't c

Yoshiaki Sugimoto 62 Dec 7, 2022
Go linter to check the struct literal to use field name

Structfield Find struct literals using non-labeled fields. The structfield analysis reports the usage of struct literal using non-labeled fields more

Nuruddin Ashr 3 Aug 23, 2021
a simple golang SSA viewer tool use for code analysis or make a linter

ssaviewer A simple golang SSA viewer tool use for code analysis or make a linter ssa.html generate code modify from src/cmd/compile/internal/ssa/html.

null 7 May 17, 2022
Go linter that warns about number of arguments in functions.

argslen linter Argslen is a linter that checks for long list of argument in functions. The default limit is 5 (maxArguments) and skip the test files (

Federico Guerinoni 6 Sep 17, 2022
The Golang linter that checks that there is no simultaneous return of `nil` error and an invalid value.

nilnil Checks that there is no simultaneous return of nil error and an invalid value. Installation & usage $ go install github.com/Antonboom/nilnil@la

Anton Telyshev 13 Dec 14, 2022
app-services-go-linter plugin analyze source tree of Go files and validates the availability of i18n strings in *.toml files

app-services-go-linter app-services-go-linter plugin analyze source tree of Go files and validates the availability of i18n strings in *.toml files. A

Red Hat Developer 2 Nov 29, 2021
Go linter which checks for dangerous unicode character sequences

bidichk - checks for dangerous unicode character sequences bidichk finds dangerous unicode character sequences in Go source files. Considered dangerou

Lucas Bremgartner 27 Oct 5, 2022
Go linter that checks types that are json encoded - reports unsupported types and unnecessary error checks

Checks types passed to the json encoding functions. Reports unsupported types and reports occations, where the check for the returned error can be omited.

Lucas Bremgartner 28 Oct 7, 2022