plenary.nvim icon indicating copy to clipboard operation
plenary.nvim copied to clipboard

[Feat] `selene` linter support

Open AlejandroSuero opened this issue 1 year ago • 0 comments

Motivation

I have been using selene in my projects lately and I think is a more strict linter in some cases, showing more errors or warnings to catch what luacheck do not.

Example config

In the root project.

selene.toml

std="neovim"

exclude = [
  "lua/plenary/profile/lua_profiler.lua",
  "lua/plenary/profile/memory_profiler.lua",
  "lua/plenary/profile/p.lua", # token `goto` detected as `parse_error`
  "lua/plenary/async_lib/*.lua",
]

[rules]
global_usage = "warn"
deprecated = "warn" # If change for `allow` it will rely in `lua_ls` diagnostics alone
multiple_statements = "warn"
incorrect_standard_library_use = "allow" # This is for cases like `string.format`, `package.config`, etc.
mixed_table = "allow"
unused_variable = "warn"
undefined_variable = "warn"

neovim.yml

---
base: lua51

globals:
  _:
    any: true
  a:
    any: true
  jit:
    any: true
  bit:
    any: true
  vim:
    any: true
  assert:
    args:
      - type: bool
      - type: string
        required: false
  after_each:
    args:
      - type: function
  before_each:
    args:
      - type: function
  describe:
    args:
      - type: string
      - type: function
  it:
    args:
      - type: string
      - type: function

With these two files in the root of the project, selene --display-style quiet lua/plenary --allow-warnings results in the following.

lua/plenary/async/api.lua:4:22: warning[unused_variable]: t is defined, but never used
lua/plenary/bit.lua:136:21: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:176:22: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:179:22: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:182:22: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:226:28: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:227:28: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:228:28: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:252:27: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:269:27: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/async/tests.lua:14:3: warning[undefined_variable]: `pending` is not defined
lua/plenary/busted.lua:5:26: warning[unused_variable]: element is defined, but never used
lua/plenary/busted.lua:13:19: error[mismatched_arg_count]: this function takes 1 argument but 2 arguments were supplied
lua/plenary/busted.lua:74:41: warning[shadowing]: shadowing variable `msg`
lua/plenary/busted.lua:201:30: warning[unused_variable]: func is defined, but never used
lua/plenary/busted.lua:211:1: warning[unscoped_variables]: `pending` is not declared locally, and will be available in every scope
lua/plenary/busted.lua:211:1: warning[unused_variable]: pending is defined, but never used
lua/plenary/busted.lua:214:1: warning[unscoped_variables]: `clear` is not declared locally, and will be available in every scope
lua/plenary/busted.lua:214:1: warning[unused_variable]: clear is defined, but never used
lua/plenary/profile.lua:16:24: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/run.lua:5:55: warning[unused_variable]: opts is defined, but never used
Results:
1 errors
20 warnings
0 parse errors

https://github.com/nvim-lua/plenary.nvim/blob/08e301982b9a057110ede7a735dd1b5285eb341f/lua/plenary/busted.lua#L1-L18

[!note] The error shown is because in lua/plenary/busted.lua we are using the function dirname with 1 argument.

But in the line 13, dirname(debug.getinfo(1, "Sl").source, ":h") is using 2. Unlike in line 18, dirname(info.source) is just using one as the declaration for local dirname = function(p) indicates.

If we fix that error, dirname(debug.getinfo(1, "Sl").source, ":h") -> dirname(debug.getinfo(1, "Sl").source). The command for selene with the --allow-warnings flag will result in a success exit code when linting.

Integrations

For the CI process it will be easy.

  • Extending the Makefile to include:
    • make lint-selene: selene --display-style quiet lua/plenary --allow-warnings
  • Adding a selene job to workflows:
  selene:
    name: Selene
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout sources
        uses: actions/checkout@v2

      - name: Run selene
        uses: NTBBloodbath/[email protected]
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          args: --display-style quiet lua/plenary --allow-warnings

[!note] More about selene action here

AlejandroSuero avatar May 09 '24 22:05 AlejandroSuero