-
-
Notifications
You must be signed in to change notification settings - Fork 4.1k
Record pattern causes checkstyle to fail in JDK 20 (preview) #13279
Copy link
Copy link
Closed
Description
I have read check documentation: https://checkstyle.org/config_xxxxxx.html#NameOfAffectedCheck
I have downloaded the latest checkstyle from: https://checkstyle.org/cmdline.html#Download_and_Run
I have executed the cli and showed it below, as cli describes the problem better than 1,000 words
king@Joses-Mac-mini test % javac --enable-preview --source=20 DeconstructionBug.java
Note: DeconstructionBug.java uses preview features of Java SE 20.
Note: Recompile with -Xlint:preview for details.
king@Joses-Mac-mini test % cat checkstyle.xml
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value="module\-info\.java$"/>
</module>
<module name="SuppressionSingleFilter">
<property name="files" value="[/\\]target[/\\]"/>
<property name="checks" value=".*"/>
</module>
<module name="TreeWalker">
<module name="InvalidJavadocPosition"/>
<module name="JavadocBlockTagLocation"/>
<module name="JavadocContentLocationCheck"/>
<module name="JavadocMethod"/>
<module name="JavadocMissingLeadingAsterisk"/>
<module name="JavadocMissingWhitespaceAfterAsterisk"/>
<!-- <module name="JavadocParagraph"/>-->
<module name="JavadocStyle"/>
<module name="JavadocTagContinuationIndentation">
<property name="offset" value="1"/>
</module>
<module name="JavadocType"/>
<module name="JavadocVariable">
<property name="scope" value="protected"/>
</module>
<module name="MissingJavadocMethod"/>
<module name="MissingJavadocType"/>
<module name="NonEmptyAtclauseDescription"/>
<module name="RequireEmptyLineBeforeBlockTagGroup"/>
<module name="SingleLineJavadoc">
<property name="ignoreInlineTags" value="false"/>
</module>
<!-- <module name="SummaryJavadocCheck"/>-->
<!-- <module name="WriteTag"/>-->
</module>
<!-- <module name="JavadocPackage"/>-->
</module>
king@Joses-Mac-mini test % cat DeconstructionBug.java
import java.util.ArrayList;
import java.util.List;
public class DeconstructionBug
{
public record InnerRecord(String a, String b)
{
}
public DeconstructionBug()
{
List<InnerRecord> aList = new ArrayList<>(1);
aList.add(new InnerRecord("a", "b"));
for (InnerRecord(String a, String b) : aList)
{
System.out.println(a);
System.out.println(b);
}
}
}
king@Joses-Mac-mini test % RUN_LOCALE="-Duser.language=en -Duser.country=US"
king@Joses-Mac-mini test % java $RUN_LOCALE -jar ~/Downloads/checkstyle-10.12.0-all.jar -c checkstyle.xml DeconstructionBug.java
Starting audit...
com.puppycrawl.tools.checkstyle.api.CheckstyleException: Exception was thrown while processing DeconstructionBug.java
at com.puppycrawl.tools.checkstyle.Checker.processFiles(Checker.java:306)
at com.puppycrawl.tools.checkstyle.Checker.process(Checker.java:223)
at com.puppycrawl.tools.checkstyle.Main.runCheckstyle(Main.java:415)
at com.puppycrawl.tools.checkstyle.Main.runCli(Main.java:338)
at com.puppycrawl.tools.checkstyle.Main.execute(Main.java:195)
at com.puppycrawl.tools.checkstyle.Main.main(Main.java:130)
Caused by: com.puppycrawl.tools.checkstyle.api.CheckstyleException: IllegalStateException occurred while parsing file /Users/king/Projects/test/DeconstructionBug.java.
at com.puppycrawl.tools.checkstyle.JavaParser.parse(JavaParser.java:105)
at com.puppycrawl.tools.checkstyle.TreeWalker.processFiltered(TreeWalker.java:152)
at com.puppycrawl.tools.checkstyle.api.AbstractFileSetCheck.process(AbstractFileSetCheck.java:98)
at com.puppycrawl.tools.checkstyle.Checker.processFile(Checker.java:334)
at com.puppycrawl.tools.checkstyle.Checker.processFiles(Checker.java:293)
... 5 more
Caused by: java.lang.IllegalStateException: 13:11: mismatched input '(' expecting ';'
at com.puppycrawl.tools.checkstyle.JavaParser$CheckstyleErrorListener.syntaxError(JavaParser.java:255)
at org.antlr.v4.runtime.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41)
at org.antlr.v4.runtime.Parser.notifyErrorListeners(Parser.java:544)
at org.antlr.v4.runtime.DefaultErrorStrategy.reportInputMismatch(DefaultErrorStrategy.java:327)
at org.antlr.v4.runtime.DefaultErrorStrategy.reportError(DefaultErrorStrategy.java:139)
at com.puppycrawl.tools.checkstyle.CheckstyleParserErrorStrategy.recoverInline(CheckstyleParserErrorStrategy.java:38)
at org.antlr.v4.runtime.Parser.match(Parser.java:208)
at com.puppycrawl.tools.checkstyle.grammar.java.JavaLanguageParser.statement(JavaLanguageParser.java:7036)
at com.puppycrawl.tools.checkstyle.grammar.java.JavaLanguageParser.blockStatement(JavaLanguageParser.java:6197)
at com.puppycrawl.tools.checkstyle.grammar.java.JavaLanguageParser.constructorBlock(JavaLanguageParser.java:5910)
at com.puppycrawl.tools.checkstyle.grammar.java.JavaLanguageParser.constructorDeclaration(JavaLanguageParser.java:3068)
at com.puppycrawl.tools.checkstyle.grammar.java.JavaLanguageParser.memberDeclaration(JavaLanguageParser.java:2758)
at com.puppycrawl.tools.checkstyle.grammar.java.JavaLanguageParser.classBodyDeclaration(JavaLanguageParser.java:2670)
at com.puppycrawl.tools.checkstyle.grammar.java.JavaLanguageParser.classBody(JavaLanguageParser.java:2476)
at com.puppycrawl.tools.checkstyle.grammar.java.JavaLanguageParser.classDeclaration(JavaLanguageParser.java:1095)
at com.puppycrawl.tools.checkstyle.grammar.java.JavaLanguageParser.types(JavaLanguageParser.java:752)
at com.puppycrawl.tools.checkstyle.grammar.java.JavaLanguageParser.typeDeclaration(JavaLanguageParser.java:666)
at com.puppycrawl.tools.checkstyle.grammar.java.JavaLanguageParser.compilationUnit(JavaLanguageParser.java:413)
at com.puppycrawl.tools.checkstyle.JavaParser.parse(JavaParser.java:99)
... 9 more
Caused by: org.antlr.v4.runtime.InputMismatchException
... 23 more
Checkstyle ends with 1 errors.Currently using a record pattern deconstruction in a for loop causes checkstyle to fail. The error message from checkstyle does not indicate the line where the deconstruction is used, but several lines before it.
Changing the example code from
for (InnerRecord(String a, String b) : aList)
{
System.out.println(a);
System.out.println(b);
}to one without deconstruction
for (var innerRecord : aList)
{
System.out.println(innerRecord.a());
System.out.println(innerRecord.b());
}king@Joses-Mac-mini test % java $RUN_LOCALE -jar ~/Downloads/checkstyle-10.12.0-all.jar -c checkstyle.xml DeconstructionBug.java
Starting audit...
[ERROR] /Users/king/Projects/test/DeconstructionBug.java:4:1: Missing a Javadoc comment. [MissingJavadocType]
[ERROR] /Users/king/Projects/test/DeconstructionBug.java:6:9: Missing a Javadoc comment. [MissingJavadocType]
[ERROR] /Users/king/Projects/test/DeconstructionBug.java:10:9: Missing a Javadoc comment. [MissingJavadocMethod]Reactions are currently unavailable