Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add copyloopvar linter #4382

Merged
merged 7 commits into from
Feb 15, 2024
Merged

Conversation

karamaru-alpha
Copy link
Contributor

@karamaru-alpha karamaru-alpha commented Feb 13, 2024

I'd like to add https://github.com/karamaru-alpha/copyloopvar.
This linter detects places where loop variables are copied.

For Go 1.21(set GOEXPERIMENT=loopvar) and Go 1.22~, it is unnecessary to copy loop variables because these variables have per-iteration scope instead of per-loop scope.

cf. Fixing For Loops in Go 1.22

For Go 1.22, we plan to change for loops to make these variables have per-iteration scope instead of per-loop scope.

Go 1.21 includes a preview of the scoping change. If you compile your code with GOEXPERIMENT=loopvar set in your environment, then the new semantics are applied to all loops.

@ldez
Copy link
Member

ldez commented Feb 13, 2024

I don't understand why you created a new PR instead of updating the old one #4182

@ldez
Copy link
Member

ldez commented Feb 13, 2024

In order for a pull request adding a linter to be reviewed, the linter and the PR must follow some requirements.

  • The CLA must be signed

Pull Request Description

  • It must have a link to the linter repository.
  • It must provide a short description of the linter.

Linter

  • It must not be a duplicate of another linter or a rule of a linter. (the team will help to verify that)
  • It must have a valid license (AGPL is not allowed) and the file must contain the required information by the license, ex: author, year, etc.
  • The linter repository must have a CI and tests.
  • It must use go/analysis.
  • It must have a valid tag, ex: v1.0.0, v0.1.0.
  • It must not contain init().
  • It must not contain panic().
  • It must not contain log.fatal(), os.exit(), or similar.
  • It must not modify the AST.
  • It must not have false positives/negatives. (the team will help to verify that)
  • It must have tests inside golangci-lint.

The Linter Tests Inside Golangci-lint

  • They must have at least one std lib import.
  • They must work with T=<name of the linter test file>.go make test_linters. (the team will help to verify that)

.golangci.reference.yml

  • The linter must be added to the list of available linters (alphabetical case-insensitive order).
    • enable and disable options
  • If the linter has a configuration, the exhaustive configuration of the linter must be added (alphabetical case-insensitive order)
    • The values must be different from the default ones.
    • The default values must be defined in a comment.
    • The option must have a short description.

Others Requirements

  • The files (tests and linter) inside golangci-lint must have the same name as the linter.
  • The .golangci.yml of golangci-lint itself must not be edited and the linter must not be added to this file.
  • The linters must be sorted in the alphabetical order (case-insensitive) in the Manager.GetAllSupportedLinterConfigs(...) and .golangci.reference.yml.
  • The load mode (WithLoadMode(...)):
    • if the linter doesn't use types: goanalysis.LoadModeSyntax
    • goanalysis.LoadModeTypesInfo required WithLoadForGoAnalysis() in the Manager.GetAllSupportedLinterConfigs(...)
  • The version in WithSince(...) must be the next minor version (v1.X.0) of golangci-lint.
  • WithURL() must contain the URL of the repository.

Recommendations

  • The linter should not use SSA. (SSA can be a problem with generics)
  • The linter repository should have a readme and linting.
  • The linter should be published as a binary. (useful to diagnose bug origins)

The golangci-lint team will edit this comment to check the boxes before and during the review.

The code review will start after the completion of those checkboxes (except for the specific items that the team will help to verify).

If the author of the PR is a member of the golangci-lint team, he should not edit this message.

This checklist does not imply that we will accept the linter.

@ldez ldez added linter: new Support new linter blocked Need's direct action from maintainer labels Feb 13, 2024
@ldez ldez changed the title feat: copyloopvar linter feat: add copyloopvar linter Feb 13, 2024
@karamaru-alpha
Copy link
Contributor Author

karamaru-alpha commented Feb 13, 2024

Thank you for your swift response.

I opened a new PR because I let the before PR sit for a long time.
Sorry for the confusion.

@ldez ldez added feedback required Requires additional feedback and removed blocked Need's direct action from maintainer labels Feb 13, 2024
@ldez
Copy link
Member

ldez commented Feb 13, 2024

I also don't understand why you created a new repo instead of renaming the old one.

I think you should archive the old repo:

@karamaru-alpha
Copy link
Contributor Author

I archived the old one.
I'm sorry for the trouble.

@ldez
Copy link
Member

ldez commented Feb 14, 2024

I opened a PR karamaru-alpha/copyloopvar#1 and you seem to not see it.
After the 2 PRs and 2 repositories, I'm starting to worry about the maintenance of your linter.

You should look at your GitHub notifications and maybe your emails because we will have a problem if someone reports an issue or opens a PR on your repository.

I trying to help you, and I will help you, but I cannot do it well if you don't watch your repository.

pkg/lint/lintersdb/manager.go Outdated Show resolved Hide resolved
@karamaru-alpha
Copy link
Contributor Author

karamaru-alpha commented Feb 14, 2024

@ldez
I have just applied your changes.
I'm sorry for making you worry.
Thank you so much for the review and contribution!!!

@karamaru-alpha karamaru-alpha requested a review from ldez February 14, 2024 05:12
@ldez ldez removed the feedback required Requires additional feedback label Feb 14, 2024
Copy link
Member

@ldez ldez left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@ldez ldez added the blocked Need's direct action from maintainer label Feb 15, 2024
Signed-off-by: karamaru-alpha <mrnk3078@gmail.com>
Signed-off-by: karamaru-alpha <mrnk3078@gmail.com>
Signed-off-by: karamaru-alpha <mrnk3078@gmail.com>
Signed-off-by: karamaru-alpha <mrnk3078@gmail.com>
Signed-off-by: karamaru-alpha <mrnk3078@gmail.com>
Signed-off-by: karamaru-alpha <mrnk3078@gmail.com>
@ldez
Copy link
Member

ldez commented Feb 15, 2024

I made a suggestion to improve the report message: karamaru-alpha/copyloopvar#2

Before:

It's unnecessary to copy the loop variable "a"

After:

The copy of the 'for' variable "a" can be deleted (Go 1.22+)

@ldez ldez added feedback required Requires additional feedback and removed blocked Need's direct action from maintainer labels Feb 15, 2024
@karamaru-alpha
Copy link
Contributor Author

karamaru-alpha commented Feb 15, 2024

@ldez
Thanks for the suggestion!!!
I accepted/reflected the suggestion.
Could you check the diff?
upgrade: copyloopvar

go run ./cmd/golangci-lint/ run --no-config --disable-all --enable=copyloopvar ./test/testdata/copyloopvar.go
$ go run ./cmd/golangci-lint/ run --no-config --disable-all --enable=copyloopvar ./test/testdata/copyloopvar.go

test/testdata/copyloopvar.go:10:3: The copy of the 'for' variable "i" can be deleted (Go 1.22+) (copyloopvar)
		i := i // want `The copy of the 'for' variable "i" can be deleted \(Go 1\.22\+\)`
		^
test/testdata/copyloopvar.go:14:3: The copy of the 'for' variable "v" can be deleted (Go 1.22+) (copyloopvar)
		_v := v // want `The copy of the 'for' variable "v" can be deleted \(Go 1\.22\+\)`
		^
test/testdata/copyloopvar.go:28:3: The copy of the 'for' variable "i" can be deleted (Go 1.22+) (copyloopvar)
		i := i // want `The copy of the 'for' variable "i" can be deleted \(Go 1\.22\+\)`

@ldez ldez removed the feedback required Requires additional feedback label Feb 15, 2024
@ldez
Copy link
Member

ldez commented Feb 15, 2024

FYI to run the test of your linter inside golangci-lint:

T=copyloopvar.go make test_linters

https://golangci-lint.run/contributing/new-linters/#how-to-add-a-public-linter-to-golangci-lint

@karamaru-alpha
Copy link
Contributor Author

karamaru-alpha commented Feb 15, 2024

Thanks for letting me know!
I have already checked this 🎉

T=copyloopvar.go make test_linters
$ T=copyloopvar.go make test_linters

GL_TEST_RUN=1 go test -v ./test -count 1 -run TestSourcesFromTestdata/copyloopvar.go
=== RUN   TestSourcesFromTestdata
    linters_test.go:21: testdata/*.go
=== RUN   TestSourcesFromTestdata/copyloopvar.go
=== PAUSE TestSourcesFromTestdata/copyloopvar.go
=== CONT  TestSourcesFromTestdata/copyloopvar.go
level=info msg="[test] ran [/path/to/golangci-lint/golangci-lint run --internal-cmd-test --no-config --allow-parallel-runners --disable-all --out-format=json --max-same-issues=100 -Ecopyloopvar copyloopvar.go] in 632.952208ms"
level=info msg="[test] ran [/path/to/golangci-lint/golangci-lint run --internal-cmd-test --no-config --allow-parallel-runners --disable-all --out-format=json --max-same-issues=100 -Etypecheck -Ecopyloopvar copyloopvar.go] in 189.990917ms"
--- PASS: TestSourcesFromTestdata (0.32s)
    --- PASS: TestSourcesFromTestdata/copyloopvar.go (0.82s)
=== RUN   TestSourcesFromTestdataSubDir
--- PASS: TestSourcesFromTestdataSubDir (0.00s)
PASS
ok  	github.com/golangci/golangci-lint/test	1.606s

@ldez
Copy link
Member

ldez commented Feb 15, 2024

It was just advice for you, our CI runs all tests 😉

@ldez ldez merged commit 2417da1 into golangci:master Feb 15, 2024
12 checks passed
Antonboom pushed a commit to Antonboom/golangci-lint that referenced this pull request Mar 3, 2024
@ldez ldez added this to the next milestone Mar 4, 2024
@ldez ldez added the enhancement New feature or improvement label Apr 22, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or improvement linter: new Support new linter
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants