Skip to content

Record pattern causes checkstyle to fail in JDK 20 (preview) #13279

@jace516

Description

@jace516

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]

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions