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?");
+ }
+ }
+ }
+ ]]>