diff --git a/.all-contributorsrc b/.all-contributorsrc index 2f0b8518278..531090e31db 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -6548,6 +6548,15 @@ "code", "doc" ] + }, + { + "login": "karel1980", + "name": "Karel Vervaeke", + "avatar_url": "https://avatars.githubusercontent.com/u/153021?v=4", + "profile": "https://github.com/karel1980", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, diff --git a/docs/pages/pmd/projectdocs/credits.md b/docs/pages/pmd/projectdocs/credits.md index ed44926c632..517369a6bd9 100644 --- a/docs/pages/pmd/projectdocs/credits.md +++ b/docs/pages/pmd/projectdocs/credits.md @@ -370,568 +370,569 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
JΓΆrn Huxhorn

πŸ›
KThompso

πŸ›
Kai Amundsen

πŸ› +
Karel Vervaeke

πŸ›
Karl-Andero Mere

πŸ› -
Karl-Philipp Richter

πŸ› +
Karl-Philipp Richter

πŸ›
Karsten Silz

πŸ›
Kazuma Watanabe

πŸ›
Kev

πŸ›
Keve MΓΌller

πŸ›
Kevin Guerra

πŸ’»
Kevin Jones

πŸ› -
Kevin Wayne

πŸ› +
Kevin Wayne

πŸ›
Kieran Black

πŸ›
Kirill Zubov

πŸ›
Kirk Clemens

πŸ’» πŸ›
Klaus Hartl

πŸ›
Koen Van Looveren

πŸ›
Kris Scheibe

πŸ’» πŸ› -
Kunal Thanki

πŸ› +
Kunal Thanki

πŸ›
Larry Diamond

πŸ’» πŸ›
Lars Knickrehm

πŸ›
Leo Gutierrez

πŸ›
Lintsi

πŸ›
Linus Fernandes

πŸ›
Lixon Lookose

πŸ› -
Logesh

πŸ› +
Logesh

πŸ›
Lorenzo Gabriele

πŸ›
LoΓ―c Ledoyen

πŸ›
Lucas Silva

πŸ›
Lucas Soncini

πŸ’» πŸ›
Lukasz Slonina

πŸ›
Lukebray

πŸ› -
Lyor Goldstein

πŸ› +
Lyor Goldstein

πŸ›
MCMicS

πŸ›
Macarse

πŸ›
Machine account for PMD

πŸ’»
Maciek Siemczyk

πŸ›
Maikel Steneker

πŸ’» πŸ›
Maksim Moiseikin

πŸ› -
Manfred Koch

πŸ› +
Manfred Koch

πŸ›
Manuel Moya Ferrer

πŸ’» πŸ›
Manuel Ryan

πŸ›
Marat Vyshegorodtsev

πŸ›
Marcel HΓ€rle

πŸ›
Marcello Fialho

πŸ›
Marcin Rataj

πŸ› -
Mark Adamcin

πŸ› +
Mark Adamcin

πŸ›
Mark Hall

πŸ’» πŸ›
Mark Kolich

πŸ›
Mark Pritchard

πŸ›
Markus Rathgeb

πŸ›
Marquis Wang

πŸ›
Martin Feldsztejn

πŸ› -
Martin Lehmann

πŸ› +
Martin Lehmann

πŸ›
Martin Spamer

πŸ›
Martin TarjΓ‘nyi

πŸ›
MatFl

πŸ›
Mateusz Stefanski

πŸ›
Mathieu Gouin

πŸ›
MatiasComercio

πŸ’» πŸ› -
Matt Benson

πŸ› +
Matt Benson

πŸ›
Matt De Poorter

πŸ›
Matt Harrah

πŸ›
Matt Nelson

πŸ›
Matthew Amos

πŸ›
Matthew Duggan

πŸ›
Matthew Hall

πŸ› -
MatΓ­as Fraga

πŸ’» πŸ› +
MatΓ­as Fraga

πŸ’» πŸ›
Maxime Robert

πŸ’» πŸ›
Michael

πŸ›
Michael Bell

πŸ›
Michael Bernstein

πŸ›
Michael Clay

πŸ›
Michael Dombrowski

πŸ› -
Michael Hausegger

πŸ› +
Michael Hausegger

πŸ›
Michael Hoefer

πŸ›
Michael MΓΆbius

πŸ›
Michael N. Lipp

πŸ›
Michael Pellegrini

πŸ›
Michal Kordas

πŸ›
MichaΕ‚ Borek

πŸ› -
MichaΕ‚ KuliΕ„ski

πŸ› +
MichaΕ‚ KuliΕ„ski

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

πŸ›
Mihai Ionut

πŸ›
Mirek Hankus

πŸ›
Mladjan Gadzic

πŸ›
MrAngry52

πŸ›
Muminur Choudhury

πŸ› -
Mykhailo Palahuta

πŸ’» πŸ› +
Mykhailo Palahuta

πŸ’» πŸ›
Nagendra Kumar Singh

πŸ›
Nahuel Barrios

πŸ›
Nathan Braun

πŸ›
Nathan Reynolds

πŸ›
Nathan Reynolds

πŸ›
NathanaΓ«l

πŸ› -
Nazdravi

πŸ› +
Nazdravi

πŸ›
Neha-Dhonde

πŸ›
Nicholas Doyle

πŸ›
Nick Butcher

πŸ›
Nico Gallinal

πŸ›
Nicola Dal Maso

πŸ›
Nicolas Filotto

πŸ’» -
Nikita Chursin

πŸ› +
Nikita Chursin

πŸ›
Niklas Baudy

πŸ›
Nikolas Havrikov

πŸ›
Nilesh Virkar

πŸ›
Nimit Patel

πŸ›
Niranjan Harpale

πŸ›
Noah Sussman

πŸ› -
Noah0120

πŸ› +
Noah0120

πŸ›
Noam Tamim

πŸ›
Noel Grandin

πŸ›
Olaf Haalstra

πŸ›
Oleg Pavlenko

πŸ›
Oleksii Dykov

πŸ’»
Oliver Eikemeier

πŸ› -
Olivier Parent

πŸ’» πŸ› +
Olivier Parent

πŸ’» πŸ›
Ollie Abbey

πŸ’» πŸ›
OverDrone

πŸ›
Ozan Gulle

πŸ’» πŸ›
PUNEET JAIN

πŸ›
Parbati Bose

πŸ›
Paul Berg

πŸ› -
Pavel Bludov

πŸ› +
Pavel Bludov

πŸ›
Pavel Mička

πŸ›
Pedro Nuno Santos

πŸ›
Pedro Rijo

πŸ›
Pelisse Romain

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

πŸ›
Peter Bruin

πŸ› -
Peter Chittum

πŸ’» πŸ› +
Peter Chittum

πŸ’» πŸ›
Peter Cudmore

πŸ›
Peter Kasson

πŸ›
Peter Kofler

πŸ›
Pham Hai Trung

πŸ›
Philip Graf

πŸ’» πŸ›
Philip Hachey

πŸ› -
Philippe Ozil

πŸ› +
Philippe Ozil

πŸ›
Phinehas Artemix

πŸ›
Phokham Nonava

πŸ›
Piotr SzymaΕ„ski

πŸ›
Piotrek Ε»ygieΕ‚o

πŸ’» πŸ›
Pranay Jaiswal

πŸ›
Prasad Kamath

πŸ› -
Prasanna

πŸ› +
Prasanna

πŸ›
Presh-AR

πŸ›
Puneet1726

πŸ›
Rafael CortΓͺs

πŸ›
RaheemShaik999

πŸ›
RajeshR

πŸ’» πŸ›
Ramachandra Mohan

πŸ› -
Raquel Pau

πŸ› +
Raquel Pau

πŸ›
Ravikiran Janardhana

πŸ›
Reda Benhemmouche

πŸ›
Renato Oliveira

πŸ’» πŸ›
Rich DiCroce

πŸ›
Riot R1cket

πŸ›
Rishabh Jain

πŸ› -
RishabhDeep Singh

πŸ› +
RishabhDeep Singh

πŸ›
Robbie Martinus

πŸ’» πŸ›
Robert Henry

πŸ›
Robert Painsi

πŸ›
Robert Russell

πŸ›
Robert SΓΆsemann

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

πŸ› -
Robin Richtsfeld

πŸ› +
Robin Richtsfeld

πŸ›
Robin Stocker

πŸ’» πŸ›
Robin Wils

πŸ›
RochusOest

πŸ›
Rodolfo Noviski

πŸ›
Rodrigo Casara

πŸ›
Rodrigo Fernandes

πŸ› -
Roman Salvador

πŸ’» πŸ› +
Roman Salvador

πŸ’» πŸ›
Ronald Blaschke

πŸ›
RΓ³bert Papp

πŸ›
Saikat Sengupta

πŸ›
Saksham Handu

πŸ›
Saladoc

πŸ›
Salesforce Bob Lightning

πŸ› -
Sam Carlberg

πŸ› +
Sam Carlberg

πŸ›
Satoshi Kubo

πŸ›
Scott Kennedy

πŸ›
Scott Wells

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

πŸ›
Sebastian Schuberth

πŸ›
Sebastian Schwarz

πŸ› -
Sergey Gorbaty

πŸ› +
Sergey Gorbaty

πŸ›
Sergey Kozlov

πŸ›
Sergey Yanzin

πŸ’» πŸ›
Shubham

πŸ’» πŸ›
Simon Xiao

πŸ›
Srinivasan Venkatachalam

πŸ›
Stanislav Gromov

πŸ› -
Stanislav Myachenkov

πŸ’» +
Stanislav Myachenkov

πŸ’»
Stefan Birkner

πŸ›
Stefan Bohn

πŸ›
Stefan Endrullis

πŸ›
Stefan KlΓΆss-Schuster

πŸ›
Stefan Wolf

πŸ›
Stephan H. Wissel

πŸ› -
Stephen

πŸ› +
Stephen

πŸ›
Stephen Friedrich

πŸ›
Steve Babula

πŸ’»
Stexxe

πŸ›
Stian LΓ₯gstad

πŸ›
StuartClayton5

πŸ›
Supun Arunoda

πŸ› -
Suren Abrahamyan

πŸ› +
Suren Abrahamyan

πŸ›
SwatiBGupta1110

πŸ›
SyedThoufich

πŸ›
Szymon Sasin

πŸ›
T-chuangxin

πŸ›
TERAI Atsuhiro

πŸ›
TIOBE Software

πŸ’» πŸ› -
Taylor Smock

πŸ› +
Taylor Smock

πŸ›
Techeira DamiΓ‘n

πŸ’» πŸ›
Ted Husted

πŸ›
TehBakker

πŸ›
The Gitter Badger

πŸ›
Theodoor

πŸ›
Thiago Henrique HΓΌpner

πŸ› -
Thibault Meyer

πŸ› +
Thibault Meyer

πŸ›
Thomas GΓΌttler

πŸ›
Thomas Jones-Low

πŸ›
Thomas Smith

πŸ’» πŸ›
ThrawnCA

πŸ›
Thunderforge

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

πŸ› -
Tobias Weimer

πŸ’» πŸ› +
Tobias Weimer

πŸ’» πŸ›
Tom Daly

πŸ›
Tomer Figenblat

πŸ›
Tomi De Lucca

πŸ’» πŸ›
Torsten Kleiber

πŸ›
TrackerSB

πŸ›
Ullrich Hafner

πŸ› -
Utku Cuhadaroglu

πŸ’» πŸ› +
Utku Cuhadaroglu

πŸ’» πŸ›
Valentin Brandl

πŸ›
Valeria

πŸ›
Vasily Anisimov

πŸ›
Vickenty Fesunov

πŸ›
Victor NoΓ«l

πŸ›
Vincent Galloy

πŸ’» -
Vincent HUYNH

πŸ› +
Vincent HUYNH

πŸ›
Vincent Maurin

πŸ›
Vincent Privat

πŸ›
Vishhwas

πŸ›
Vitaly

πŸ›
Vitaly Polonetsky

πŸ›
Vojtech Polivka

πŸ› -
Vsevolod Zholobov

πŸ› +
Vsevolod Zholobov

πŸ›
Vyom Yadav

πŸ’»
Wang Shidong

πŸ›
Waqas Ahmed

πŸ›
Wayne J. Earl

πŸ›
Wchenghui

πŸ›
Will Winder

πŸ› -
William Brockhus

πŸ’» πŸ› +
William Brockhus

πŸ’» πŸ›
Wilson Kurniawan

πŸ›
Wim Deblauwe

πŸ›
Woongsik Choi

πŸ›
XenoAmess

πŸ’» πŸ›
Yang

πŸ’»
YaroslavTER

πŸ› -
Young Chan

πŸ’» πŸ› +
Young Chan

πŸ’» πŸ›
YuJin Kim

πŸ›
Yuri Dolzhenko

πŸ›
Yurii Dubinka

πŸ›
Zoltan Farkas

πŸ›
Zustin

πŸ›
aaronhurst-google

πŸ› -
alexmodis

πŸ› +
alexmodis

πŸ›
andreoss

πŸ›
andrey81inmd

πŸ’» πŸ›
anicoara

πŸ›
arunprasathav

πŸ›
asiercamara

πŸ›
astillich-igniti

πŸ’» -
avesolovksyy

πŸ› +
avesolovksyy

πŸ›
avishvat

πŸ›
avivmu

πŸ›
axelbarfod1

πŸ›
b-3-n

πŸ›
balbhadra9

πŸ›
base23de

πŸ› -
bergander

πŸ› +
bergander

πŸ›
berkam

πŸ’» πŸ›
breizh31

πŸ›
caesarkim

πŸ›
carolyujing

πŸ›
cesares-basilico

πŸ›
chrite

πŸ› -
cobratbq

πŸ› +
cobratbq

πŸ›
coladict

πŸ›
cosmoJFH

πŸ›
cristalp

πŸ›
crunsk

πŸ›
cwholmes

πŸ›
cyberjj999

πŸ› -
cyw3

πŸ› +
cyw3

πŸ›
d1ss0nanz

πŸ›
danbrycefairsailcom

πŸ›
dariansanity

πŸ›
darrenmiliband

πŸ›
davidburstrom

πŸ›
dbirkman-paloalto

πŸ› -
deepak-patra

πŸ› +
deepak-patra

πŸ›
dependabot[bot]

πŸ’» πŸ›
dinesh150

πŸ›
diziaq

πŸ›
dreaminpast123

πŸ›
duanyanan

πŸ›
dutt-sanjay

πŸ› -
dylanleung

πŸ› +
dylanleung

πŸ›
dzeigler

πŸ›
ekkirala

πŸ›
emersonmoura

πŸ›
fairy

πŸ›
foxmason

πŸ›
frankegabor

πŸ› -
frankl

πŸ› +
frankl

πŸ›
freafrea

πŸ›
fsapatin

πŸ›
gracia19

πŸ›
guo fei

πŸ›
gurmsc5

πŸ›
gwilymatgearset

πŸ’» πŸ› -
haigsn

πŸ› +
haigsn

πŸ›
hemanshu070

πŸ›
henrik242

πŸ›
hongpuwu

πŸ›
hvbtup

πŸ’» πŸ›
igniti GmbH

πŸ›
ilovezfs

πŸ› -
itaigilo

πŸ› +
itaigilo

πŸ›
jakivey32

πŸ›
jbennett2091

πŸ›
jcamerin

πŸ›
jkeener1

πŸ›
jmetertea

πŸ›
johnra2

πŸ’» -
josemanuelrolon

πŸ’» πŸ› +
josemanuelrolon

πŸ’» πŸ›
kabroxiko

πŸ’» πŸ›
karwer

πŸ›
kaulonline

πŸ›
kdaemonv

πŸ›
kenji21

πŸ’» πŸ›
kfranic

πŸ› -
khalidkh

πŸ› +
khalidkh

πŸ›
krzyk

πŸ›
lasselindqvist

πŸ›
lihuaib

πŸ›
lonelyma1021

πŸ›
lpeddy

πŸ›
lujiefsi

πŸ’» -
lyriccoder

πŸ› +
lyriccoder

πŸ›
marcelmore

πŸ›
matchbox

πŸ›
matthiaskraaz

πŸ›
meandonlyme

πŸ›
mikesive

πŸ›
milossesic

πŸ› -
mriddell95

πŸ› +
mriddell95

πŸ›
mrlzh

πŸ›
msloan

πŸ›
mucharlaravalika

πŸ›
mvenneman

πŸ›
nareshl119

πŸ›
nicolas-harraudeau-sonarsource

πŸ› -
noerremark

πŸ› +
noerremark

πŸ›
novsirion

πŸ›
oggboy

πŸ›
oinume

πŸ›
orimarko

πŸ’» πŸ›
pallavi agarwal

πŸ›
parksungrin

πŸ› -
patpatpat123

πŸ› +
patpatpat123

πŸ›
patriksevallius

πŸ›
pbrajesh1

πŸ›
phoenix384

πŸ›
piotrszymanski-sc

πŸ’»
plan3d

πŸ›
poojasix

πŸ› -
prabhushrikant

πŸ› +
prabhushrikant

πŸ›
pujitha8783

πŸ›
r-r-a-j

πŸ›
raghujayjunk

πŸ›
rajeshveera

πŸ›
rajeswarreddy88

πŸ›
recdevs

πŸ› -
reudismam

πŸ’» πŸ› +
reudismam

πŸ’» πŸ›
rijkt

πŸ›
rillig-tk

πŸ›
rmohan20

πŸ’» πŸ›
rxmicro

πŸ›
ryan-gustafson

πŸ’» πŸ›
sabi0

πŸ› -
scais

πŸ› +
scais

πŸ›
sebbASF

πŸ›
sergeygorbaty

πŸ’»
shilko2013

πŸ›
simeonKondr

πŸ›
snajberk

πŸ›
sniperrifle2004

πŸ› -
snuyanzin

πŸ› πŸ’» +
snuyanzin

πŸ› πŸ’»
sratz

πŸ›
stonio

πŸ›
sturton

πŸ’» πŸ›
sudharmohan

πŸ›
suruchidawar

πŸ›
svenfinitiv

πŸ› -
tashiscool

πŸ› +
tashiscool

πŸ›
test-git-hook

πŸ›
testation21

πŸ’» πŸ›
thanosa

πŸ›
tiandiyixian

πŸ›
tobwoerk

πŸ›
tprouvot

πŸ› -
trentchilders

πŸ› +
trentchilders

πŸ›
triandicAnt

πŸ›
trishul14

πŸ›
tsui

πŸ›
winhkey

πŸ›
witherspore

πŸ›
wjljack

πŸ› -
wuchiuwong

πŸ› +
wuchiuwong

πŸ›
xingsong

πŸ›
xioayuge

πŸ›
xnYi9wRezm

πŸ’» πŸ›
xuanuy

πŸ›
xyf0921

πŸ›
yalechen-cyw3

πŸ› -
yasuharu-sato

πŸ› +
yasuharu-sato

πŸ›
zenglian

πŸ›
zgrzyt93

πŸ’» πŸ›
zh3ng

πŸ›
zt_soft

πŸ›
ztt79

πŸ›
zzzzfeng

πŸ› -
ÁrpÑd MagosÑnyi

πŸ› +
ÁrpÑd MagosÑnyi

πŸ›
任贡杰

πŸ› diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 7170ec4680e..d8915ee29a9 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -22,6 +22,8 @@ This is a {{ site.pmd.release_type }} release. * [#2502](https://github.com/pmd/pmd/issues/2502): \[doc] Add floating table-of-contents (toc) on the right * java * [#3698](https://github.com/pmd/pmd/issues/3697): \[java] Parsing error with try-with-resources and qualified resource +* java-bestpractices + * [#3605](https://github.com/pmd/pmd/issues/3605): \[java] SwitchStmtsShouldHaveDefault triggered when default case is present * java-codestyle * [#278](https://github.com/pmd/pmd/issues/278): \[java] ConfusingTernary should treat `!= null` as positive condition * java-performance diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatement.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatement.java index 6a019966d9a..7ba203ac7f7 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatement.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatement.java @@ -4,7 +4,9 @@ package net.sourceforge.pmd.lang.java.ast; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Set; import org.apache.commons.lang3.EnumUtils; @@ -99,9 +101,28 @@ public boolean isExhaustiveEnumSwitch() { return false; } + /** + * Returns true if this a switch which uses fallthrough branches + * (old school {@code case label: break;}) and not arrow branches. + * If the switch has no branches, returns false. + */ + public boolean isFallthroughSwitch() { + return getFirstChildOfType(ASTSwitchLabel.class) != null + && getNumChildren() != 1; + } @Override public Iterator iterator() { - return new NodeChildrenIterator<>(this, ASTSwitchLabel.class); + List result = new ArrayList<>(findChildrenOfType(ASTSwitchLabel.class)); + for (ASTSwitchLabeledBlock labeled : findChildrenOfType(ASTSwitchLabeledBlock.class)) { + result.add((ASTSwitchLabel) labeled.getChild(0)); + } + for (ASTSwitchLabeledExpression labeled : findChildrenOfType(ASTSwitchLabeledExpression.class)) { + result.add((ASTSwitchLabel) labeled.getChild(0)); + } + for (ASTSwitchLabeledThrowStatement labeled : findChildrenOfType(ASTSwitchLabeledThrowStatement.class)) { + result.add((ASTSwitchLabel) labeled.getChild(0)); + } + return result.iterator(); } } diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatementTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatementTest.java index 5915a67c3d4..47cc6c770ec 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatementTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatementTest.java @@ -17,5 +17,52 @@ public void exhaustiveEnumSwitchWithDefault() { .get(0); Assert.assertFalse(switchStatement.isExhaustiveEnumSwitch()); // this should not throw a NPE... Assert.assertTrue(switchStatement.hasDefaultCase()); + Assert.assertTrue(switchStatement.isFallthroughSwitch()); + } + + @Test + public void defaultCaseWithArrowBlock() { + ASTSwitchStatement switchStatement = java.parse( + "class Foo { void bar(int x) {" + + "switch (x) { default -> { } } } }") + .getFirstDescendantOfType(ASTSwitchStatement.class); + Assert.assertFalse(switchStatement.isExhaustiveEnumSwitch()); + Assert.assertTrue(switchStatement.iterator().hasNext()); + Assert.assertTrue(switchStatement.hasDefaultCase()); + Assert.assertFalse(switchStatement.isFallthroughSwitch()); + } + + @Test + public void emptySwitch() { + ASTSwitchStatement switchStatement = java.parse( + "class Foo { void bar(int x) {" + + "switch (x) { } } }") + .getFirstDescendantOfType(ASTSwitchStatement.class); + Assert.assertFalse(switchStatement.isExhaustiveEnumSwitch()); + Assert.assertFalse(switchStatement.iterator().hasNext()); + Assert.assertFalse(switchStatement.hasDefaultCase()); + Assert.assertFalse(switchStatement.isFallthroughSwitch()); + } + + @Test + public void defaultCaseWithArrowExprs() { + ASTSwitchStatement switchStatement = + java.parse( + "import net.sourceforge.pmd.lang.java.rule.bestpractices.switchstmtsshouldhavedefault.SimpleEnum;\n" + + "\n" + + " public class Foo {\n" + + " void bar(SimpleEnum x) {\n" + + " switch (x) {\n" + + " case FOO -> System.out.println(\"it is on\");\n" + + " case BAR -> System.out.println(\"it is off\");\n" + + " default -> System.out.println(\"it is neither on nor off - should not happen? maybe null?\");\n" + + " }\n" + + " }\n" + + " }") + .getFirstDescendantOfType(ASTSwitchStatement.class); + Assert.assertFalse(switchStatement.isExhaustiveEnumSwitch()); + Assert.assertTrue(switchStatement.iterator().hasNext()); + Assert.assertFalse(switchStatement.isFallthroughSwitch()); + Assert.assertTrue(switchStatement.hasDefaultCase()); } } diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/AllJavaAstTreeDumpTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/AllJavaAstTreeDumpTest.java new file mode 100644 index 00000000000..0e0207ce48a --- /dev/null +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/AllJavaAstTreeDumpTest.java @@ -0,0 +1,22 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.java.ast; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ + ParserCornersTest.class, + Java15TreeDumpTest.class, + Java16PreviewTreeDumpTest.class, + Java16TreeDumpTest.class, + Java17PreviewTreeDumpTest.class, + Java17TreeDumpTest.class +}) +public class AllJavaAstTreeDumpTest { + +} diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/DealingWithNull.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/DealingWithNull.txt index fdbf6313502..f7395cff4e0 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/DealingWithNull.txt +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/DealingWithNull.txt @@ -15,7 +15,7 @@ | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = false] | +- Statement[] - | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | +- Expression[@StandAlonePrimitive = false] | | +- PrimaryExpression[] | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] @@ -82,7 +82,7 @@ | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = true] | +- Statement[] - | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | +- Expression[@StandAlonePrimitive = false] | | +- PrimaryExpression[] | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] @@ -167,7 +167,7 @@ | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = false] | | +- Statement[] - | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false] + | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = true] | | +- Expression[@StandAlonePrimitive = false] | | | +- PrimaryExpression[] | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] @@ -219,7 +219,7 @@ | | +- BreakStatement[] | +- BlockStatement[@Allocation = false] | | +- Statement[] - | | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | | +- Expression[@StandAlonePrimitive = false] | | | +- PrimaryExpression[] | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] @@ -262,7 +262,7 @@ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = ""default case"", @FloatLiteral = false, @Image = ""default case"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = ""default case"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0] | +- BlockStatement[@Allocation = false] | | +- Statement[] - | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false] + | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = true] | | +- Expression[@StandAlonePrimitive = false] | | | +- PrimaryExpression[] | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] @@ -289,7 +289,7 @@ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = ""The rest (including null)"", @FloatLiteral = false, @Image = ""The rest (including null)"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = ""The rest (including null)"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0] | +- BlockStatement[@Allocation = false] | +- Statement[] - | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | +- Expression[@StandAlonePrimitive = false] | | +- PrimaryExpression[] | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] 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 785fc5a8642..d5ea56fdf2b 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 @@ -15,7 +15,7 @@ | | +- Block[@containsComment = false] | | +- BlockStatement[@Allocation = false] | | +- Statement[] - | | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | | +- Expression[@StandAlonePrimitive = false] | | | +- PrimaryExpression[] | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/GuardedAndParenthesizedPatterns.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/GuardedAndParenthesizedPatterns.txt index f42b4508351..028f55ff39b 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/GuardedAndParenthesizedPatterns.txt +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/GuardedAndParenthesizedPatterns.txt @@ -15,7 +15,7 @@ | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = false] | +- Statement[] - | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | +- Expression[@StandAlonePrimitive = false] | | +- PrimaryExpression[] | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/ScopeOfPatternVariableDeclarations.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/ScopeOfPatternVariableDeclarations.txt index 2d8dd4158ee..1a11900d392 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/ScopeOfPatternVariableDeclarations.txt +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/ScopeOfPatternVariableDeclarations.txt @@ -15,7 +15,7 @@ | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = true] | +- Statement[] - | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | +- Expression[@StandAlonePrimitive = false] | | +- PrimaryExpression[] | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] @@ -113,7 +113,7 @@ | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = false] | +- Statement[] - | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false] + | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = true] | +- Expression[@StandAlonePrimitive = false] | | +- PrimaryExpression[] | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/SwitchStmtsShouldHaveDefault.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/SwitchStmtsShouldHaveDefault.xml index 0ecf6177f15..a6b767069c6 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/SwitchStmtsShouldHaveDefault.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/SwitchStmtsShouldHaveDefault.xml @@ -79,6 +79,88 @@ public class Foo { } } } - ]]> + ]]> + + + #3605 switch on enum with default + 0 + + + + #3605 switch on enum with default, nonexhaustive + 0 + + + + #3605 switch on enum with default, nonexhaustive, arrow + 0 + System.out.println("it is on"); + case BAR -> System.out.println("it is off"); + default -> System.out.println("it is neither on nor off - should not happen? maybe null?"); + } + } + } + ]]> + + + #3605 switch on enum with default, exhaustive, arrow + 0 + System.out.println("it is on"); + case BAR -> System.out.println("it is off"); + case BZAZ -> System.out.println("it is bzaz"); + default -> System.out.println("it is neither on nor off - should not happen? maybe null?"); + } + } + } + ]]>