Repository: mgechev/revive
Pull request #1381 (2025-05-26 11:24:59)

docs: use contrib.rocks to make contributors section shorter
Updating contributors is a manual process, see #1076. By using https://contrib.rocks/, we can slightly automate it.

This also fixes the weird displaying of "Contributors" on https://revive.run/docs#contributors:

<img width="500" alt="image" src="https://github.com/user-attachments/assets/67ad301a-01f5-4c6c-90ab-0a78e8605e98" />



Patch:
diff --git a/.golangci.yml b/.golangci.yml
index 30993c5..5892506 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -6,12 +6,15 @@ version: "2"
 linters:
   default: none
   enable:
+    - dupword
     - gocritic
+    - godot
     - govet
     - ineffassign
     - misspell
     - nolintlint
     - revive
+    - thelper
     - staticcheck
     - unused
 
@@ -26,6 +29,8 @@ linters:
       disable:
         - fieldalignment
         - shadow
+    misspell:
+      locale: US
     nolintlint:
       allow-unused: true
       require-explanation: true
diff --git a/README.md b/README.md
index b94bb1a..6b10ba7 100644
--- a/README.md
+++ b/README.md
@@ -74,6 +74,8 @@ If you disable them in the config file, revive will run over 6x faster than goli
   - [Overriding colorization detection](#overriding-colorization-detection)
   - [Who uses Revive](#who-uses-revive)
   - [Contributors](#contributors)
+    - [Maintainers](#maintainers)
+    - [All](#all)
   - [License](#license)
 
 <!-- /TOC -->
@@ -828,81 +830,19 @@ _Open a PR to add your project_.
 
 ## Contributors
 
-[<img alt="mgechev" src="https://avatars.githubusercontent.com/u/455023?v=4&s=117" width="117">](https://github.com/mgechev) |[<img alt="chavacava" src="https://avatars.githubusercontent.com/u/25788468?v=4&s=117" width="117">](https://github.com/chavacava) |[<img alt="denisvmedia" src="https://avatars.githubusercontent.com/u/5462781?v=4&s=117" width="117">](https://github.com/denisvmedia) |[<img alt="mfederowicz" src="https://avatars.githubusercontent.com/u/57678185?v=4&s=117" width="117">](https://github.com/mfederowicz) |[<img alt="xuri" src="https://avatars.githubusercontent.com/u/2809468?v=4&s=117" width="117">](https://github.com/xuri) |[<img alt="alexandear" src="https://avatars.githubusercontent.com/u/3228886?v=4&s=117" width="117">](https://github.com/alexandear) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[mgechev](https://github.com/mgechev) |[chavacava](https://github.com/chavacava) |[denisvmedia](https://github.com/denisvmedia) |[mfederowicz](https://github.com/mfederowicz) |[xuri](https://github.com/xuri) |[alexandear](https://github.com/alexandear) |
+### Maintainers
 
-[<img alt="ldez" src="https://avatars.githubusercontent.com/u/5674651?v=4&s=117" width="117">](https://github.com/ldez) |[<img alt="doniacld" src="https://avatars.githubusercontent.com/u/19799268?v=4&s=117" width="117">](https://github.com/doniacld) |[<img alt="Clivern" src="https://avatars.githubusercontent.com/u/1634427?v=4&s=117" width="117">](https://github.com/Clivern) |[<img alt="morphy2k" src="https://avatars.githubusercontent.com/u/4280578?v=4&s=117" width="117">](https://github.com/morphy2k) |[<img alt="bernhardreisenberger" src="https://avatars.githubusercontent.com/u/5809300?v=4&s=117" width="117">](https://github.com/bernhardreisenberger) |[<img alt="dshemin" src="https://avatars.githubusercontent.com/u/11780307?v=4&s=117" width="117">](https://github.com/dshemin) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[ldez](https://github.com/ldez) |[doniacld](https://github.com/doniacld) |[Clivern](https://github.com/Clivern) |[morphy2k](https://github.com/morphy2k) |[bernhardreisenberger](https://github.com/bernhardreisenberger) |[dshemin](https://github.com/dshemin) |
+[<img alt="mgechev" src="https://avatars.githubusercontent.com/u/455023?v=4&s=100" width="100">](https://github.com/mgechev) |[<img alt="chavacava" src="https://avatars.githubusercontent.com/u/25788468?v=4&s=100" width="100">](https://github.com/chavacava) |[<img alt="denisvmedia" src="https://avatars.githubusercontent.com/u/5462781?v=4&s=100" width="100">](https://github.com/denisvmedia) |[<img alt="alexandear" src="https://avatars.githubusercontent.com/u/3228886?v=4&s=100" width="100">](https://github.com/alexandear) |
+:---: |:---: |:---: |:---: |
+[mgechev](https://github.com/mgechev) |[chavacava](https://github.com/chavacava) |[denisvmedia](https://github.com/denisvmedia) |[alexandear](https://github.com/alexandear) |
 
-[<img alt="butuzov" src="https://avatars.githubusercontent.com/u/651824?v=4&s=117" width="117">](https://github.com/butuzov) |[<img alt="comdiv" src="https://avatars.githubusercontent.com/u/2387862?v=4&s=117" width="117">](https://github.com/comdiv) |[<img alt="heynemann" src="https://avatars.githubusercontent.com/u/60965?v=4&s=117" width="117">](https://github.com/heynemann) |[<img alt="gsamokovarov" src="https://avatars.githubusercontent.com/u/604618?v=4&s=117" width="117">](https://github.com/gsamokovarov) |[<img alt="mdelah" src="https://avatars.githubusercontent.com/u/4904544?v=4&s=117" width="117">](https://github.com/mdelah) |[<img alt="tymonx" src="https://avatars.githubusercontent.com/u/8367378?v=4&s=117" width="117">](https://github.com/tymonx) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[butuzov](https://github.com/butuzov) |[comdiv](https://github.com/comdiv) |[heynemann](https://github.com/heynemann) |[gsamokovarov](https://github.com/gsamokovarov) |[mdelah](https://github.com/mdelah) |[tymonx](https://github.com/tymonx) |
+### All
 
-[<img alt="sina-devel" src="https://avatars.githubusercontent.com/u/61763643?v=4&s=117" width="117">](https://github.com/sina-devel) |[<img alt="rawen17" src="https://avatars.githubusercontent.com/u/36483900?v=4&s=117" width="117">](https://github.com/rawen17) |[<img alt="dominiquelefevre" src="https://avatars.githubusercontent.com/u/54854047?v=4&s=117" width="117">](https://github.com/dominiquelefevre) |[<img alt="git-hulk" src="https://avatars.githubusercontent.com/u/4987594?v=4&s=117" width="117">](https://github.com/git-hulk) |[<img alt="shmsr" src="https://avatars.githubusercontent.com/u/51480165?v=4&s=117" width="117">](https://github.com/shmsr) |[<img alt="ytnsym" src="https://avatars.githubusercontent.com/u/57400690?v=4&s=117" width="117">](https://github.com/ytnsym) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[sina-devel](https://github.com/sina-devel) |[rawen17](https://github.com/rawen17) |[dominiquelefevre](https://github.com/dominiquelefevre) |[git-hulk](https://github.com/git-hulk) |[shmsr](https://github.com/shmsr) |[ytnsym](https://github.com/ytnsym) |
+This project exists thanks to all the people who contribute.
 
-[<img alt="zimmski" src="https://avatars.githubusercontent.com/u/1847950?v=4&s=117" width="117">](https://github.com/zimmski) |[<img alt="mapreal19" src="https://avatars.githubusercontent.com/u/3055997?v=4&s=117" width="117">](https://github.com/mapreal19) |[<img alt="cce" src="https://avatars.githubusercontent.com/u/51567?v=4&s=117" width="117">](https://github.com/cce) |[<img alt="skaji" src="https://avatars.githubusercontent.com/u/1589550?v=4&s=117" width="117">](https://github.com/skaji) |[<img alt="ccoVeille" src="https://avatars.githubusercontent.com/u/3875889?v=4&s=117" width="117">](https://github.com/ccoVeille) |[<img alt="tamird" src="https://avatars.githubusercontent.com/u/1535036?v=4&s=117" width="117">](https://github.com/tamird) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[zimmski](https://github.com/zimmski) |[mapreal19](https://github.com/mapreal19) |[cce](https://github.com/cce) |[skaji](https://github.com/skaji) |[ccoVeille](https://github.com/ccoVeille) |[tamird](https://github.com/tamird) |
-
-[<img alt="markelog" src="https://avatars.githubusercontent.com/u/945528?v=4&s=117" width="117">](https://github.com/markelog) |[<img alt="mihaitodor" src="https://avatars.githubusercontent.com/u/788216?v=4&s=117" width="117">](https://github.com/mihaitodor) |[<img alt="dvejmz" src="https://avatars.githubusercontent.com/u/9487006?v=4&s=117" width="117">](https://github.com/dvejmz) |[<img alt="abeltay" src="https://avatars.githubusercontent.com/u/15604207?v=4&s=117" width="117">](https://github.com/abeltay) |[<img alt="damif94" src="https://avatars.githubusercontent.com/u/29461526?v=4&s=117" width="117">](https://github.com/damif94) |[<img alt="Groxx" src="https://avatars.githubusercontent.com/u/77197?v=4&s=117" width="117">](https://github.com/Groxx) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[markelog](https://github.com/markelog) |[mihaitodor](https://github.com/mihaitodor) |[dvejmz](https://github.com/dvejmz) |[abeltay](https://github.com/abeltay) |[damif94](https://github.com/damif94) |[Groxx](https://github.com/Groxx) |
-
-[<img alt="StephenButtolph" src="https://avatars.githubusercontent.com/u/22109487?v=4&s=117" width="117">](https://github.com/StephenButtolph) |[<img alt="StephenBrown2" src="https://avatars.githubusercontent.com/u/1148665?v=4&s=117" width="117">](https://github.com/StephenBrown2) |[<img alt="lsytj0413" src="https://avatars.githubusercontent.com/u/6871552?v=4&s=117" width="117">](https://github.com/lsytj0413) |[<img alt="qascade" src="https://avatars.githubusercontent.com/u/54154054?v=4&s=117" width="117">](https://github.com/qascade) |[<img alt="ridvansumset" src="https://avatars.githubusercontent.com/u/26631560?v=4&s=117" width="117">](https://github.com/ridvansumset) |[<img alt="rliebz" src="https://avatars.githubusercontent.com/u/5321575?v=4&s=117" width="117">](https://github.com/rliebz) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[StephenButtolph](https://github.com/StephenButtolph) |[StephenBrown2](https://github.com/StephenBrown2) |[lsytj0413](https://github.com/lsytj0413) |[qascade](https://github.com/qascade) |[ridvansumset](https://github.com/ridvansumset) |[rliebz](https://github.com/rliebz) |
-
-[<img alt="rdeusser" src="https://avatars.githubusercontent.com/u/5935071?v=4&s=117" width="117">](https://github.com/rdeusser) |[<img alt="rmarku" src="https://avatars.githubusercontent.com/u/1113370?v=4&s=117" width="117">](https://github.com/rmarku) |[<img alt="rnikoopour" src="https://avatars.githubusercontent.com/u/7692789?v=4&s=117" width="117">](https://github.com/rnikoopour) |[<img alt="rafamadriz" src="https://avatars.githubusercontent.com/u/67771985?v=4&s=117" width="117">](https://github.com/rafamadriz) |[<img alt="paco0x" src="https://avatars.githubusercontent.com/u/6123425?v=4&s=117" width="117">](https://github.com/paco0x) |[<img alt="pa-m" src="https://avatars.githubusercontent.com/u/5503106?v=4&s=117" width="117">](https://github.com/pa-m) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[rdeusser](https://github.com/rdeusser) |[rmarku](https://github.com/rmarku) |[rnikoopour](https://github.com/rnikoopour) |[rafamadriz](https://github.com/rafamadriz) |[paco0x](https://github.com/paco0x) |[pa-m](https://github.com/pa-m) |
-
-[<img alt="cinar" src="https://avatars.githubusercontent.com/u/1754092?v=4&s=117" width="117">](https://github.com/cinar) |[<img alt="natefinch" src="https://avatars.githubusercontent.com/u/3185864?v=4&s=117" width="117">](https://github.com/natefinch) |[<img alt="nunnatsa" src="https://avatars.githubusercontent.com/u/60659093?v=4&s=117" width="117">](https://github.com/nunnatsa) |[<img alt="michalhisim" src="https://avatars.githubusercontent.com/u/764249?v=4&s=117" width="117">](https://github.com/michalhisim) |[<img alt="zeripath" src="https://avatars.githubusercontent.com/u/1824502?v=4&s=117" width="117">](https://github.com/zeripath) |[<img alt="y-yagi" src="https://avatars.githubusercontent.com/u/987638?v=4&s=117" width="117">](https://github.com/y-yagi) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[cinar](https://github.com/cinar) |[natefinch](https://github.com/natefinch) |[nunnatsa](https://github.com/nunnatsa) |[michalhisim](https://github.com/michalhisim) |[zeripath](https://github.com/zeripath) |[y-yagi](https://github.com/y-yagi) |
-
-[<img alt="techknowlogick" src="https://avatars.githubusercontent.com/u/164197?v=4&s=117" width="117">](https://github.com/techknowlogick) |[<img alt="okhowang" src="https://avatars.githubusercontent.com/u/3352585?v=4&s=117" width="117">](https://github.com/okhowang) |[<img alt="meanguy" src="https://avatars.githubusercontent.com/u/78570571?v=4&s=117" width="117">](https://github.com/meanguy) |[<img alt="likyh" src="https://avatars.githubusercontent.com/u/3294100?v=4&s=117" width="117">](https://github.com/likyh) |[<img alt="kerneltravel" src="https://avatars.githubusercontent.com/u/437879?v=4&s=117" width="117">](https://github.com/kerneltravel) |[<img alt="jmckenzieark" src="https://avatars.githubusercontent.com/u/70923399?v=4&s=117" width="117">](https://github.com/jmckenzieark) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[techknowlogick](https://github.com/techknowlogick) |[okhowang](https://github.com/okhowang) |[meanguy](https://github.com/meanguy) |[likyh](https://github.com/likyh) |[kerneltravel](https://github.com/kerneltravel) |[jmckenzieark](https://github.com/jmckenzieark) |
-
-[<img alt="haya14busa" src="https://avatars.githubusercontent.com/u/3797062?v=4&s=117" width="117">](https://github.com/haya14busa) |[<img alt="fregin" src="https://avatars.githubusercontent.com/u/23256240?v=4&s=117" width="117">](https://github.com/fregin) |[<img alt="ydah" src="https://avatars.githubusercontent.com/u/13041216?v=4&s=117" width="117">](https://github.com/ydah) |[<img alt="WillAbides" src="https://avatars.githubusercontent.com/u/233500?v=4&s=117" width="117">](https://github.com/WillAbides) |[<img alt="heyvito" src="https://avatars.githubusercontent.com/u/77198?v=4&s=117" width="117">](https://github.com/heyvito) |[<img alt="VincentBaron" src="https://avatars.githubusercontent.com/u/58427099?v=4&s=117" width="117">](https://github.com/VincentBaron) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[haya14busa](https://github.com/haya14busa) |[fregin](https://github.com/fregin) |[ydah](https://github.com/ydah) |[WillAbides](https://github.com/WillAbides) |[heyvito](https://github.com/heyvito) |[VincentBaron](https://github.com/VincentBaron) |
-
-[<img alt="scop" src="https://avatars.githubusercontent.com/u/109152?v=4&s=117" width="117">](https://github.com/scop) |[<img alt="vkrol" src="https://avatars.githubusercontent.com/u/153412?v=4&s=117" width="117">](https://github.com/vkrol) |[<img alt="KirillSluchaev" src="https://avatars.githubusercontent.com/u/58340009?v=4&s=117" width="117">](https://github.com/KirillSluchaev) |[<img alt="Jarema" src="https://avatars.githubusercontent.com/u/7369771?v=4&s=117" width="117">](https://github.com/Jarema) |[<img alt="tartale" src="https://avatars.githubusercontent.com/u/9323250?v=4&s=117" width="117">](https://github.com/tartale) |[<img alt="tmzane" src="https://avatars.githubusercontent.com/u/73077675?v=4&s=117" width="117">](https://github.com/tmzane) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[scop](https://github.com/scop) |[vkrol](https://github.com/vkrol) |[KirillSluchaev](https://github.com/KirillSluchaev) |[Jarema](https://github.com/Jarema) |[tartale](https://github.com/tartale) |[tmzane](https://github.com/tmzane) |
-
-[<img alt="felipedavid" src="https://avatars.githubusercontent.com/u/75049173?v=4&s=117" width="117">](https://github.com/felipedavid) |[<img alt="euank" src="https://avatars.githubusercontent.com/u/2147649?v=4&s=117" width="117">](https://github.com/euank) |[<img alt="Entuazism" src="https://avatars.githubusercontent.com/u/56657856?v=4&s=117" width="117">](https://github.com/Entuazism) |[<img alt="Juneezee" src="https://avatars.githubusercontent.com/u/20135478?v=4&s=117" width="117">](https://github.com/Juneezee) |[<img alt="echoix" src="https://avatars.githubusercontent.com/u/27212526?v=4&s=117" width="117">](https://github.com/echoix) |[<img alt="EXHades" src="https://avatars.githubusercontent.com/u/22260242?v=4&s=117" width="117">](https://github.com/EXHades) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[felipedavid](https://github.com/felipedavid) |[euank](https://github.com/euank) |[Entuazism](https://github.com/Entuazism) |[Juneezee](https://github.com/Juneezee) |[echoix](https://github.com/echoix) |[EXHades](https://github.com/EXHades) |
-
-[<img alt="petethepig" src="https://avatars.githubusercontent.com/u/662636?v=4&s=117" width="117">](https://github.com/petethepig) |[<img alt="Dirk007" src="https://avatars.githubusercontent.com/u/17194484?v=4&s=117" width="117">](https://github.com/Dirk007) |[<img alt="yangdiangzb" src="https://avatars.githubusercontent.com/u/16643665?v=4&s=117" width="117">](https://github.com/yangdiangzb) |[<img alt="derekperkins" src="https://avatars.githubusercontent.com/u/3588778?v=4&s=117" width="117">](https://github.com/derekperkins) |[<img alt="bboreham" src="https://avatars.githubusercontent.com/u/8125524?v=4&s=117" width="117">](https://github.com/bboreham) |[<img alt="attiss" src="https://avatars.githubusercontent.com/u/23562566?v=4&s=117" width="117">](https://github.com/attiss) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[petethepig](https://github.com/petethepig) |[Dirk007](https://github.com/Dirk007) |[yangdiangzb](https://github.com/yangdiangzb) |[derekperkins](https://github.com/derekperkins) |[bboreham](https://github.com/bboreham) |[attiss](https://github.com/attiss) |
-
-[<img alt="hatamiarash7" src="https://avatars.githubusercontent.com/u/16325641?v=4&s=117" width="117">](https://github.com/hatamiarash7) |[<img alt="Aragur" src="https://avatars.githubusercontent.com/u/11004008?v=4&s=117" width="117">](https://github.com/Aragur) |[<img alt="amincheloh" src="https://avatars.githubusercontent.com/u/1217397?v=4&s=117" width="117">](https://github.com/amincheloh) |[<img alt="kulti" src="https://avatars.githubusercontent.com/u/1286683?v=4&s=117" width="117">](https://github.com/kulti) |[<img alt="Abirdcfly" src="https://avatars.githubusercontent.com/u/5100555?v=4&s=117" width="117">](https://github.com/Abirdcfly) |[<img alt="abhinav" src="https://avatars.githubusercontent.com/u/41730?v=4&s=117" width="117">](https://github.com/abhinav) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[hatamiarash7](https://github.com/hatamiarash7) |[Aragur](https://github.com/Aragur) |[amincheloh](https://github.com/amincheloh) |[kulti](https://github.com/kulti) |[Abirdcfly](https://github.com/Abirdcfly) |[abhinav](https://github.com/abhinav) |
-
-[<img alt="r-ricci" src="https://avatars.githubusercontent.com/u/52817765?v=4&s=117" width="117">](https://github.com/r-ricci) |[<img alt="mmcloughlin" src="https://avatars.githubusercontent.com/u/7133685?v=4&s=117" width="117">](https://github.com/mmcloughlin) |[<img alt="mathieu-aubin" src="https://avatars.githubusercontent.com/u/15820228?v=4&s=117" width="117">](https://github.com/mathieu-aubin) |[<img alt="martinsirbe" src="https://avatars.githubusercontent.com/u/13367583?v=4&s=117" width="117">](https://github.com/martinsirbe) |[<img alt="avorima" src="https://avatars.githubusercontent.com/u/15158349?v=4&s=117" width="117">](https://github.com/avorima) |[<img alt="moukoublen" src="https://avatars.githubusercontent.com/u/1380039?v=4&s=117" width="117">](https://github.com/moukoublen) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[r-ricci](https://github.com/r-ricci) |[mmcloughlin](https://github.com/mmcloughlin) |[mathieu-aubin](https://github.com/mathieu-aubin) |[martinsirbe](https://github.com/martinsirbe) |[avorima](https://github.com/avorima) |[moukoublen](https://github.com/moukoublen) |
-
-[<img alt="very-amused" src="https://avatars.githubusercontent.com/u/44382255?v=4&s=117" width="117">](https://github.com/very-amused) |[<img alt="johnrichardrinehart" src="https://avatars.githubusercontent.com/u/6321578?v=4&s=117" width="117">](https://github.com/johnrichardrinehart) |[<img alt="walles" src="https://avatars.githubusercontent.com/u/158201?v=4&s=117" width="117">](https://github.com/walles) |[<img alt="jefersonf" src="https://avatars.githubusercontent.com/u/3049540?v=4&s=117" width="117">](https://github.com/jefersonf) |[<img alt="jamesmaidment" src="https://avatars.githubusercontent.com/u/2050324?v=4&s=117" width="117">](https://github.com/jamesmaidment) |[<img alt="jalaziz" src="https://avatars.githubusercontent.com/u/247849?v=4&s=117" width="117">](https://github.com/jalaziz) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[very-amused](https://github.com/very-amused) |[johnrichardrinehart](https://github.com/johnrichardrinehart) |[walles](https://github.com/walles) |[jefersonf](https://github.com/jefersonf) |[jamesmaidment](https://github.com/jamesmaidment) |[jalaziz](https://github.com/jalaziz) |
-
-[<img alt="grongor" src="https://avatars.githubusercontent.com/u/972493?v=4&s=117" width="117">](https://github.com/grongor) |[<img alt="tie" src="https://avatars.githubusercontent.com/u/14792994?v=4&s=117" width="117">](https://github.com/tie) |[<img alt="quasilyte" src="https://avatars.githubusercontent.com/u/6286655?v=4&s=117" width="117">](https://github.com/quasilyte) |[<img alt="davidhsingyuchen" src="https://avatars.githubusercontent.com/u/17587061?v=4&s=117" width="117">](https://github.com/davidhsingyuchen) |[<img alt="gfariasalves-ionos" src="https://avatars.githubusercontent.com/u/112630064?v=4&s=117" width="117">](https://github.com/gfariasalves-ionos) |[<img alt="gburanov" src="https://avatars.githubusercontent.com/u/2969603?v=4&s=117" width="117">](https://github.com/gburanov) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[grongor](https://github.com/grongor) |[tie](https://github.com/tie) |[quasilyte](https://github.com/quasilyte) |[davidhsingyuchen](https://github.com/davidhsingyuchen) |[gfariasalves-ionos](https://github.com/gfariasalves-ionos) |[gburanov](https://github.com/gburanov) |
-
-[<img alt="ginglis13" src="https://avatars.githubusercontent.com/u/43075615?v=4&s=117" width="117">](https://github.com/ginglis13) |[<img alt="flesser" src="https://avatars.githubusercontent.com/u/510681?v=4&s=117" width="117">](https://github.com/flesser) |
-:---: |:---: |
-[ginglis13](https://github.com/ginglis13) |[flesser](https://github.com/flesser) |
+<a href="https://github.com/mgechev/revive/graphs/contributors">
+  <img alt="All Contributors" src="https://contrib.rocks/image?repo=mgechev/revive&max=500" />
+</a>
 
 ## License
 
diff --git a/cli/main.go b/cli/main.go
index fd4876f..17f8753 100644
--- a/cli/main.go
+++ b/cli/main.go
@@ -27,7 +27,7 @@ var (
 	commit  = defaultCommit
 	date    = defaultDate
 	builtBy = defaultBuilder
-	// AppFs is used to operations related with user config files
+	// AppFs is used for operations related to user config files.
 	AppFs = afero.NewOsFs()
 )
 
@@ -38,8 +38,8 @@ func fail(err string) {
 
 // RunRevive runs the CLI for revive.
 func RunRevive(extraRules ...revivelib.ExtraRule) {
-	// move parsing flags outside of init() otherwise tests don't works properly
-	// more info: https://github.com/golang/go/issues/46869#issuecomment-865695953
+	// Move parsing flags outside of init(); otherwise, tests don't work properly.
+	// More info: https://github.com/golang/go/issues/46869#issuecomment-865695953
 	initConfig()
 
 	if versionFlag {
@@ -175,7 +175,7 @@ func initConfig() {
 	flag.Parse()
 }
 
-// getVersion returns build info (version, commit, date and builtBy)
+// getVersion returns build info (version, commit, date, and builtBy).
 func getVersion(builtBy, date, commit, version string) string {
 	var buildInfo string
 	if date != defaultDate && builtBy != defaultBuilder {
diff --git a/config/config.go b/config/config.go
index d3e47c3..801a411 100644
--- a/config/config.go
+++ b/config/config.go
@@ -127,7 +127,7 @@ func getFormatters() map[string]lint.Formatter {
 	return result
 }
 
-// GetLintingRules yields the linting rules that must be applied by the linter
+// GetLintingRules yields the linting rules that must be applied by the linter.
 func GetLintingRules(config *lint.Config, extraRules []lint.Rule) ([]lint.Rule, error) {
 	rulesMap := map[string]lint.Rule{}
 	for _, r := range allRules {
@@ -229,7 +229,7 @@ func normalizeConfig(config *lint.Config) {
 
 const defaultConfidence = 0.8
 
-// GetConfig yields the configuration
+// GetConfig yields the configuration.
 func GetConfig(configPath string) (*lint.Config, error) {
 	config := &lint.Config{}
 	switch {
@@ -248,7 +248,7 @@ func GetConfig(configPath string) (*lint.Config, error) {
 	return config, nil
 }
 
-// GetFormatter yields the formatter for lint failures
+// GetFormatter yields the formatter for lint failures.
 func GetFormatter(formatterName string) (lint.Formatter, error) {
 	formatters := getFormatters()
 	if formatterName == "" {
diff --git a/formatter/checkstyle.go b/formatter/checkstyle.go
index 9b91d8e..1fb17d4 100644
--- a/formatter/checkstyle.go
+++ b/formatter/checkstyle.go
@@ -14,7 +14,7 @@ type Checkstyle struct {
 	Metadata lint.FormatterMetadata
 }
 
-// Name returns the name of the formatter
+// Name returns the name of the formatter.
 func (*Checkstyle) Name() string {
 	return "checkstyle"
 }
diff --git a/formatter/default.go b/formatter/default.go
index adb08b4..79f04c4 100644
--- a/formatter/default.go
+++ b/formatter/default.go
@@ -13,7 +13,7 @@ type Default struct {
 	Metadata lint.FormatterMetadata
 }
 
-// Name returns the name of the formatter
+// Name returns the name of the formatter.
 func (*Default) Name() string {
 	return "default"
 }
diff --git a/formatter/friendly.go b/formatter/friendly.go
index 6a16d6f..5b626e1 100644
--- a/formatter/friendly.go
+++ b/formatter/friendly.go
@@ -19,7 +19,7 @@ type Friendly struct {
 	Metadata lint.FormatterMetadata
 }
 
-// Name returns the name of the formatter
+// Name returns the name of the formatter.
 func (*Friendly) Name() string {
 	return "friendly"
 }
diff --git a/formatter/json.go b/formatter/json.go
index 7cace89..c7144e1 100644
--- a/formatter/json.go
+++ b/formatter/json.go
@@ -12,12 +12,12 @@ type JSON struct {
 	Metadata lint.FormatterMetadata
 }
 
-// Name returns the name of the formatter
+// Name returns the name of the formatter.
 func (*JSON) Name() string {
 	return "json"
 }
 
-// jsonObject defines a JSON object of an failure
+// jsonObject defines a JSON object of an failure.
 type jsonObject struct {
 	Severity     lint.Severity
 	lint.Failure `json:",inline"`
diff --git a/formatter/ndjson.go b/formatter/ndjson.go
index 58b35dc..66acff3 100644
--- a/formatter/ndjson.go
+++ b/formatter/ndjson.go
@@ -13,7 +13,7 @@ type NDJSON struct {
 	Metadata lint.FormatterMetadata
 }
 
-// Name returns the name of the formatter
+// Name returns the name of the formatter.
 func (*NDJSON) Name() string {
 	return "ndjson"
 }
diff --git a/formatter/plain.go b/formatter/plain.go
index 3512487..6c77926 100644
--- a/formatter/plain.go
+++ b/formatter/plain.go
@@ -13,7 +13,7 @@ type Plain struct {
 	Metadata lint.FormatterMetadata
 }
 
-// Name returns the name of the formatter
+// Name returns the name of the formatter.
 func (*Plain) Name() string {
 	return "plain"
 }
diff --git a/formatter/sarif.go b/formatter/sarif.go
index 3aa5ddb..158d2c5 100644
--- a/formatter/sarif.go
+++ b/formatter/sarif.go
@@ -15,7 +15,7 @@ type Sarif struct {
 	Metadata lint.FormatterMetadata
 }
 
-// Name returns the name of the formatter
+// Name returns the name of the formatter.
 func (*Sarif) Name() string {
 	return "sarif"
 }
diff --git a/formatter/stylish.go b/formatter/stylish.go
index f44ada8..f1472cc 100644
--- a/formatter/stylish.go
+++ b/formatter/stylish.go
@@ -13,7 +13,7 @@ type Stylish struct {
 	Metadata lint.FormatterMetadata
 }
 
-// Name returns the name of the formatter
+// Name returns the name of the formatter.
 func (*Stylish) Name() string {
 	return "stylish"
 }
diff --git a/formatter/unix.go b/formatter/unix.go
index 9ce8fee..dd063a0 100644
--- a/formatter/unix.go
+++ b/formatter/unix.go
@@ -15,7 +15,7 @@ type Unix struct {
 	Metadata lint.FormatterMetadata
 }
 
-// Name returns the name of the formatter
+// Name returns the name of the formatter.
 func (*Unix) Name() string {
 	return "unix"
 }
diff --git a/internal/astutils/ast_utils.go b/internal/astutils/ast_utils.go
index 6e87a4f..1f51d64 100644
--- a/internal/astutils/ast_utils.go
+++ b/internal/astutils/ast_utils.go
@@ -15,7 +15,7 @@ import (
 // by the given name, parameters types and return types; false otherwise.
 //
 // Example: to check if a function declaration has the signature Foo(int, string) (bool,error)
-// call to FuncSignatureIs(funcDecl,"Foo",[]string{"int","string"},[]string{"bool","error"})
+// call to FuncSignatureIs(funcDecl,"Foo",[]string{"int","string"},[]string{"bool","error"}).
 func FuncSignatureIs(funcDecl *ast.FuncDecl, wantName string, wantParametersTypes, wantResultsTypes []string) bool {
 	if wantName != funcDecl.Name.String() {
 		return false // func name doesn't match expected one
@@ -32,7 +32,7 @@ func FuncSignatureIs(funcDecl *ast.FuncDecl, wantName string, wantParametersType
 }
 
 // funcParametersSignatureIs returns true if the function has parameters of the given type and order,
-// false otherwise
+// false otherwise.
 func funcParametersSignatureIs(funcDecl *ast.FuncDecl, wantParametersTypes []string) bool {
 	funcParametersTypes := GetTypeNames(funcDecl.Type.Params)
 
@@ -117,7 +117,7 @@ func IsPkgDotName(expr ast.Expr, pkg, name string) bool {
 }
 
 // PickNodes yields a list of nodes by picking them from a sub-ast with root node n.
-// Nodes are selected by applying the selector function
+// Nodes are selected by applying the selector function.
 func PickNodes(n ast.Node, selector func(n ast.Node) bool) []ast.Node {
 	var result []ast.Node
 
diff --git a/internal/ifelse/args.go b/internal/ifelse/args.go
index 8ea1964..288a8e6 100644
--- a/internal/ifelse/args.go
+++ b/internal/ifelse/args.go
@@ -1,7 +1,7 @@
 package ifelse
 
-// Args contains arguments common to the early-return, indent-error-flow
-// and superfluous-else rules
+// Args contains arguments common to the early-return, indent-error-flow,
+// and superfluous-else rules.
 type Args struct {
 	PreserveScope bool
 	AllowJump     bool
diff --git a/internal/ifelse/branch.go b/internal/ifelse/branch.go
index dfa744e..5c33aaa 100644
--- a/internal/ifelse/branch.go
+++ b/internal/ifelse/branch.go
@@ -58,7 +58,7 @@ func StmtBranch(stmt ast.Stmt) Branch {
 	return Regular.Branch()
 }
 
-// String returns a brief string representation
+// String returns a brief string representation.
 func (b Branch) String() string {
 	switch b.BranchKind {
 	case Empty:
@@ -71,7 +71,7 @@ func (b Branch) String() string {
 	return fmt.Sprintf("{ ... %v }", b.BranchKind)
 }
 
-// LongString returns a longer form string representation
+// LongString returns a longer form string representation.
 func (b Branch) LongString() string {
 	switch b.BranchKind {
 	case Panic, Exit:
@@ -80,7 +80,7 @@ func (b Branch) LongString() string {
 	return b.BranchKind.LongString()
 }
 
-// HasDecls returns whether the branch has any top-level declarations
+// HasDecls returns whether the branch has any top-level declarations.
 func (b Branch) HasDecls() bool {
 	for _, stmt := range b.block {
 		switch stmt := stmt.(type) {
@@ -95,7 +95,7 @@ func (b Branch) HasDecls() bool {
 	return false
 }
 
-// IsShort returns whether the branch is empty or consists of a single statement
+// IsShort returns whether the branch is empty or consists of a single statement.
 func (b Branch) IsShort() bool {
 	switch len(b.block) {
 	case 0:
diff --git a/internal/ifelse/branch_kind.go b/internal/ifelse/branch_kind.go
index 75d3b0c..27c7fda 100644
--- a/internal/ifelse/branch_kind.go
+++ b/internal/ifelse/branch_kind.go
@@ -5,35 +5,35 @@ package ifelse
 type BranchKind int
 
 const (
-	// Empty branches do nothing
+	// Empty branches do nothing.
 	Empty BranchKind = iota
 
-	// Return branches return from the current function
+	// Return branches return from the current function.
 	Return
 
-	// Continue branches continue a surrounding "for" loop
+	// Continue branches continue a surrounding "for" loop.
 	Continue
 
-	// Break branches break a surrounding "for" loop
+	// Break branches break a surrounding "for" loop.
 	Break
 
-	// Goto branches conclude with a "goto" statement
+	// Goto branches conclude with a "goto" statement.
 	Goto
 
-	// Panic branches panic the current function
+	// Panic branches panic the current function.
 	Panic
 
-	// Exit branches end the program
+	// Exit branches end the program.
 	Exit
 
-	// Regular branches do not fit any category above
+	// Regular branches do not fit any category above.
 	Regular
 )
 
-// IsEmpty tests if the branch is empty
+// IsEmpty tests if the branch is empty.
 func (k BranchKind) IsEmpty() bool { return k == Empty }
 
-// Returns tests if the branch returns from the current function
+// Returns tests if the branch returns from the current function.
 func (k BranchKind) Returns() bool { return k == Return }
 
 // Deviates tests if the control does not flow to the first
@@ -48,10 +48,10 @@ func (k BranchKind) Deviates() bool {
 	panic("invalid kind")
 }
 
-// Branch returns a Branch with the given kind
+// Branch returns a Branch with the given kind.
 func (k BranchKind) Branch() Branch { return Branch{BranchKind: k} }
 
-// String returns a brief string representation
+// String returns a brief string representation.
 func (k BranchKind) String() string {
 	switch k {
 	case Empty:
@@ -74,7 +74,7 @@ func (k BranchKind) String() string {
 	panic("invalid kind")
 }
 
-// LongString returns a longer form string representation
+// LongString returns a longer form string representation.
 func (k BranchKind) LongString() string {
 	switch k {
 	case Empty:
diff --git a/internal/ifelse/func.go b/internal/ifelse/func.go
index 45c78f0..89e2511 100644
--- a/internal/ifelse/func.go
+++ b/internal/ifelse/func.go
@@ -40,7 +40,7 @@ func ExprCall(expr *ast.ExprStmt) (Call, bool) {
 	return Call{}, false
 }
 
-// String returns the function name with package qualifier (if any)
+// String returns the function name with package qualifier (if any).
 func (f Call) String() string {
 	if f.Pkg != "" {
 		return fmt.Sprintf("%s.%s", f.Pkg, f.Name)
diff --git a/internal/ifelse/target.go b/internal/ifelse/target.go
index 63755ac..d54fc53 100644
--- a/internal/ifelse/target.go
+++ b/internal/ifelse/target.go
@@ -6,10 +6,10 @@ import "go/ast"
 type Target int
 
 const (
-	// TargetIf means the text refers to the "if"
+	// TargetIf means the text refers to the "if".
 	TargetIf Target = iota
 
-	// TargetElse means the text refers to the "else"
+	// TargetElse means the text refers to the "else".
 	TargetElse
 )
 
diff --git a/lint/config.go b/lint/config.go
index 485f618..a305a74 100644
--- a/lint/config.go
+++ b/lint/config.go
@@ -21,7 +21,7 @@ type RuleConfig struct {
 	excludeFilters []*FileFilter
 }
 
-// Initialize - should be called after reading from TOML file
+// Initialize should be called after reading from TOML file.
 func (rc *RuleConfig) Initialize() error {
 	for _, f := range rc.Exclude {
 		ff, err := ParseFileFilter(f)
@@ -36,7 +36,7 @@ func (rc *RuleConfig) Initialize() error {
 // RulesConfig defines the config for all rules.
 type RulesConfig = map[string]RuleConfig
 
-// MustExclude - checks if given filename `name` must be excluded
+// MustExclude checks if given filename `name` must be excluded.
 func (rc *RuleConfig) MustExclude(name string) bool {
 	for _, exclude := range rc.excludeFilters {
 		if exclude.MatchFileName(name) {
diff --git a/lint/failure.go b/lint/failure.go
index c9a6d72..9ad17c3 100644
--- a/lint/failure.go
+++ b/lint/failure.go
@@ -53,7 +53,7 @@ const (
 type FailureCategory string
 
 const (
-	// SeverityWarning declares failures of type warning
+	// SeverityWarning declares failures of type warning.
 	SeverityWarning = "warning"
 	// SeverityError declares failures of type error.
 	SeverityError = "error"
@@ -62,7 +62,7 @@ const (
 // Severity is the type for the failure types.
 type Severity string
 
-// FailurePosition returns the failure position
+// FailurePosition returns the failure position.
 type FailurePosition struct {
 	Start token.Position
 	End   token.Position
diff --git a/lint/file.go b/lint/file.go
index 60060ff..a83bcad 100644
--- a/lint/file.go
+++ b/lint/file.go
@@ -29,7 +29,7 @@ func (f *File) Content() []byte {
 	return f.content
 }
 
-// NewFile creates a new file
+// NewFile creates a new file.
 func NewFile(name string, content []byte, pkg *Package) (*File, error) {
 	f, err := parser.ParseFile(pkg.fset, name, content, parser.ParseComments)
 	if err != nil {
@@ -73,7 +73,7 @@ var basicTypeKinds = map[types.BasicKind]string{
 
 // IsUntypedConst reports whether expr is an untyped constant,
 // and indicates what its default type is.
-// scope may be nil.
+// Scope may be nil.
 func (f *File) IsUntypedConst(expr ast.Expr) (defType string, ok bool) {
 	// Re-evaluate expr outside its context to see if it's untyped.
 	// (An expr evaluated within, for example, an assignment context will get the type of the LHS.)
diff --git a/lint/filefilter.go b/lint/filefilter.go
index 6aed2a0..9978597 100644
--- a/lint/filefilter.go
+++ b/lint/filefilter.go
@@ -6,12 +6,12 @@ import (
 	"strings"
 )
 
-// FileFilter - file filter to exclude some files for rule
-// supports whole
-// 1. file/dir names : pkg/mypkg/my.go,
-// 2. globs: **/*.pb.go,
-// 3. regexes (~ prefix) ~-tmp\.\d+\.go
-// 4. special test marker `TEST` - treats as `~_test\.go`
+// FileFilter filters file to exclude some files for a rule.
+// Supports the following:
+//   - File or directory names: pkg/mypkg/my.go
+//   - Globs: **/*.pb.go,
+//   - Regexes (with ~ prefix): ~-tmp\.\d+\.go
+//   - Special test marker `TEST` (treated as `~_test\.go`).
 type FileFilter struct {
 	// raw definition of filter inside config
 	raw string
@@ -23,10 +23,10 @@ type FileFilter struct {
 	matchesNothing bool
 }
 
-// ParseFileFilter - creates [FileFilter] for given raw filter
-// if empty string, it matches nothing
-// if `*`, or `~`, it matches everything
-// while regexp could be invalid, it could return it's compilation error
+// ParseFileFilter creates a [FileFilter] for the given raw filter.
+// If the string is empty, it matches nothing.
+// If the string is `*` or `~`, it matches everything.
+// If the regular expression is invalid, it returns a compilation error.
 func ParseFileFilter(rawFilter string) (*FileFilter, error) {
 	rawFilter = strings.TrimSpace(rawFilter)
 	result := new(FileFilter)
@@ -43,7 +43,7 @@ func ParseFileFilter(rawFilter string) (*FileFilter, error) {
 
 func (ff *FileFilter) String() string { return ff.raw }
 
-// MatchFileName - checks if file name matches filter
+// MatchFileName checks if the file name matches the filter.
 func (ff *FileFilter) MatchFileName(name string) bool {
 	if ff.matchesAll {
 		return true
diff --git a/lint/formatter.go b/lint/formatter.go
index 7c19af2..c770fdf 100644
--- a/lint/formatter.go
+++ b/lint/formatter.go
@@ -1,13 +1,13 @@
 package lint
 
-// FormatterMetadata configuration of a formatter
+// FormatterMetadata configuration of a formatter.
 type FormatterMetadata struct {
 	Name        string
 	Description string
 	Sample      string
 }
 
-// Formatter defines an interface for failure formatters
+// Formatter defines an interface for failure formatters.
 type Formatter interface {
 	Format(<-chan Failure, Config) (string, error)
 	Name() string
diff --git a/lint/linter.go b/lint/linter.go
index 38f4ae7..2abbb69 100644
--- a/lint/linter.go
+++ b/lint/linter.go
@@ -25,7 +25,7 @@ type Linter struct {
 	fileReadTokens chan struct{}
 }
 
-// New creates a new Linter
+// New creates a new Linter.
 func New(reader ReadFile, maxOpenFiles int) Linter {
 	var fileReadTokens chan struct{}
 	if maxOpenFiles > 0 {
@@ -215,7 +215,7 @@ func isGenerated(src []byte) bool {
 	return false
 }
 
-// addInvalidFileFailure adds a failure for an invalid formatted file
+// addInvalidFileFailure adds a failure for an invalid formatted file.
 func addInvalidFileFailure(filename, errStr string, failures chan Failure) {
 	position := getPositionInvalidFile(filename, errStr)
 	failures <- Failure{
@@ -226,12 +226,14 @@ func addInvalidFileFailure(filename, errStr string, failures chan Failure) {
 	}
 }
 
-// errPosRegexp matches with an NewFile error message
-// i.e. :  corrupted.go:10:4: expected '}', found 'EOF
-// first group matches the line and the second group, the column
+// errPosRegexp matches with a NewFile error message:
+//
+//	corrupted.go:10:4: expected '}', found 'EOF
+//
+// The first group matches the line, and the second group matches the column.
 var errPosRegexp = regexp.MustCompile(`.*:(\d*):(\d*):.*$`)
 
-// getPositionInvalidFile gets the position of the error in an invalid file
+// getPositionInvalidFile gets the position of the error in an invalid file.
 func getPositionInvalidFile(filename, s string) FailurePosition {
 	pos := errPosRegexp.FindStringSubmatch(s)
 	if len(pos) < 3 {
diff --git a/lint/package.go b/lint/package.go
index 5b25de3..34bd5d2 100644
--- a/lint/package.go
+++ b/lint/package.go
@@ -34,13 +34,13 @@ var (
 	trueValue  = 1
 	falseValue = 2
 
-	// Go115 is a constant representing the Go version 1.15
+	// Go115 is a constant representing the Go version 1.15.
 	Go115 = goversion.Must(goversion.NewVersion("1.15"))
-	// Go121 is a constant representing the Go version 1.21
+	// Go121 is a constant representing the Go version 1.21.
 	Go121 = goversion.Must(goversion.NewVersion("1.21"))
-	// Go122 is a constant representing the Go version 1.22
+	// Go122 is a constant representing the Go version 1.22.
 	Go122 = goversion.Must(goversion.NewVersion("1.22"))
-	// Go124 is a constant representing the Go version 1.24
+	// Go124 is a constant representing the Go version 1.24.
 	Go124 = goversion.Must(goversion.NewVersion("1.24"))
 )
 
@@ -73,7 +73,7 @@ func (p *Package) IsMain() bool {
 	return false
 }
 
-// TypesPkg yields information on this package
+// TypesPkg yields information on this package.
 func (p *Package) TypesPkg() *types.Package {
 	p.mu.RLock()
 	defer p.mu.RUnlock()
@@ -81,7 +81,7 @@ func (p *Package) TypesPkg() *types.Package {
 	return p.typesPkg
 }
 
-// TypesInfo yields type information of this package identifiers
+// TypesInfo yields type information of this package identifiers.
 func (p *Package) TypesInfo() *types.Info {
 	p.mu.RLock()
 	defer p.mu.RUnlock()
@@ -89,7 +89,7 @@ func (p *Package) TypesInfo() *types.Info {
 	return p.typesInfo
 }
 
-// Sortable yields a map of sortable types in this package
+// Sortable yields a map of sortable types in this package.
 func (p *Package) Sortable() map[string]bool {
 	p.mu.RLock()
 	defer p.mu.RUnlock()
@@ -141,7 +141,7 @@ func (p *Package) TypeCheck() error {
 }
 
 // check function encapsulates the call to go/types.Config.Check method and
-// recovers if the called method panics (see issue #59)
+// recovers if the called method panics (see issue #59).
 func check(config *types.Config, n string, fset *token.FileSet, astFiles []*ast.File, info *types.Info) (p *types.Package, err error) {
 	defer func() {
 		if r := recover(); r != nil {
@@ -213,7 +213,7 @@ func (p *Package) lint(rules []Rule, config Config, failures chan Failure) error
 	return eg.Wait()
 }
 
-// IsAtLeastGoVersion returns true if the Go version for this package is v or higher, false otherwise
+// IsAtLeastGoVersion returns true if the Go version for this package is v or higher, false otherwise.
 func (p *Package) IsAtLeastGoVersion(v *goversion.Version) bool {
 	p.mu.RLock()
 	defer p.mu.RUnlock()
diff --git a/lint/rule.go b/lint/rule.go
index cc424e9..e682c1c 100644
--- a/lint/rule.go
+++ b/lint/rule.go
@@ -11,7 +11,7 @@ type DisabledInterval struct {
 	RuleName string
 }
 
-// Rule defines an abstract rule interface
+// Rule defines an abstract rule interface.
 type Rule interface {
 	Name() string
 	Apply(*File, Arguments) []Failure
diff --git a/logging/logger.go b/logging/logger.go
index c310c15..212419f 100644
--- a/logging/logger.go
+++ b/logging/logger.go
@@ -12,7 +12,7 @@ const logFile = "revive.log"
 var logger *slog.Logger
 
 // GetLogger retrieves an instance of an application logger which outputs
-// to a file if the debug flag is enabled
+// to a file if the debug flag is enabled.
 func GetLogger() (*slog.Logger, error) {
 	if logger != nil {
 		return logger, nil
diff --git a/revivelib/core.go b/revivelib/core.go
index fa5c64a..36386a1 100755
--- a/revivelib/core.go
+++ b/revivelib/core.go
@@ -68,7 +68,7 @@ func New(
 	}, nil
 }
 
-// Lint the included patterns, skipping excluded ones
+// Lint the included patterns, skipping excluded ones.
 func (r *Revive) Lint(patterns ...*LintPattern) (<-chan lint.Failure, error) {
 	includePatterns := []string{}
 	excludePatterns := []string{}
diff --git a/revivelib/pattern.go b/revivelib/pattern.go
index 16d8d4d..736c955 100644
--- a/revivelib/pattern.go
+++ b/revivelib/pattern.go
@@ -1,29 +1,29 @@
 package revivelib
 
-// LintPattern indicates a pattern to be included/excluded when linting
+// LintPattern indicates a pattern to be included/excluded when linting.
 type LintPattern struct {
 	isExclude bool
 	pattern   string
 }
 
-// IsExclude - should this pattern be included or excluded when linting
+// IsExclude determines should this pattern be included or excluded when linting.
 func (p *LintPattern) IsExclude() bool {
 	return p.isExclude
 }
 
-// GetPattern - returns the actual pattern
+// GetPattern returns the actual pattern
 //
 // Deprecated: Use [Pattern].
 func (p *LintPattern) GetPattern() string {
 	return p.Pattern()
 }
 
-// Pattern - returns the actual pattern
+// Pattern returns the actual pattern.
 func (p *LintPattern) Pattern() string {
 	return p.pattern
 }
 
-// Include this pattern when linting
+// Include this pattern when linting.
 func Include(pattern string) *LintPattern {
 	return &LintPattern{
 		isExclude: false,
@@ -31,7 +31,7 @@ func Include(pattern string) *LintPattern {
 	}
 }
 
-// Exclude this pattern when linting
+// Exclude this pattern when linting.
 func Exclude(pattern string) *LintPattern {
 	return &LintPattern{
 		isExclude: true,
diff --git a/rule/banned_characters.go b/rule/banned_characters.go
index 7eb026b..228156b 100644
--- a/rule/banned_characters.go
+++ b/rule/banned_characters.go
@@ -50,12 +50,12 @@ func (r *BannedCharsRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failur
 	return failures
 }
 
-// Name returns the rule name
+// Name returns the rule name.
 func (*BannedCharsRule) Name() string {
 	return bannedCharsRuleName
 }
 
-// getBannedCharsList converts arguments into the banned characters list
+// getBannedCharsList converts arguments into the banned characters list.
 func (r *BannedCharsRule) getBannedCharsList(args lint.Arguments) ([]string, error) {
 	var bannedChars []string
 	for _, char := range args {
@@ -74,7 +74,7 @@ type lintBannedCharsRule struct {
 	onFailure   func(lint.Failure)
 }
 
-// Visit checks for each node if an identifier contains banned characters
+// Visit checks for each node if an identifier contains banned characters.
 func (w lintBannedCharsRule) Visit(node ast.Node) ast.Visitor {
 	n, ok := node.(*ast.Ident)
 	if !ok {
diff --git a/rule/bare_return.go b/rule/bare_return.go
index c5a9441..f2c9074 100644
--- a/rule/bare_return.go
+++ b/rule/bare_return.go
@@ -42,7 +42,7 @@ func (w lintBareReturnRule) Visit(node ast.Node) ast.Visitor {
 	return w
 }
 
-// checkFunc will verify if the given function has named result and bare returns
+// checkFunc will verify if the given function has named result and bare returns.
 func (w lintBareReturnRule) checkFunc(results *ast.FieldList, body *ast.BlockStmt) {
 	hasNamedResults := results != nil && len(results.List) > 0 && results.List[0].Names != nil
 	if !hasNamedResults || body == nil {
diff --git a/rule/comment_spacings.go b/rule/comment_spacings.go
index 5187bb2..0c35fe3 100644
--- a/rule/comment_spacings.go
+++ b/rule/comment_spacings.go
@@ -8,7 +8,7 @@ import (
 )
 
 // CommentSpacingsRule check whether there is a space between
-// the comment symbol( // ) and the start of the comment text
+// the comment symbol( // ) and the start of the comment text.
 type CommentSpacingsRule struct {
 	allowList []string
 }
diff --git a/rule/confusing_naming.go b/rule/confusing_naming.go
index 3aefc31..819627e 100644
--- a/rule/confusing_naming.go
+++ b/rule/confusing_naming.go
@@ -44,7 +44,7 @@ func (ps *packages) methodNames(lp *lint.Package) pkgMethods {
 
 var allPkgs = packages{pkgs: make([]pkgMethods, 1)}
 
-// ConfusingNamingRule lints method names that differ only by capitalization
+// ConfusingNamingRule lints method names that differ only by capitalization.
 type ConfusingNamingRule struct{}
 
 // Apply applies the rule to given file.
@@ -127,7 +127,7 @@ type lintConfusingNames struct {
 
 const defaultStructName = "_" // used to map functions
 
-// getStructName of a function receiver. Defaults to defaultStructName
+// getStructName of a function receiver. Defaults to defaultStructName.
 func getStructName(r *ast.FieldList) string {
 	result := defaultStructName
 
diff --git a/rule/confusing_results.go b/rule/confusing_results.go
index fc6ac75..559c357 100644
--- a/rule/confusing_results.go
+++ b/rule/confusing_results.go
@@ -7,7 +7,7 @@ import (
 	"github.com/mgechev/revive/lint"
 )
 
-// ConfusingResultsRule lints given function declarations
+// ConfusingResultsRule lints given function declarations.
 type ConfusingResultsRule struct{}
 
 // Apply applies the rule to given file.
diff --git a/rule/error_strings.go b/rule/error_strings.go
index ea295f8..53a585b 100644
--- a/rule/error_strings.go
+++ b/rule/error_strings.go
@@ -88,7 +88,7 @@ type lintErrorStrings struct {
 	onFailure      func(lint.Failure)
 }
 
-// Visit browses the AST
+// Visit browses the AST.
 func (w lintErrorStrings) Visit(n ast.Node) ast.Visitor {
 	ce, ok := n.(*ast.CallExpr)
 	if !ok {
@@ -126,8 +126,8 @@ func (w lintErrorStrings) Visit(n ast.Node) ast.Visitor {
 	return w
 }
 
-// match returns true if the expression corresponds to the known pkg.function
-// i.e.: errors.Wrap
+// match returns true if the expression corresponds to the known pkg.function,
+// i.e.: errors.Wrap.
 func (w lintErrorStrings) match(expr *ast.CallExpr) bool {
 	sel, ok := expr.Fun.(*ast.SelectorExpr)
 	if !ok {
@@ -147,8 +147,8 @@ func (w lintErrorStrings) match(expr *ast.CallExpr) bool {
 	return ok
 }
 
-// getMessage returns the message depending on its position
-// returns false if the cast is unsuccessful
+// getMessage returns the message depending on its position.
+// Returns false if the cast is unsuccessful.
 func (w lintErrorStrings) getMessage(expr *ast.CallExpr) (s *ast.BasicLit, success bool) {
 	str, ok := w.checkArg(expr, 0)
 	if ok {
diff --git a/rule/exported.go b/rule/exported.go
index 2bcc458..72316d3 100644
--- a/rule/exported.go
+++ b/rule/exported.go
@@ -12,7 +12,7 @@ import (
 	"github.com/mgechev/revive/lint"
 )
 
-// disabledChecks store ignored warnings types
+// disabledChecks store ignored warnings types.
 type disabledChecks struct {
 	Const            bool
 	Function         bool
@@ -30,7 +30,7 @@ const (
 	checkNameStuttering       = "stuttering"
 )
 
-// isDisabled returns true if the given check is disabled, false otherwise
+// isDisabled returns true if the given check is disabled, false otherwise.
 func (dc *disabledChecks) isDisabled(checkName string) bool {
 	switch checkName {
 	case "var":
@@ -254,7 +254,7 @@ func (w *lintExported) lintTypeDoc(t *ast.TypeSpec, doc *ast.CommentGroup, first
 	)
 }
 
-// checkValueNames returns true if names check, false otherwise
+// checkValueNames returns true if names check, false otherwise.
 func (w *lintExported) checkValueNames(names []*ast.Ident, nodeToBlame ast.Node, kind string) bool {
 	// Check that none are exported except for the first.
 	if len(names) < 2 {
@@ -438,7 +438,7 @@ func (w *lintExported) lintInterfaceMethod(typeName string, m *ast.Field) {
 	}
 }
 
-// mustCheckMethod returns true if the method must be checked by this rule, false otherwise
+// mustCheckMethod returns true if the method must be checked by this rule, false otherwise.
 func (w *lintExported) mustCheckMethod(fn *ast.FuncDecl) bool {
 	recv := typeparams.ReceiverType(fn)
 
diff --git a/rule/filename_format.go b/rule/filename_format.go
index 6d4905f..200ffbd 100644
--- a/rule/filename_format.go
+++ b/rule/filename_format.go
@@ -9,7 +9,7 @@ import (
 	"github.com/mgechev/revive/lint"
 )
 
-// FilenameFormatRule lints source filenames according to a set of regular expressions given as arguments
+// FilenameFormatRule lints source filenames according to a set of regular expressions given as arguments.
 type FilenameFormatRule struct {
 	format *regexp.Regexp
 }
diff --git a/rule/import_shadowing.go b/rule/import_shadowing.go
index 2248b80..0952078 100644
--- a/rule/import_shadowing.go
+++ b/rule/import_shadowing.go
@@ -66,7 +66,7 @@ type importShadowing struct {
 	skipIdents       map[*ast.Ident]struct{}
 }
 
-// Visit visits AST nodes and checks if id nodes (ast.Ident) shadow an import name
+// Visit visits AST nodes and checks if id nodes (ast.Ident) shadow an import name.
 func (w importShadowing) Visit(n ast.Node) ast.Visitor {
 	switch n := n.(type) {
 	case *ast.AssignStmt:
diff --git a/rule/range_val_address.go b/rule/range_val_address.go
index 13d01a1..6622cd5 100644
--- a/rule/range_val_address.go
+++ b/rule/range_val_address.go
@@ -9,7 +9,7 @@ import (
 	"github.com/mgechev/revive/lint"
 )
 
-// RangeValAddress lints
+// RangeValAddress warns if address of range value is used dangerously.
 type RangeValAddress struct{}
 
 // Apply applies the rule to given file.
diff --git a/rule/string_format.go b/rule/string_format.go
index 80e43af..b653cb1 100644
--- a/rule/string_format.go
+++ b/rule/string_format.go
@@ -11,7 +11,7 @@ import (
 	"github.com/mgechev/revive/lint"
 )
 
-// StringFormatRule lints strings and/or comments according to a set of regular expressions given as Arguments
+// StringFormatRule lints strings and/or comments according to a set of regular expressions given as Arguments.
 type StringFormatRule struct {
 	rules []stringFormatSubrule
 }
@@ -81,7 +81,7 @@ type stringFormatSubruleScope struct {
 	field    string // (optional) If the argument to be checked is a struct, which member of the struct is checked against the rule (top level members only)
 }
 
-// Regex inserted to match valid function/struct field identifiers
+// Regex inserted to match valid function/struct field identifiers.
 const identRegex = "[_A-Za-z][_A-Za-z0-9]*"
 
 var parseStringFormatScope = regexp.MustCompile(
@@ -165,17 +165,17 @@ func (r *StringFormatRule) parseArgument(argument any, ruleNum int) (scopes stri
 	return scopes, regex, negated, errorMessage, nil
 }
 
-// Report an invalid config, this is specifically the user's fault
+// Report an invalid config, this is specifically the user's fault.
 func (*StringFormatRule) configError(msg string, ruleNum, option int) error {
 	return fmt.Errorf("invalid configuration for string-format: %s [argument %d, option %d]", msg, ruleNum, option)
 }
 
-// Report a general config parsing failure, this may be the user's fault, but it isn't known for certain
+// Report a general config parsing failure, this may be the user's fault, but it isn't known for certain.
 func (*StringFormatRule) parseError(msg string, ruleNum, option int) error {
 	return fmt.Errorf("failed to parse configuration for string-format: %s [argument %d, option %d]", msg, ruleNum, option)
 }
 
-// Report a general scope config parsing failure, this may be the user's fault, but it isn't known for certain
+// Report a general scope config parsing failure, this may be the user's fault, but it isn't known for certain.
 func (*StringFormatRule) parseScopeError(msg string, ruleNum, option, scopeNum int) error {
 	return fmt.Errorf("failed to parse configuration for string-format: %s [argument %d, option %d, scope index %d]", msg, ruleNum, option, scopeNum)
 }
@@ -204,7 +204,7 @@ func (w *lintStringFormatRule) Visit(node ast.Node) ast.Visitor {
 	return w
 }
 
-// Return the name of a call expression in the form of package.Func or Func
+// Return the name of a call expression in the form of package.Func or Func.
 func (*lintStringFormatRule) getCallName(call *ast.CallExpr) (callName string, ok bool) {
 	if ident, ok := call.Fun.(*ast.Ident); ok {
 		// Local function call
@@ -227,7 +227,7 @@ func (*lintStringFormatRule) getCallName(call *ast.CallExpr) (callName string, o
 	return "", false
 }
 
-// apply a single format rule to a call expression (should be done after verifying the that the call expression matches the rule's scope)
+// apply a single format rule to a call expression (should be done after verifying the that the call expression matches the rule's scope).
 func (r *stringFormatSubrule) apply(call *ast.CallExpr, scope *stringFormatSubruleScope) {
 	if len(call.Args) <= scope.argument {
 		return
diff --git a/rule/struct_tag.go b/rule/struct_tag.go
index 2f29e87..c3b98ac 100644
--- a/rule/struct_tag.go
+++ b/rule/struct_tag.go
@@ -38,7 +38,6 @@ const (
 
 type tagChecker func(checkCtx *checkContext, tag *structtag.Tag, fieldType ast.Expr) (message string, succeeded bool)
 
-// populate tag checkers map
 var tagCheckers = map[tagKey]tagChecker{
 	keyASN1:         checkASN1Tag,
 	keyBSON:         checkBSONTag,
@@ -757,8 +756,9 @@ var validateSingleOptions = map[string]struct{}{
 	"uuid5_rfc4122":                 {},
 }
 
-// These are options that are used in expressions of the form
-// <option> = <RHS>
+// These are options that are used in expressions of the form:
+//
+//	<option> = <RHS>
 var validateLHS = map[string]struct{}{
 	"contains":             {},
 	"containsany":          {},
diff --git a/rule/time_date.go b/rule/time_date.go
index 73bebc9..ebcb083 100644
--- a/rule/time_date.go
+++ b/rule/time_date.go
@@ -41,7 +41,7 @@ type lintTimeDate struct {
 }
 
 var (
-	// timeDateArgumentNames are the names of the arguments of time.Date
+	// timeDateArgumentNames are the names of the arguments of time.Date.
 	timeDateArgumentNames = []string{
 		"year",
 		"month",
@@ -53,7 +53,7 @@ var (
 		"timezone",
 	}
 
-	// timeDateArity is the number of arguments of time.Date
+	// timeDateArity is the number of arguments of time.Date.
 	timeDateArity = len(timeDateArgumentNames)
 )
 
@@ -66,7 +66,18 @@ func (w lintTimeDate) Visit(n ast.Node) ast.Visitor {
 		return w
 	}
 
-	// The last argument is a timezone, there is no need to check it, also it has a different type
+	// The last argument is a timezone, check it
+	tzArg := ce.Args[timeDateArity-1]
+	if astutils.IsIdent(tzArg, "nil") {
+		w.onFailure(lint.Failure{
+			Category:   "time",
+			Node:       tzArg,
+			Confidence: 1,
+			Failure:    "time.Date timezone argument cannot be nil, it would panic on runtime",
+		})
+	}
+
+	// All the other arguments should be decimal integers.
 	for pos, arg := range ce.Args[:timeDateArity-1] {
 		bl, ok := arg.(*ast.BasicLit)
 		if !ok {
diff --git a/rule/time_equal.go b/rule/time_equal.go
index adf4aa5..ec226fb 100644
--- a/rule/time_equal.go
+++ b/rule/time_equal.go
@@ -9,7 +9,7 @@ import (
 	"github.com/mgechev/revive/lint"
 )
 
-// TimeEqualRule shows where "==" and "!=" used for equality check time.Time
+// TimeEqualRule shows where "==" and "!=" used for equality check time.Time.
 type TimeEqualRule struct{}
 
 // Apply applies the rule to given file.
diff --git a/rule/unchecked_type_assertion.go b/rule/unchecked_type_assertion.go
index 6644776..08e854f 100644
--- a/rule/unchecked_type_assertion.go
+++ b/rule/unchecked_type_assertion.go
@@ -136,7 +136,7 @@ func (w *lintUncheckedTypeAssertion) handleAssignment(n *ast.AssignStmt) {
 	}
 }
 
-// handles "return foo(.*bar)" - one of them is enough to fail as golang does not forward the type cast tuples in return statements
+// handles "return foo(.*bar)" - one of them is enough to fail as golang does not forward the type cast tuples in return statements.
 func (w *lintUncheckedTypeAssertion) handleReturn(n *ast.ReturnStmt) {
 	for _, r := range n.Results {
 		w.requireNoTypeAssert(r)
diff --git a/rule/unconditional_recursion.go b/rule/unconditional_recursion.go
index d4c06a8..1fd3eb0 100644
--- a/rule/unconditional_recursion.go
+++ b/rule/unconditional_recursion.go
@@ -79,10 +79,10 @@ type lintUnconditionalRecursionRule struct {
 }
 
 // Visit will traverse function's body we search for calls to the function itself.
-// We do not search inside conditional control structures (if, for, switch, ...) because any recursive call inside them is conditioned
-// We do search inside conditional control structures are statements that will take the control out of the function (return, exit, panic)
-// If we find conditional control exits, it means the function is NOT unconditionally-recursive
-// If we find a recursive call before finding any conditional exit, a failure is generated
+// We do not search inside conditional control structures (if, for, switch, ...) because any recursive call inside them is conditioned.
+// We do search inside conditional control structures are statements that will take the control out of the function (return, exit, panic).
+// If we find conditional control exits, it means the function is NOT unconditionally-recursive.
+// If we find a recursive call before finding any conditional exit, a failure is generated.
 // In resume: if we found a recursive call control-dependent from the entry point of the function then we raise a failure.
 func (w *lintUnconditionalRecursionRule) Visit(node ast.Node) ast.Visitor {
 	switch n := node.(type) {
diff --git a/rule/utils.go b/rule/utils.go
index 5a6fe32..cfb87c5 100644
--- a/rule/utils.go
+++ b/rule/utils.go
@@ -35,7 +35,7 @@ func srcLine(src []byte, p token.Position) string {
 	return string(src[lo:hi])
 }
 
-// checkNumberOfArguments fails if the given number of arguments is not, at least, the expected one
+// checkNumberOfArguments fails if the given number of arguments is not, at least, the expected one.
 func checkNumberOfArguments(expected int, args lint.Arguments, ruleName string) error {
 	if len(args) < expected {
 		return fmt.Errorf("not enough arguments for %s rule, expected %d, got %d. Please check the rule's documentation", ruleName, expected, len(args))
@@ -50,7 +50,7 @@ func isRuleOption(arg, name string) bool {
 
 // normalizeRuleOption returns an option name from the argument. It is lowercased and without hyphens.
 //
-// Example: normalizeRuleOption("allowTypesBefore"), normalizeRuleOption("allow-types-before") -> "allowtypesbefore"
+// Example: normalizeRuleOption("allowTypesBefore"), normalizeRuleOption("allow-types-before") -> "allowtypesbefore".
 func normalizeRuleOption(arg string) string {
 	return strings.ToLower(strings.ReplaceAll(arg, "-", ""))
 }
@@ -66,7 +66,7 @@ func isCallToExitFunction(pkgName, functionName string) bool {
 	return exitFunctions[pkgName] != nil && exitFunctions[pkgName][functionName]
 }
 
-// newInternalFailureError returns a slice of Failure with a single internal failure in it
+// newInternalFailureError returns a slice of Failure with a single internal failure in it.
 func newInternalFailureError(e error) []lint.Failure {
 	return []lint.Failure{lint.NewInternalFailure(e.Error())}
 }


Test patch:
diff --git a/cli/main_test.go b/cli/main_test.go
index 7e9c404..8fe1e85 100644
--- a/cli/main_test.go
+++ b/cli/main_test.go
@@ -59,6 +59,8 @@ func TestHomeConfigDir(t *testing.T) {
 }
 
 func setHome(t *testing.T, dir string) {
+	t.Helper()
+
 	homeEnv := "HOME"
 	if runtime.GOOS == "windows" {
 		homeEnv = "USERPROFILE"
diff --git a/lint/name_test.go b/lint/name_test.go
index df42b25..e9cf428 100644
--- a/lint/name_test.go
+++ b/lint/name_test.go
@@ -2,7 +2,7 @@ package lint
 
 import "testing"
 
-// TestName tests Name function
+// TestName tests Name function.
 func TestName(t *testing.T) {
 	tests := []struct {
 		name, want string
diff --git a/test/optimize_operands_order_test.go b/test/optimize_operands_order_test.go
index 431a679..2e8c1d4 100644
--- a/test/optimize_operands_order_test.go
+++ b/test/optimize_operands_order_test.go
@@ -7,7 +7,7 @@ import (
 	"github.com/mgechev/revive/rule"
 )
 
-// Test that left and right side of Binary operators (only AND, OR) are swapable
+// Test that left and right side of Binary operators (only AND, OR) are swapable.
 func TestOptimizeOperandsOrder(t *testing.T) {
 	testRule(t, "optimize_operands_order", &rule.OptimizeOperandsOrderRule{}, &lint.RuleConfig{})
 }
diff --git a/test/time_date_test.go b/test/time_date_test.go
index 6cb98db..c379a9d 100644
--- a/test/time_date_test.go
+++ b/test/time_date_test.go
@@ -8,4 +8,5 @@ import (
 
 func TestTimeDate(t *testing.T) {
 	testRule(t, "time_date_decimal_literal", &rule.TimeDateRule{})
+	testRule(t, "time_date_nil_timezone", &rule.TimeDateRule{})
 }
diff --git a/test/utils_test.go b/test/utils_test.go
index c30aea1..7ad3394 100644
--- a/test/utils_test.go
+++ b/test/utils_test.go
@@ -17,7 +17,7 @@ import (
 )
 
 // configureRule configures the given rule with the given configuration
-// if the rule implements the ConfigurableRule interface
+// if the rule implements the ConfigurableRule interface.
 func configureRule(t *testing.T, rule lint.Rule, arguments lint.Arguments) {
 	t.Helper()
 
@@ -151,7 +151,7 @@ type instruction struct {
 	Confidence  float64 // confidence level
 }
 
-// JSONInstruction structure used when we parse json object instead of classic MATCH string
+// JSONInstruction structure used when we parse json object instead of classic MATCH string.
 type JSONInstruction struct {
 	Match      string  `json:"MATCH"`
 	Category   string  `json:"Category"`
@@ -277,7 +277,7 @@ func srcLine(src []byte, p token.Position) string {
 	return string(src[lo:hi])
 }
 
-// TestLine tests srcLine function
+// TestLine tests srcLine function.
 func TestLine(t *testing.T) {
 	tests := []struct {
 		src    string
@@ -319,7 +319,7 @@ func exportedType(typ types.Type) bool {
 	return true
 }
 
-// TestExportedType tests exportedType function
+// TestExportedType tests exportedType function.
 func TestExportedType(t *testing.T) {
 	tests := []struct {
 		typString string
diff --git a/testdata/time_date_nil_timezone.go b/testdata/time_date_nil_timezone.go
new file mode 100644
index 0000000..26f8454
--- /dev/null
+++ b/testdata/time_date_nil_timezone.go
@@ -0,0 +1,40 @@
+package pkg
+
+import "time"
+
+var (
+	// a nil timezone will panic at runtime
+	// this is an invalid usage
+	// it should be reported as an error
+	_ = time.Date(2023, 1, 2, 3, 4, 5, 0, nil) // MATCH /time.Date timezone argument cannot be nil, it would panic on runtime/
+)
+
+func _() {
+	_ = time.Date(2023, 1, 2, 3, 4, 5, 0, nil) // MATCH /time.Date timezone argument cannot be nil, it would panic on runtime/
+}
+
+func _() {
+	// this is a valid usage
+	// it should not be reported as an error
+	_ = time.Date(2023, 1, 2, 3, 4, 5, 0, time.UTC)
+	_ = time.Date(2023, 1, 2, 3, 4, 5, 0, time.Local)
+
+	loc := time.LoadLocation("Europe/Paris")
+	_ = time.Date(2023, 1, 2, 3, 4, 5, 0, loc)
+
+	loc := time.FixedZone("UTC-8", -8*60*60)
+	_ = time.Date(2023, 1, 2, 3, 4, 5, 0, loc)
+
+	_ = time.Date(2023, 1, 2, 3, 4, 5, 0, time.FixedZone("UTC-8", -8*60*60))
+}
+
+// this would be difficult to detect
+// and are for now not reported
+// even if they panic at runtime
+func _() {
+	var loc *time.Location
+	_ = time.Date(2023, 1, 2, 3, 4, 5, 0, loc)
+
+	loc, _ = time.LoadLocation("whatever")
+	_ = time.Date(2023, 1, 2, 3, 4, 5, 0, loc)
+}