# https://golangci-lint.run/usage/configuration/
# https://github.com/golangci/golangci-lint/blob/master/pkg/config/linters_settings.go
---
run:
  timeout: 1m
  issues-exit-code: 1
  tests: true
  skip-dirs: []
  skip-dirs-use-default: true
  skip-files: []
  allow-parallel-runners: true

output:
  format: colored-line-number
  print-issued-lines: true
  print-linter-name: true
  uniq-by-line: true
  sort-results: true

linters-settings:
  depguard:
    list-type: blacklist
    include-go-root: false
  dupl:
    threshold: 150
  errcheck:
    check-type-assertions: true
    check-blank: true
    # exclude: .errcheckignore
  errorlint:
    errorf: true
    asserts: true
    comparison: true
  funlen:
    lines: 100
    statements: 60
  gocognit:
    min-complexity: 30
  goconst:
    min-len: 3
    min-occurrences: 3
  gocritic:
    enabled-tags:
      - diagnostic
      - experimental
      - opinionated
      - performance
      - style
    disabled-checks:
      - commentedOutCode
      - redundantSprint
      - whyNoLint
    settings:
      hugeParam:
        sizeThreshold: 80
      rangeExprCopy:
        sizeThreshold: 512
      rangeValCopy:
        sizeThreshold: 128
  gocyclo:
    min-complexity: 30
  godot:
    scope: declarations
    capital: false
  gofmt:
    simplify: true
  gofumpt:
    extra-rules: true
  goheader:
    values:
      const:
        AUTHOR: Go Language Server
      regexp:
        YEAR: '20\d\d'
    template: |-
      SPDX-FileCopyrightText: {{ YEAR }} The {{ AUTHOR }} Authors
      SPDX-License-Identifier: BSD-3-Clause
  goimports:
    local-prefixes: go.lsp.dev/protocol
  gosimple:
    go: 1.16
  govet:
    enable-all: true
    check-shadowing: true
    disable:
      - fieldalignment
  importas:
    alias: []
    no-unaliased: true
  lll:
    line-length: 120
    tab-width: 1
  misspell:
    locale: US
    ignore-words:
      - cancelled
      - cancelling
  nakedret:
    max-func-lines: 30
  nestif:
    min-complexity: 4
  prealloc:
    simple: true
    range-loops: true
    for-loops: true
  staticcheck:
    go: 1.16
  testpackage:
    skip-regexp: '.*(export)_test\.go'
  unparam:
    check-exported: true
    algo: cha
  unused:
    go: 1.16
  whitespace:
    multi-if: true
    multi-func: true

linters:
  fast: false
  disabled:
    - exhaustivestruct         # Checks if all struct's fields are initialized
    - forbidigo                # Forbids identifiers
    - forcetypeassert          # finds forced type assertions
    - gci                      # Gci control golang package import order and make it always deterministic.
    - gochecknoglobals         # check that no global variables exist
    - gochecknoinits           # Checks that no init functions are present in Go code
    - goconst                  # Finds repeated strings that could be replaced by a constant
    - godox                    # Tool for detection of FIXME, TODO and other comment keywords
    - goerr113                 # Golang linter to check the errors handling expressions
    - golint                   # Golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes
    - gomnd                    # An analyzer to detect magic numbers.
    - gomoddirectives          # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod.
    - gomodguard               # Allow and block list linter for direct Go module dependencies.
    - interfacer               # Linter that suggests narrower interface types
    - lll                      # Reports long lines
    - maligned                 # Tool to detect Go structs that would take less memory if their fields were sorted
    - promlinter               # Check Prometheus metrics naming via promlint
    - scopelint                # Scopelint checks for unpinned variables in go programs
    - sqlclosecheck            # Checks that sql.Rows and sql.Stmt are closed.
    - testpackage              # TODO(zchee): enable: # linter that makes you use a separate _test package
    - tparallel                # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes
    - wrapcheck                # TODO(zchee): enable: # Checks that errors returned from external packages are wrapped
    - wsl                      # Whitespace Linter
  enable:
    - asciicheck               # Simple linter to check that your code does not contain non-ASCII identifiers
    - bodyclose                # checks whether HTTP response body is closed successfully
    - cyclop                   # checks function and package cyclomatic complexity
    - deadcode                 # Finds unused code
    - depguard                 # Go linter that checks if package imports are in a list of acceptable packages
    - dogsled                  # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f())
    - dupl                     # Tool for code clone detection
    - durationcheck            # check for two durations multiplied together
    - errcheck                 # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases
    - errorlint                # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13.
    - exhaustive               # check exhaustiveness of enum switch statements
    - exportloopref            # checks for pointers to enclosing loop variables
    - funlen                   # Tool for detection of long functions
    - gocognit                 # Computes and checks the cognitive complexity of functions
    - gocritic                 # Provides many diagnostics that check for bugs, performance and style issues.
    - gocyclo                  # Computes and checks the cyclomatic complexity of functions
    - godot                    # Check if comments end in a period
    - gofmt                    # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification
    - gofumpt                  # Gofumpt checks whether code was gofumpt-ed.
    - goheader                 #  Checks is file header matches to pattern
    - goimports                # Goimports does everything that gofmt does. Additionally it checks unused imports
    - goprintffuncname         # Checks that printf-like functions are named with `f` at the end
    - gosec                    # Inspects source code for security problems
    - gosimple                 # Linter for Go source code that specializes in simplifying a code
    - govet                    # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string
    - ifshort                  # Checks that your code uses short syntax for if-statements whenever possible
    - importas                 # Enforces consistent import aliases
    - ineffassign              # Detects when assignments to existing variables are not used
    - makezero                 # Finds slice declarations with non-zero initial length
    - misspell                 # Finds commonly misspelled English words in comments
    - nakedret                 # Finds naked returns in functions greater than a specified function length
    - nestif                   # Reports deeply nested if statements
    - nilerr                   # Finds the code that returns nil even if it checks that the error is not nil.
    - nlreturn                 # nlreturn checks for a new line before return and branch statements to increase code clarity
    - noctx                    # noctx finds sending http request without context.Context
    - nolintlint               # Reports ill-formed or insufficient nolint directives
    - paralleltest             # paralleltest detects missing usage of t.Parallel() method in your Go test
    - prealloc                 # Finds slice declarations that could potentially be preallocated
    - predeclared              # find code that shadows one of Go's predeclared identifiers
    - revive                   # Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint.
    - rowserrcheck             # checks whether Err of rows is checked successfully
    - staticcheck              # Staticcheck is a go vet on steroids, applying a ton of static analysis checks
    - structcheck              # Finds unused struct fields
    - stylecheck               # Stylecheck is a replacement for golint
    - tagliatelle              # Checks the struct tags.
    - thelper                  # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers
    - typecheck                # Like the front-end of a Go compiler, parses and type-checks Go code
    - unconvert                # Remove unnecessary type conversions
    - unparam                  # Reports unused function parameters
    - unused                   # Checks Go code for unused constants, variables, functions and types
    - varcheck                 # Finds unused global variables and constants
    - wastedassign             # wastedassign finds wasted assignment statements.
    - whitespace               # Tool for detection of leading and trailing whitespace

issues:
  max-issues-per-linter: 0
  max-same-issues: 0
  exclude-use-default: true
  exclude-rules:
    - path: _test\.go
      linters:
        - cyclop
        - dupl
        - errcheck
        - funlen
        - gocognit
        - goconst
        - gocritic
        - gocyclo
        - gosec
        - thelper
        - wrapcheck
    - path: "(.*)?_example_test.go"
      linters:
        - gocritic
    # Exclude shadow checking on the variable named err
    - text: "shadow: declaration of \"(err|ok)\""
      linters:
        - govet
    # false positive
    - path: language.go
      text: "deprecatedComment: the proper format is `Deprecated: <text>`"
    # async
    - path: handler.go
      text: "Error return value of `conn.Notify` is not checked"
      linters:
        - errcheck
    - path: log.go
      text: "Error return value of `s.log.Write` is not checked"
      linters:
        - errcheck
    - path: deprecated.go
      linters:
        - lll
    - path: "(client|server)_json.go"
      linters:
        - nlreturn
