diff --git a/.all-contributorsrc b/.all-contributorsrc index 004e776cd1..254b9df0f7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -6493,6 +6493,24 @@ "contributions": [ "code" ] + }, + { + "login": "vgalloy", + "name": "Vincent Galloy", + "avatar_url": "https://avatars.githubusercontent.com/u/11443605?v=4", + "profile": "https://github.com/vgalloy", + "contributions": [ + "code" + ] + }, + { + "login": "squaresurf", + "name": "Daniel Paul Searles", + "avatar_url": "https://avatars.githubusercontent.com/u/863076?v=4", + "profile": "https://github.com/squaresurf", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/docs/pages/pmd/projectdocs/credits.md b/docs/pages/pmd/projectdocs/credits.md index fea5045f18..bfabdb8a21 100644 --- a/docs/pages/pmd/projectdocs/credits.md +++ b/docs/pages/pmd/projectdocs/credits.md @@ -188,741 +188,743 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Dan Rollo

πŸ›
Dan Ziemba

πŸ›
Daniel Jipa

πŸ› +
Daniel Paul Searles

πŸ’»
Daniel Reigada

πŸ›
Danilo Pianini

πŸ›
Darko

πŸ› -
David

πŸ› +
David

πŸ›
David Atkinson

πŸ›
David BurstrΓΆm

πŸ’» πŸ›
David GoatΓ©

πŸ›
David Golpira

πŸ›
David KovaΕ™Γ­k

πŸ›
David M. Karr (fullname at gmail.com)

πŸ› -
David Renz

πŸ’» πŸ› +
David Renz

πŸ’» πŸ›
David Renz

πŸ›
Deleted user

πŸ›
Dell Green

πŸ›
Dem Pilafian

πŸ›
Den

πŸ›
Denis Borovikov

πŸ’» πŸ› -
Dennie Reniers

πŸ’» πŸ› +
Dennie Reniers

πŸ’» πŸ›
Dennis Kieselhorst

πŸ›
Derek P. Moore

πŸ›
Dichotomia

πŸ›
Dionisio CortΓ©s FernΓ‘ndez

πŸ’» πŸ›
Dmitri Bourlatchkov

πŸ›
Dmitriy Kuzmin

πŸ› -
Dmytro Dashenkov

πŸ› +
Dmytro Dashenkov

πŸ›
Drew Hall

πŸ›
Dumitru Postoronca

πŸ›
Dylan Adams

πŸ›
Eden Hao

πŸ›
Egor Bredikhin

πŸ›
Elan P. Kugelmass

πŸ› -
Elder S.

πŸ› +
Elder S.

πŸ›
Emile

πŸ›
Eric

πŸ›
Eric Kintzer

πŸ›
Eric Perret

πŸ›
Eric Squires

πŸ›
Erich L Foster

πŸ› -
Erik Bleske

πŸ› +
Erik Bleske

πŸ›
Ernst Reissner

πŸ›
F.W. Dekker

πŸ›
Facundo

πŸ›
Federico Giust

πŸ›
Fedor Sherstobitov

πŸ›
Felix Lampe

πŸ› -
Filip Golonka

πŸ› +
Filip Golonka

πŸ›
Filipe Esperandio

πŸ’» πŸ›
Francesco la Torre

πŸ›
Francisco Duarte

πŸ›
Frieder Bluemle

πŸ›
Frits Jalvingh

πŸ’» πŸ›
G. Bazior

πŸ› -
Gabe Henkes

πŸ› +
Gabe Henkes

πŸ›
Genoud Magloire

πŸ›
Geoffrey555

πŸ›
Georg Romstorfer

πŸ›
Gio

πŸ›
Gol

πŸ›
Gonzalo Exequiel Ibars Ingman

πŸ’» πŸ› -
GooDer

πŸ› +
GooDer

πŸ›
Gregor Riegler

πŸ›
Grzegorz Olszewski

πŸ›
Gunther Schrijvers

πŸ’» πŸ›
Gustavo Krieger

πŸ›
Guy Elsmore-Paddock

πŸ›
GΓΆrkem MΓΌlayim

πŸ› -
Hanzel Godinez

πŸ› +
Hanzel Godinez

πŸ›
Harsh Kukreja

πŸ›
Heber

πŸ›
Henning Schmiedehausen

πŸ’» πŸ›
Henning von Bargen

πŸ’»
HervΓ© Boutemy

πŸ›
Himanshu Pandey

πŸ› -
Hokwang Lee

πŸ› +
Hokwang Lee

πŸ›
Hooperbloob

πŸ’»
Hung PHAN

πŸ›
IDoCodingStuffs

πŸ’» πŸ›
Iccen Gan

πŸ›
Ignacio Mariano Tirabasso

πŸ›
Igor Melnichenko

πŸ› -
Igor Moreno

πŸ› +
Igor Moreno

πŸ›
Intelesis-MS

πŸ›
Iroha_

πŸ›
Ishan Srivastava

πŸ›
Ivano Guerini

πŸ›
Ivar Andreas Bonsaksen

πŸ›
Ivo Ε mΓ­d

πŸ› -
JJengility

πŸ› +
JJengility

πŸ›
Jake Hemmerle

πŸ›
James Harrison

πŸ›
Jan

πŸ›
Jan Aertgeerts

πŸ’» πŸ›
Jan BrΓΌmmer

πŸ›
Jan TΕ™Γ­ska

πŸ› -
Jan-Lukas Else

πŸ› +
Jan-Lukas Else

πŸ›
Jason Williams

πŸ›
Jean-Paul Mayer

πŸ›
Jean-Simon Larochelle

πŸ›
Jeff Bartolotta

πŸ’» πŸ›
Jeff Hube

πŸ’» πŸ›
Jeff Jensen

πŸ› -
Jeff May

πŸ› +
Jeff May

πŸ›
Jens Gerdes

πŸ›
Jeroen Borgers

πŸ›
Jerome Russ

πŸ›
Jiri Pejchal

πŸ›
Jithin Sunny

πŸ›
JiΕ™Γ­ Ε korpil

πŸ› -
Joao Machado

πŸ› +
Joao Machado

πŸ›
Jochen Krauss

πŸ›
Johan Hammar

πŸ›
John Karp

πŸ›
John Zhang

πŸ›
John-Teng

πŸ’» πŸ›
Jon Moroney

πŸ’» πŸ› -
Jonas Geiregat

πŸ› +
Jonas Geiregat

πŸ›
Jonathan Wiesel

πŸ’» πŸ›
Jordan

πŸ›
Jordi Llach

πŸ›
Jorge SolΓ³rzano

πŸ›
JorneVL

πŸ›
Jose Palafox

πŸ› -
Jose Stovall

πŸ› +
Jose Stovall

πŸ›
Joseph

πŸ’»
Joseph Heenan

πŸ›
Josh Feingold

πŸ’» πŸ›
Josh Holthaus

πŸ›
Joshua S Arquilevich

πŸ›
JoΓ£o Ferreira

πŸ’» πŸ› -
JoΓ£o Pedro Schmitt

πŸ› +
JoΓ£o Pedro Schmitt

πŸ›
Juan MartΓ­n Sotuyo Dodero

πŸ’» πŸ“– πŸ› 🚧
Juan Pablo Civile

πŸ›
Julian Voronetsky

πŸ›
Julien

πŸ›
Julius

πŸ›
JustPRV

πŸ› -
JΓΆrn Huxhorn

πŸ› +
JΓΆrn Huxhorn

πŸ›
KThompso

πŸ›
Kai Amundsen

πŸ›
Karl-Andero Mere

πŸ›
Karl-Philipp Richter

πŸ›
Karsten Silz

πŸ›
Kazuma Watanabe

πŸ› -
Kev

πŸ› +
Kev

πŸ›
Keve MΓΌller

πŸ›
Kevin Guerra

πŸ’»
Kevin Jones

πŸ›
Kevin Wayne

πŸ›
Kieran Black

πŸ›
Kirill Zubov

πŸ› -
Kirk Clemens

πŸ’» πŸ› +
Kirk Clemens

πŸ’» πŸ›
Klaus Hartl

πŸ›
Koen Van Looveren

πŸ›
Kris Scheibe

πŸ’» πŸ›
Kunal Thanki

πŸ›
Larry Diamond

πŸ’» πŸ›
Lars Knickrehm

πŸ› -
Leo Gutierrez

πŸ› +
Leo Gutierrez

πŸ›
Lintsi

πŸ›
Linus Fernandes

πŸ›
Lixon Lookose

πŸ›
Logesh

πŸ›
Lorenzo Gabriele

πŸ›
LoΓ―c Ledoyen

πŸ› -
Lucas Silva

πŸ› +
Lucas Silva

πŸ›
Lucas Soncini

πŸ’» πŸ›
Lukasz Slonina

πŸ›
Lukebray

πŸ›
Lyor Goldstein

πŸ›
MCMicS

πŸ›
Macarse

πŸ› -
Machine account for PMD

πŸ’» +
Machine account for PMD

πŸ’»
Maciek Siemczyk

πŸ›
Maikel Steneker

πŸ’» πŸ›
Maksim Moiseikin

πŸ›
Manfred Koch

πŸ›
Manuel Moya Ferrer

πŸ’» πŸ›
Manuel Ryan

πŸ› -
Marat Vyshegorodtsev

πŸ› +
Marat Vyshegorodtsev

πŸ›
Marcel HΓ€rle

πŸ›
Marcello Fialho

πŸ›
Marcin Rataj

πŸ›
Mark Adamcin

πŸ›
Mark Hall

πŸ’» πŸ›
Mark Kolich

πŸ› -
Mark Pritchard

πŸ› +
Mark Pritchard

πŸ›
Markus Rathgeb

πŸ›
Marquis Wang

πŸ›
Martin Feldsztejn

πŸ›
Martin Lehmann

πŸ›
Martin Spamer

πŸ›
Martin TarjΓ‘nyi

πŸ› -
MatFl

πŸ› +
MatFl

πŸ›
Mateusz Stefanski

πŸ›
Mathieu Gouin

πŸ›
MatiasComercio

πŸ’» πŸ›
Matt Benson

πŸ›
Matt De Poorter

πŸ›
Matt Harrah

πŸ› -
Matt Nelson

πŸ› +
Matt Nelson

πŸ›
Matthew Amos

πŸ›
Matthew Duggan

πŸ›
Matthew Hall

πŸ›
MatΓ­as Fraga

πŸ’» πŸ›
Maxime Robert

πŸ’» πŸ›
Michael

πŸ› -
Michael Bell

πŸ› +
Michael Bell

πŸ›
Michael Bernstein

πŸ›
Michael Clay

πŸ›
Michael Dombrowski

πŸ›
Michael Hausegger

πŸ›
Michael Hoefer

πŸ›
Michael MΓΆbius

πŸ› -
Michael N. Lipp

πŸ› +
Michael N. Lipp

πŸ›
Michael Pellegrini

πŸ›
Michal Kordas

πŸ›
MichaΕ‚ Borek

πŸ›
MichaΕ‚ KuliΕ„ski

πŸ›
Miguel NΓΊΓ±ez DΓ­az-Montes

πŸ›
Mihai Ionut

πŸ› -
Mirek Hankus

πŸ› +
Mirek Hankus

πŸ›
Mladjan Gadzic

πŸ›
MrAngry52

πŸ›
Muminur Choudhury

πŸ›
Mykhailo Palahuta

πŸ’» πŸ›
Nagendra Kumar Singh

πŸ›
Nahuel Barrios

πŸ› -
Nathan Braun

πŸ› +
Nathan Braun

πŸ›
Nathan Reynolds

πŸ›
Nathan Reynolds

πŸ›
NathanaΓ«l

πŸ›
Nazdravi

πŸ›
Neha-Dhonde

πŸ›
Nicholas Doyle

πŸ› -
Nick Butcher

πŸ› +
Nick Butcher

πŸ›
Nico Gallinal

πŸ›
Nicola Dal Maso

πŸ›
Nicolas Filotto

πŸ’»
Nikita Chursin

πŸ›
Niklas Baudy

πŸ›
Nikolas Havrikov

πŸ› -
Nilesh Virkar

πŸ› +
Nilesh Virkar

πŸ›
Nimit Patel

πŸ›
Niranjan Harpale

πŸ›
Noah Sussman

πŸ›
Noah0120

πŸ›
Noam Tamim

πŸ›
Noel Grandin

πŸ› -
Olaf Haalstra

πŸ› +
Olaf Haalstra

πŸ›
Oleg Pavlenko

πŸ›
Oliver Eikemeier

πŸ›
Olivier Parent

πŸ’» πŸ›
Ollie Abbey

πŸ’» πŸ›
OverDrone

πŸ›
Ozan Gulle

πŸ’» πŸ› -
PUNEET JAIN

πŸ› +
PUNEET JAIN

πŸ›
Parbati Bose

πŸ›
Paul Berg

πŸ›
Pavel Bludov

πŸ›
Pavel Mička

πŸ›
Pedro Nuno Santos

πŸ›
Pedro Rijo

πŸ› -
Pelisse Romain

πŸ’» πŸ“– πŸ› +
Pelisse Romain

πŸ’» πŸ“– πŸ›
Pete Davids

πŸ›
Peter Bruin

πŸ›
Peter Chittum

πŸ’» πŸ›
Peter Cudmore

πŸ›
Peter Kasson

πŸ›
Peter Kofler

πŸ› -
Pham Hai Trung

πŸ› +
Pham Hai Trung

πŸ›
Philip Graf

πŸ’» πŸ›
Philip Hachey

πŸ›
Philippe Ozil

πŸ›
Phinehas Artemix

πŸ›
Phokham Nonava

πŸ›
Piotr SzymaΕ„ski

πŸ› -
Piotrek Ε»ygieΕ‚o

πŸ’» πŸ› +
Piotrek Ε»ygieΕ‚o

πŸ’» πŸ›
Pranay Jaiswal

πŸ›
Prasad Kamath

πŸ›
Prasanna

πŸ›
Presh-AR

πŸ›
Puneet1726

πŸ›
Rafael CortΓͺs

πŸ› -
RaheemShaik999

πŸ› +
RaheemShaik999

πŸ›
RajeshR

πŸ’» πŸ›
Ramachandra Mohan

πŸ›
Raquel Pau

πŸ›
Ravikiran Janardhana

πŸ›
Reda Benhemmouche

πŸ›
Renato Oliveira

πŸ’» πŸ› -
Rich DiCroce

πŸ› +
Rich DiCroce

πŸ›
Riot R1cket

πŸ›
Rishabh Jain

πŸ›
RishabhDeep Singh

πŸ›
Robbie Martinus

πŸ’» πŸ›
Robert Henry

πŸ›
Robert Painsi

πŸ› -
Robert Russell

πŸ› +
Robert Russell

πŸ›
Robert SΓΆsemann

πŸ’» πŸ“– πŸ“’ πŸ›
Robert Whitebit

πŸ›
Robin Richtsfeld

πŸ›
Robin Stocker

πŸ’» πŸ›
Robin Wils

πŸ›
RochusOest

πŸ› -
Rodolfo Noviski

πŸ› +
Rodolfo Noviski

πŸ›
Rodrigo Casara

πŸ›
Rodrigo Fernandes

πŸ›
Roman Salvador

πŸ’» πŸ›
Ronald Blaschke

πŸ›
RΓ³bert Papp

πŸ›
Saikat Sengupta

πŸ› -
Saksham Handu

πŸ› +
Saksham Handu

πŸ›
Saladoc

πŸ›
Salesforce Bob Lightning

πŸ›
Sam Carlberg

πŸ›
Satoshi Kubo

πŸ›
Scott Kennedy

πŸ›
Scott Wells

πŸ› πŸ’» -
Sebastian BΓΆgl

πŸ› +
Sebastian BΓΆgl

πŸ›
Sebastian Schuberth

πŸ›
Sebastian Schwarz

πŸ›
Sergey Gorbaty

πŸ›
Sergey Kozlov

πŸ›
Sergey Yanzin

πŸ’» πŸ›
Shubham

πŸ’» πŸ› -
Simon Xiao

πŸ› +
Simon Xiao

πŸ›
Srinivasan Venkatachalam

πŸ›
Stanislav Gromov

πŸ›
Stanislav Myachenkov

πŸ’»
Stefan Birkner

πŸ›
Stefan Bohn

πŸ›
Stefan Endrullis

πŸ› -
Stefan KlΓΆss-Schuster

πŸ› +
Stefan KlΓΆss-Schuster

πŸ›
Stefan Wolf

πŸ›
Stephan H. Wissel

πŸ›
Stephen

πŸ›
Stephen Friedrich

πŸ›
Steve Babula

πŸ’»
Stexxe

πŸ› -
Stian LΓ₯gstad

πŸ› +
Stian LΓ₯gstad

πŸ›
StuartClayton5

πŸ›
Supun Arunoda

πŸ›
Suren Abrahamyan

πŸ›
SwatiBGupta1110

πŸ›
SyedThoufich

πŸ›
Szymon Sasin

πŸ› -
T-chuangxin

πŸ› +
T-chuangxin

πŸ›
TERAI Atsuhiro

πŸ›
TIOBE Software

πŸ’» πŸ›
Taylor Smock

πŸ›
Techeira DamiΓ‘n

πŸ’» πŸ›
Ted Husted

πŸ›
TehBakker

πŸ› -
The Gitter Badger

πŸ› +
The Gitter Badger

πŸ›
Theodoor

πŸ›
Thiago Henrique HΓΌpner

πŸ›
Thibault Meyer

πŸ›
Thomas GΓΌttler

πŸ›
Thomas Jones-Low

πŸ›
Thomas Smith

πŸ’» πŸ› -
ThrawnCA

πŸ› +
ThrawnCA

πŸ›
Thunderforge

πŸ’» πŸ›
Tim van der Lippe

πŸ›
Tobias Weimer

πŸ’» πŸ›
Tom Daly

πŸ›
Tomer Figenblat

πŸ›
Tomi De Lucca

πŸ’» πŸ› -
Torsten Kleiber

πŸ› +
Torsten Kleiber

πŸ›
TrackerSB

πŸ›
Ullrich Hafner

πŸ›
Utku Cuhadaroglu

πŸ’» πŸ›
Valentin Brandl

πŸ›
Valeria

πŸ›
Vasily Anisimov

πŸ› -
Vickenty Fesunov

πŸ› +
Vickenty Fesunov

πŸ›
Victor NoΓ«l

πŸ› +
Vincent Galloy

πŸ’»
Vincent HUYNH

πŸ›
Vincent Maurin

πŸ›
Vincent Privat

πŸ›
Vishhwas

πŸ› -
Vitaly

πŸ› -
Vitaly Polonetsky

πŸ› +
Vitaly

πŸ› +
Vitaly Polonetsky

πŸ›
Vojtech Polivka

πŸ›
Vsevolod Zholobov

πŸ›
Wang Shidong

πŸ›
Waqas Ahmed

πŸ›
Wayne J. Earl

πŸ› -
Wchenghui

πŸ› -
Will Winder

πŸ› +
Wchenghui

πŸ› +
Will Winder

πŸ›
William Brockhus

πŸ’» πŸ›
Wilson Kurniawan

πŸ›
Wim Deblauwe

πŸ›
Woongsik Choi

πŸ›
XenoAmess

πŸ’» πŸ› -
Yang

πŸ’» -
YaroslavTER

πŸ› +
Yang

πŸ’» +
YaroslavTER

πŸ›
Young Chan

πŸ’» πŸ›
YuJin Kim

πŸ›
Yuri Dolzhenko

πŸ›
Yurii Dubinka

πŸ›
Zoltan Farkas

πŸ› -
Zustin

πŸ› -
aaronhurst-google

πŸ› +
Zustin

πŸ› +
aaronhurst-google

πŸ›
alexmodis

πŸ›
andreoss

πŸ›
andrey81inmd

πŸ’» πŸ›
anicoara

πŸ›
arunprasathav

πŸ› -
asiercamara

πŸ› -
astillich-igniti

πŸ’» +
asiercamara

πŸ› +
astillich-igniti

πŸ’»
avesolovksyy

πŸ›
avishvat

πŸ›
avivmu

πŸ›
axelbarfod1

πŸ›
b-3-n

πŸ› -
balbhadra9

πŸ› -
base23de

πŸ› +
balbhadra9

πŸ› +
base23de

πŸ›
bergander

πŸ›
berkam

πŸ’» πŸ›
breizh31

πŸ›
caesarkim

πŸ›
carolyujing

πŸ› -
cesares-basilico

πŸ› -
chrite

πŸ› +
cesares-basilico

πŸ› +
chrite

πŸ›
cobratbq

πŸ›
coladict

πŸ›
cosmoJFH

πŸ›
cristalp

πŸ›
crunsk

πŸ› -
cwholmes

πŸ› -
cyberjj999

πŸ› +
cwholmes

πŸ› +
cyberjj999

πŸ›
cyw3

πŸ›
d1ss0nanz

πŸ›
danbrycefairsailcom

πŸ›
dariansanity

πŸ›
darrenmiliband

πŸ› -
davidburstrom

πŸ› -
dbirkman-paloalto

πŸ› +
davidburstrom

πŸ› +
dbirkman-paloalto

πŸ›
deepak-patra

πŸ›
dependabot[bot]

πŸ’» πŸ›
dinesh150

πŸ›
diziaq

πŸ›
dreaminpast123

πŸ› -
duanyanan

πŸ› -
dutt-sanjay

πŸ› +
duanyanan

πŸ› +
dutt-sanjay

πŸ›
dylanleung

πŸ›
dzeigler

πŸ›
ekkirala

πŸ›
emersonmoura

πŸ›
fairy

πŸ› -
foxmason

πŸ› -
frankegabor

πŸ› +
foxmason

πŸ› +
frankegabor

πŸ›
frankl

πŸ›
freafrea

πŸ›
fsapatin

πŸ›
gracia19

πŸ›
guo fei

πŸ› -
gurmsc5

πŸ› -
gwilymatgearset

πŸ’» πŸ› +
gurmsc5

πŸ› +
gwilymatgearset

πŸ’» πŸ›
haigsn

πŸ›
hemanshu070

πŸ›
henrik242

πŸ›
hongpuwu

πŸ›
hvbtup

πŸ’» πŸ› -
igniti GmbH

πŸ› -
ilovezfs

πŸ› +
igniti GmbH

πŸ› +
ilovezfs

πŸ›
itaigilo

πŸ›
jakivey32

πŸ›
jbennett2091

πŸ›
jcamerin

πŸ›
jkeener1

πŸ› -
jmetertea

πŸ› -
johnra2

πŸ’» +
jmetertea

πŸ› +
johnra2

πŸ’»
josemanuelrolon

πŸ’» πŸ›
kabroxiko

πŸ’» πŸ›
karwer

πŸ›
kaulonline

πŸ›
kdaemonv

πŸ› -
kenji21

πŸ’» πŸ› -
kfranic

πŸ› +
kenji21

πŸ’» πŸ› +
kfranic

πŸ›
khalidkh

πŸ›
krzyk

πŸ›
lasselindqvist

πŸ›
lihuaib

πŸ›
lonelyma1021

πŸ› -
lpeddy

πŸ› -
lujiefsi

πŸ’» +
lpeddy

πŸ› +
lujiefsi

πŸ’»
lyriccoder

πŸ›
marcelmore

πŸ›
matchbox

πŸ›
matthiaskraaz

πŸ›
meandonlyme

πŸ› -
mikesive

πŸ› -
milossesic

πŸ› +
mikesive

πŸ› +
milossesic

πŸ›
mriddell95

πŸ›
mrlzh

πŸ›
msloan

πŸ›
mucharlaravalika

πŸ›
mvenneman

πŸ› -
nareshl119

πŸ› -
nicolas-harraudeau-sonarsource

πŸ› +
nareshl119

πŸ› +
nicolas-harraudeau-sonarsource

πŸ›
noerremark

πŸ›
novsirion

πŸ›
oggboy

πŸ›
oinume

πŸ›
orimarko

πŸ’» πŸ› -
pallavi agarwal

πŸ› -
parksungrin

πŸ› +
pallavi agarwal

πŸ› +
parksungrin

πŸ›
patpatpat123

πŸ›
patriksevallius

πŸ›
pbrajesh1

πŸ›
phoenix384

πŸ›
piotrszymanski-sc

πŸ’» -
plan3d

πŸ› -
poojasix

πŸ› +
plan3d

πŸ› +
poojasix

πŸ›
prabhushrikant

πŸ›
pujitha8783

πŸ›
r-r-a-j

πŸ›
raghujayjunk

πŸ›
rajeshveera

πŸ› -
rajeswarreddy88

πŸ› -
recdevs

πŸ› +
rajeswarreddy88

πŸ› +
recdevs

πŸ›
reudismam

πŸ’» πŸ›
rijkt

πŸ›
rillig-tk

πŸ›
rmohan20

πŸ’» πŸ›
rxmicro

πŸ› -
ryan-gustafson

πŸ’» πŸ› -
sabi0

πŸ› +
ryan-gustafson

πŸ’» πŸ› +
sabi0

πŸ›
scais

πŸ›
sebbASF

πŸ›
sergeygorbaty

πŸ’»
shilko2013

πŸ›
simeonKondr

πŸ› -
snajberk

πŸ› -
sniperrifle2004

πŸ› +
snajberk

πŸ› +
sniperrifle2004

πŸ›
snuyanzin

πŸ› πŸ’»
sratz

πŸ›
stonio

πŸ›
sturton

πŸ’» πŸ›
sudharmohan

πŸ› -
suruchidawar

πŸ› -
svenfinitiv

πŸ› +
suruchidawar

πŸ› +
svenfinitiv

πŸ›
tashiscool

πŸ›
test-git-hook

πŸ›
testation21

πŸ’» πŸ›
thanosa

πŸ›
tiandiyixian

πŸ› -
tobwoerk

πŸ› -
tprouvot

πŸ› +
tobwoerk

πŸ› +
tprouvot

πŸ›
trentchilders

πŸ›
triandicAnt

πŸ›
trishul14

πŸ›
tsui

πŸ›
winhkey

πŸ› -
witherspore

πŸ› -
wjljack

πŸ› +
witherspore

πŸ› +
wjljack

πŸ›
wuchiuwong

πŸ›
xingsong

πŸ›
xioayuge

πŸ›
xnYi9wRezm

πŸ’» πŸ›
xuanuy

πŸ› -
xyf0921

πŸ› -
yalechen-cyw3

πŸ› +
xyf0921

πŸ› +
yalechen-cyw3

πŸ›
yasuharu-sato

πŸ›
zenglian

πŸ›
zgrzyt93

πŸ’» πŸ›
zh3ng

πŸ›
zt_soft

πŸ› -
ztt79

πŸ› -
zzzzfeng

πŸ› +
ztt79

πŸ› +
zzzzfeng

πŸ›
ÁrpÑd MagosÑnyi

πŸ›
任贡杰

πŸ› diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index c194608353..4e81b4e6af 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -36,6 +36,8 @@ This is a {{ site.pmd.release_type }} release. * [#3683](https://github.com/pmd/pmd/pull/3683): \[java] Fixed 3468 UnusedPrivateMethod false positive when outer class calls private static method on inner class - [John Armgardt](https://github.com/johnra2) * [#3688](https://github.com/pmd/pmd/pull/3688): \[java] Bump log4j to 2.16.0 - [Sergey Nuyanzin](https://github.com/snuyanzin) * [#3693](https://github.com/pmd/pmd/pull/3693): \[apex] ApexDoc: Add reportProperty property - [Steve Babula](https://github.com/babula) +* [#3713](https://github.com/pmd/pmd/pull/3713): \[java] Enhance UnnecessaryModifier to support records - [Vincent Galloy](https://github.com/vgalloy) +* [#3719](https://github.com/pmd/pmd/pull/3719): \[java] Upgrade log4j to 2.17.1 - [Daniel Paul Searles](https://github.com/squaresurf) {% endtocmaker %} diff --git a/pmd-apex-jorje/pom.xml b/pmd-apex-jorje/pom.xml index dbfc5b9711..2c732c46dd 100644 --- a/pmd-apex-jorje/pom.xml +++ b/pmd-apex-jorje/pom.xml @@ -49,17 +49,17 @@ cglib cglib - 3.2.0 + 3.3.0 ch.qos.logback logback-classic - 1.2.3 + 1.2.9 ch.qos.logback logback-core - 1.2.3 + 1.2.9 com.google.code.findbugs @@ -69,7 +69,7 @@ com.google.code.gson gson - 2.7 + com.google.errorprone @@ -79,6 +79,7 @@ com.google.guava guava + com.google.j2objc @@ -112,12 +113,12 @@ org.slf4j slf4j-api - 1.7.20 + org.yaml snakeyaml - 1.26 + aopalliance diff --git a/pmd-core/pom.xml b/pmd-core/pom.xml index 1aa19c3272..0cece6914f 100644 --- a/pmd-core/pom.xml +++ b/pmd-core/pom.xml @@ -144,7 +144,6 @@ com.google.code.gson gson - 2.8.5 diff --git a/pmd-doc/pom.xml b/pmd-doc/pom.xml index 005c671b01..525890a786 100644 --- a/pmd-doc/pom.xml +++ b/pmd-doc/pom.xml @@ -98,7 +98,6 @@ org.yaml snakeyaml - 1.26 diff --git a/pmd-java/pom.xml b/pmd-java/pom.xml index 1996c27b27..05d7dc05cb 100644 --- a/pmd-java/pom.xml +++ b/pmd-java/pom.xml @@ -12,7 +12,7 @@ - 2.17.0 + 2.17.1 diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTRecordDeclaration.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTRecordDeclaration.java index f45133d327..238d898e2b 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTRecordDeclaration.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTRecordDeclaration.java @@ -55,6 +55,10 @@ public final class ASTRecordDeclaration extends AbstractAnyTypeDeclaration { return isNested() || isLocal(); } + public boolean isSyntacticallyFinal() { + return super.isFinal(); + } + @Override public boolean isFinal() { // A record is implicitly final diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryModifierRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryModifierRule.java index 1e68bc0ec4..808d89f370 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryModifierRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryModifierRule.java @@ -24,6 +24,7 @@ import net.sourceforge.pmd.lang.java.ast.ASTEnumDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTMethodOrConstructorDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTRecordDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTResource; import net.sourceforge.pmd.lang.java.ast.AccessNode; import net.sourceforge.pmd.lang.java.ast.internal.PrettyPrintingUtil; @@ -42,6 +43,7 @@ public class UnnecessaryModifierRule extends AbstractJavaRule { addRuleChainVisit(ASTFieldDeclaration.class); addRuleChainVisit(ASTAnnotationMethodDeclaration.class); addRuleChainVisit(ASTConstructorDeclaration.class); + addRuleChainVisit(ASTRecordDeclaration.class); } @@ -264,6 +266,17 @@ public class UnnecessaryModifierRule extends AbstractJavaRule { return data; } + @Override + public Object visit(ASTRecordDeclaration node, Object data) { + if (node.isStatic()) { + reportUnnecessaryModifiers(data, node, Modifier.STATIC, "records are implicitly static"); + } + if (node.isSyntacticallyFinal()) { + reportUnnecessaryModifiers(data, node, Modifier.FINAL, "records are implicitly final"); + } + return data; + } + private boolean isSafeVarargs(final ASTMethodDeclaration node) { return node.isAnnotationPresent(SafeVarargs.class.getName()); diff --git a/pmd-java/src/main/resources/category/java/codestyle.xml b/pmd-java/src/main/resources/category/java/codestyle.xml index 4c506e3b9f..cca8c46882 100644 --- a/pmd-java/src/main/resources/category/java/codestyle.xml +++ b/pmd-java/src/main/resources/category/java/codestyle.xml @@ -2062,6 +2062,12 @@ public class Bar { FOO; } } +public class FooClass { + static record BarRecord() {} // static ignored +} +public interface FooInterface { + static record BarRecord() {} // static ignored +} ]]> diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java16/LocalRecords.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java16/LocalRecords.txt index 6efe275077..6bb71f8b7a 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java16/LocalRecords.txt +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java16/LocalRecords.txt @@ -60,7 +60,7 @@ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = false, @ForeachVariable = false, @FormalParameter = true, @Image = "month", @LambdaParameter = false, @LocalVariable = false, @Name = "month", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "month"] | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = false] - | | +- RecordDeclaration[@Abstract = false, @BinaryName = "LocalRecords$MerchantSales", @Default = false, @Final = true, @Image = "MerchantSales", @Local = true, @Modifiers = 0, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "MerchantSales", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + | | +- RecordDeclaration[@Abstract = false, @BinaryName = "LocalRecords$MerchantSales", @Default = false, @Final = true, @Image = "MerchantSales", @Local = true, @Modifiers = 0, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "MerchantSales", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] | | +- RecordComponentList[@Size = 2] | | | +- RecordComponent[@Varargs = false] | | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "Merchant"] @@ -173,7 +173,7 @@ | | +- FormalParameters[@ParameterCount = 0, @Size = 0] | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = false] - | | +- RecordDeclaration[@Abstract = false, @BinaryName = "LocalRecords$MyRecord1", @Default = false, @Final = true, @Image = "MyRecord1", @Local = true, @Modifiers = 32, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "MyRecord1", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + | | +- RecordDeclaration[@Abstract = false, @BinaryName = "LocalRecords$MyRecord1", @Default = false, @Final = true, @Image = "MyRecord1", @Local = true, @Modifiers = 32, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "MyRecord1", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = true, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] | | +- RecordComponentList[@Size = 1] | | | +- RecordComponent[@Varargs = false] | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"] @@ -182,7 +182,7 @@ | | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = true, @ForeachVariable = false, @FormalParameter = false, @Image = "a", @LambdaParameter = false, @LocalVariable = false, @Name = "a", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "a"] | | +- RecordBody[] | +- BlockStatement[@Allocation = false] - | | +- RecordDeclaration[@Abstract = false, @BinaryName = "LocalRecords$MyRecord2", @Default = false, @Final = true, @Image = "MyRecord2", @Local = true, @Modifiers = 48, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "MyRecord2", @Static = true, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + | | +- RecordDeclaration[@Abstract = false, @BinaryName = "LocalRecords$MyRecord2", @Default = false, @Final = true, @Image = "MyRecord2", @Local = true, @Modifiers = 48, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "MyRecord2", @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = true, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] | | +- RecordComponentList[@Size = 1] | | | +- RecordComponent[@Varargs = false] | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"] @@ -194,7 +194,7 @@ | | +- Annotation[@AnnotationName = "Deprecated"] | | | +- MarkerAnnotation[@AnnotationName = "Deprecated"] | | | +- Name[@Image = "Deprecated"] - | | +- RecordDeclaration[@Abstract = false, @BinaryName = "LocalRecords$MyRecord3", @Default = false, @Final = true, @Image = "MyRecord3", @Local = true, @Modifiers = 0, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "MyRecord3", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + | | +- RecordDeclaration[@Abstract = false, @BinaryName = "LocalRecords$MyRecord3", @Default = false, @Final = true, @Image = "MyRecord3", @Local = true, @Modifiers = 0, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "MyRecord3", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] | | +- RecordComponentList[@Size = 1] | | | +- RecordComponent[@Varargs = false] | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"] @@ -206,7 +206,7 @@ | +- Annotation[@AnnotationName = "Deprecated"] | | +- MarkerAnnotation[@AnnotationName = "Deprecated"] | | +- Name[@Image = "Deprecated"] - | +- RecordDeclaration[@Abstract = false, @BinaryName = "LocalRecords$MyRecord4", @Default = false, @Final = true, @Image = "MyRecord4", @Local = true, @Modifiers = 48, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "MyRecord4", @Static = true, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + | +- RecordDeclaration[@Abstract = false, @BinaryName = "LocalRecords$MyRecord4", @Default = false, @Final = true, @Image = "MyRecord4", @Local = true, @Modifiers = 48, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "MyRecord4", @Static = true, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = true, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] | +- RecordComponentList[@Size = 1] | | +- RecordComponent[@Varargs = false] | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"] diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java16/Point.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java16/Point.txt index cdefd5c585..341c9f28da 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java16/Point.txt +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java16/Point.txt @@ -1,6 +1,6 @@ +- CompilationUnit[@PackageName = "", @declarationsAreInDefaultPackage = true] +- TypeDeclaration[] - +- RecordDeclaration[@Abstract = false, @BinaryName = "Point", @Default = false, @Final = true, @Image = "Point", @Local = false, @Modifiers = 1, @Native = false, @Nested = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "Point", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + +- RecordDeclaration[@Abstract = false, @BinaryName = "Point", @Default = false, @Final = true, @Image = "Point", @Local = false, @Modifiers = 1, @Native = false, @Nested = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "Point", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] +- RecordComponentList[@Size = 2] | +- RecordComponent[@Varargs = false] | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "int"] diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java16/Records.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java16/Records.txt index 19110e3cb8..dbdbaa18b7 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java16/Records.txt +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java16/Records.txt @@ -35,7 +35,7 @@ | +- AnnotationTypeDeclaration[@Abstract = false, @BinaryName = "Records$MyAnnotation", @Default = false, @Final = false, @Image = "MyAnnotation", @Local = false, @Modifiers = 0, @Native = false, @Nested = true, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "MyAnnotation", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.ANNOTATION, @Volatile = false] | +- AnnotationTypeBody[] +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.RECORD] - | +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$MyComplex", @Default = false, @Final = true, @Image = "MyComplex", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "MyComplex", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + | +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$MyComplex", @Default = false, @Final = true, @Image = "MyComplex", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "MyComplex", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] | +- RecordComponentList[@Size = 2] | | +- RecordComponent[@Varargs = false] | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "int"] @@ -113,7 +113,7 @@ | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] | | +- Name[@Image = "imaginary"] | +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.RECORD] - | | +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$MyComplex$Nested", @Default = false, @Final = true, @Image = "Nested", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "Nested", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + | | +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$MyComplex$Nested", @Default = false, @Final = true, @Image = "Nested", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "Nested", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] | | +- RecordComponentList[@Size = 1] | | | +- RecordComponent[@Varargs = false] | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "int"] @@ -124,7 +124,7 @@ | +- ClassOrInterfaceDeclaration[@Abstract = false, @BinaryName = "Records$MyComplex$NestedClass", @Default = false, @Final = false, @Image = "NestedClass", @Interface = false, @Local = false, @Modifiers = 17, @Native = false, @Nested = true, @NonSealed = false, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @Sealed = false, @SimpleName = "NestedClass", @Static = true, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.CLASS, @Volatile = false] | +- ClassOrInterfaceBody[@AnonymousInnerClass = false, @EnumChild = false] +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.RECORD] - | +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$Range", @Default = false, @Final = true, @Image = "Range", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "Range", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + | +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$Range", @Default = false, @Final = true, @Image = "Range", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "Range", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] | +- RecordComponentList[@Size = 2] | | +- RecordComponent[@Varargs = false] | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "int"] @@ -186,7 +186,7 @@ | | +- FormalParameters[@ParameterCount = 0, @Size = 0] | +- Block[@containsComment = false] +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.RECORD] - | +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$VarRec", @Default = false, @Final = true, @Image = "VarRec", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "VarRec", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + | +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$VarRec", @Default = false, @Final = true, @Image = "VarRec", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "VarRec", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] | +- RecordComponentList[@Size = 1] | | +- RecordComponent[@Varargs = true] | | +- Annotation[@AnnotationName = "Nullable"] @@ -204,7 +204,7 @@ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = false, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = true, @ForeachVariable = false, @FormalParameter = false, @Image = "x", @LambdaParameter = false, @LocalVariable = false, @Name = "x", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "x"] | +- RecordBody[] +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.RECORD] - | +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$ArrayRec", @Default = false, @Final = true, @Image = "ArrayRec", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "ArrayRec", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + | +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$ArrayRec", @Default = false, @Final = true, @Image = "ArrayRec", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "ArrayRec", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] | +- RecordComponentList[@Size = 1] | | +- RecordComponent[@Varargs = false] | | +- Type[@Array = true, @ArrayDepth = 1, @ArrayType = true, @TypeImage = "int"] @@ -213,7 +213,7 @@ | | +- VariableDeclaratorId[@Array = false, @ArrayDepth = 0, @ArrayType = true, @ExceptionBlockParameter = false, @ExplicitReceiverParameter = false, @Field = false, @Final = true, @ForeachVariable = false, @FormalParameter = false, @Image = "x", @LambdaParameter = false, @LocalVariable = false, @Name = "x", @PatternBinding = false, @ResourceDeclaration = false, @TypeInferred = false, @VariableName = "x"] | +- RecordBody[] +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.RECORD] - | +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$EmptyRec", @Default = false, @Final = true, @Image = "EmptyRec", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "EmptyRec", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + | +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$EmptyRec", @Default = false, @Final = true, @Image = "EmptyRec", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "EmptyRec", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] | +- TypeParameters[] | | +- TypeParameter[@Image = "Type", @Name = "Type", @ParameterName = "Type", @TypeBound = false] | +- RecordComponentList[@Size = 0] @@ -299,7 +299,7 @@ | +- MethodDeclarator[@Image = "lastName", @ParameterCount = 0] | +- FormalParameters[@ParameterCount = 0, @Size = 0] +- ClassOrInterfaceBodyDeclaration[@AnonymousInnerClass = false, @EnumChild = false, @Kind = DeclarationKind.RECORD] - +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$PersonRecord", @Default = false, @Final = true, @Image = "PersonRecord", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "PersonRecord", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + +- RecordDeclaration[@Abstract = false, @BinaryName = "Records$PersonRecord", @Default = false, @Final = true, @Image = "PersonRecord", @Local = false, @Modifiers = 1, @Native = false, @Nested = true, @PackagePrivate = false, @Private = false, @Protected = false, @Public = true, @SimpleName = "PersonRecord", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] +- RecordComponentList[@Size = 2] | +- RecordComponent[@Varargs = false] | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "String"] diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/EnhancedTypeCheckingSwitch.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/EnhancedTypeCheckingSwitch.txt index af55a74853..785fc5a864 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/EnhancedTypeCheckingSwitch.txt +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/EnhancedTypeCheckingSwitch.txt @@ -180,7 +180,7 @@ | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] | +- Name[@Image = "o"] +- TypeDeclaration[] - | +- RecordDeclaration[@Abstract = false, @BinaryName = "Point", @Default = false, @Final = true, @Image = "Point", @Local = false, @Modifiers = 0, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "Point", @Static = false, @Strictfp = false, @Synchronized = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] + | +- RecordDeclaration[@Abstract = false, @BinaryName = "Point", @Default = false, @Final = true, @Image = "Point", @Local = false, @Modifiers = 0, @Native = false, @Nested = false, @PackagePrivate = true, @Private = false, @Protected = false, @Public = false, @SimpleName = "Point", @Static = false, @Strictfp = false, @Synchronized = false, @SyntacticallyFinal = false, @Transient = false, @TypeKind = TypeKind.RECORD, @Volatile = false] | +- RecordComponentList[@Size = 2] | | +- RecordComponent[@Varargs = false] | | | +- Type[@Array = false, @ArrayDepth = 0, @ArrayType = false, @TypeImage = "int"] diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryModifier.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryModifier.xml index d1d7be5511..8ae474008a 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryModifier.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryModifier.xml @@ -695,6 +695,78 @@ public interface Bar { void method() { } static class Foo {} +} + ]]> + + + + Static is not necessary for record declaration in class + 1 + + Unnecessary modifier 'static' on record 'BarRecord': records are implicitly static + + + + + + Correct nested record declaration in classes + 0 + + + + + Static is not necessary for record declaration in interface + 1 + + Unnecessary modifier 'static' on record 'BarRecord': records are implicitly static + + + + + + Correct nested record declaration in interface + 0 + + + + + Final is not necessary for record declaration in class + 1 + + Unnecessary modifier 'final' on record 'BarRecord': records are implicitly final + + + + + + Final is not necessary for record declaration in interface + 1 + + Unnecessary modifier 'final' on record 'BarRecord': records are implicitly final + + diff --git a/pom.xml b/pom.xml index d0d3c35d2e..6d2b604d31 100644 --- a/pom.xml +++ b/pom.xml @@ -712,13 +712,24 @@ org.slf4j slf4j-api - 1.7.25 + 1.7.32 org.codehaus.groovy groovy 2.4.21 + + com.google.code.gson + gson + 2.8.9 + + + org.yaml + snakeyaml + 1.30 + + @@ -751,8 +762,8 @@ com.google.guava guava - - 30.0-android + + 31.0.1-android test