Skip to content

EclipseJdtFormatterStepImpl.format Of Java Switch Statements With Guarded Case Labels Throws Index Out Of Bounds Exception #1992

@adase11

Description

@adase11

Summary

For guarded case labels on switch statements using the when operator, the eclipse formatter throws an index out of bounds exception when processing the statement.

Maven version

Apache Maven 3.9.5

Spotless Version

spotless-maven-plugin
2.41.1

OS Version

macOS 14.2.1 (23C71)

Java Version

openjdk 21.0.1 2023-10-17 LTS
OpenJDK Runtime Environment Corretto-21.0.1.12.1 (build 21.0.1+12-LTS)
OpenJDK 64-Bit Server VM Corretto-21.0.1.12.1 (build 21.0.1+12-LTS, mixed mode, sharing)

Demo GitHub Repo

I created a repo that demonstrates this issue here:
https://github.com/adase11/maven-spotless-plugin-demo/tree/main

Error

[ERROR] Step 'eclipse jdt formatter' found problem in 'src/main/java/com.adase.demo/DemoSpotlessIssue.java':
null
java.lang.reflect.InvocationTargetException
    at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:118)
    at java.lang.reflect.Method.invoke (Method.java:580)
    at com.diffplug.spotless.extra.java.EclipseJdtFormatterStep.lambda$apply$0 (EclipseJdtFormatterStep.java:67)
    at com.diffplug.spotless.FormatterFunc$NeedsFile.apply (FormatterFunc.java:154)
    at com.diffplug.spotless.FormatterStepImpl$Standard.format (FormatterStepImpl.java:82)
    at com.diffplug.spotless.FormatterStep$Strict.format (FormatterStep.java:103)
    at com.diffplug.spotless.Formatter.compute (Formatter.java:246)
    at com.diffplug.spotless.PaddedCell.calculateDirtyState (PaddedCell.java:203)
    at com.diffplug.spotless.PaddedCell.calculateDirtyState (PaddedCell.java:190)
    at com.diffplug.spotless.maven.SpotlessApplyMojo.process (SpotlessApplyMojo.java:63)
    at com.diffplug.spotless.maven.AbstractSpotlessMojo.execute (AbstractSpotlessMojo.java:229)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
    at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
    at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
    at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
    at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
    at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:906)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:283)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:206)
    at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
    at java.lang.reflect.Method.invoke (Method.java:580)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:283)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:226)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:407)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:348)
    at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
    at java.lang.reflect.Method.invoke (Method.java:580)
    at org.apache.maven.wrapper.BootstrapMainStarter.start (BootstrapMainStarter.java:52)
    at org.apache.maven.wrapper.WrapperExecutor.execute (WrapperExecutor.java:161)
    at org.apache.maven.wrapper.MavenWrapperMain.main (MavenWrapperMain.java:73)
Caused by: java.lang.IndexOutOfBoundsException: Index 106 out of bounds for length 106
    at jdk.internal.util.Preconditions.outOfBounds (Preconditions.java:100)
    at jdk.internal.util.Preconditions.outOfBoundsCheckIndex (Preconditions.java:106)
    at jdk.internal.util.Preconditions.checkIndex (Preconditions.java:302)
    at java.util.Objects.checkIndex (Objects.java:385)
    at java.util.ArrayList.get (ArrayList.java:427)
    at org.eclipse.jdt.internal.formatter.TokenManager.get (TokenManager.java:77)
    at org.eclipse.jdt.internal.formatter.TokenManager.findIndex (TokenManager.java:170)
    at org.eclipse.jdt.internal.formatter.TokenManager.firstIndexAfter (TokenManager.java:206)
    at org.eclipse.jdt.internal.formatter.TokenManager.firstTokenAfter (TokenManager.java:210)
    at org.eclipse.jdt.internal.formatter.SpacePreparator.handleTokenAfter (SpacePreparator.java:1194)
    at org.eclipse.jdt.internal.formatter.SpacePreparator.visit (SpacePreparator.java:479)
    at org.eclipse.jdt.core.dom.GuardedPattern.accept0 (GuardedPattern.java:140)
    at org.eclipse.jdt.core.dom.ASTNode.accept (ASTNode.java:3254)
    at org.eclipse.jdt.core.dom.ASTNode.acceptChildren (ASTNode.java:3325)
    at org.eclipse.jdt.core.dom.SwitchCase.accept0 (SwitchCase.java:215)
    at org.eclipse.jdt.core.dom.ASTNode.accept (ASTNode.java:3254)
    at org.eclipse.jdt.core.dom.ASTNode.acceptChildren (ASTNode.java:3325)
    at org.eclipse.jdt.core.dom.SwitchExpression.accept0 (SwitchExpression.java:165)
    at org.eclipse.jdt.core.dom.ASTNode.accept (ASTNode.java:3254)
    at org.eclipse.jdt.core.dom.ASTNode.acceptChild (ASTNode.java:3302)
    at org.eclipse.jdt.core.dom.VariableDeclarationFragment.accept0 (VariableDeclarationFragment.java:238)
    at org.eclipse.jdt.core.dom.ASTNode.accept (ASTNode.java:3254)
    at org.eclipse.jdt.core.dom.ASTNode.acceptChildren (ASTNode.java:3325)
    at org.eclipse.jdt.core.dom.VariableDeclarationStatement.accept0 (VariableDeclarationStatement.java:254)
    at org.eclipse.jdt.core.dom.ASTNode.accept (ASTNode.java:3254)
    at org.eclipse.jdt.core.dom.ASTNode.acceptChildren (ASTNode.java:3325)
    at org.eclipse.jdt.core.dom.Block.accept0 (Block.java:128)
    at org.eclipse.jdt.core.dom.ASTNode.accept (ASTNode.java:3254)
    at org.eclipse.jdt.core.dom.ASTNode.acceptChild (ASTNode.java:3302)
    at org.eclipse.jdt.core.dom.MethodDeclaration.accept0 (MethodDeclaration.java:677)
    at org.eclipse.jdt.core.dom.ASTNode.accept (ASTNode.java:3254)
    at org.eclipse.jdt.core.dom.ASTNode.acceptChildren (ASTNode.java:3325)
    at org.eclipse.jdt.core.dom.TypeDeclaration.accept0 (TypeDeclaration.java:499)
    at org.eclipse.jdt.core.dom.ASTNode.accept (ASTNode.java:3254)
    at org.eclipse.jdt.core.dom.ASTNode.acceptChildren (ASTNode.java:3325)
    at org.eclipse.jdt.core.dom.CompilationUnit.accept0 (CompilationUnit.java:258)
    at org.eclipse.jdt.core.dom.ASTNode.accept (ASTNode.java:3254)
    at org.eclipse.jdt.internal.formatter.DefaultCodeFormatter.prepareSpaces (DefaultCodeFormatter.java:411)
    at org.eclipse.jdt.internal.formatter.DefaultCodeFormatter.prepareFormattedCode (DefaultCodeFormatter.java:228)
    at org.eclipse.jdt.internal.formatter.DefaultCodeFormatter.format (DefaultCodeFormatter.java:185)
    at org.eclipse.jdt.internal.formatter.DefaultCodeFormatter.format (DefaultCodeFormatter.java:167)
    at com.diffplug.spotless.extra.glue.jdt.EclipseJdtFormatterStepImpl.format (EclipseJdtFormatterStepImpl.java:51)
    at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
    at java.lang.reflect.Method.invoke (Method.java:580)
    at com.diffplug.spotless.extra.java.EclipseJdtFormatterStep.lambda$apply$0 (EclipseJdtFormatterStep.java:67)
    at com.diffplug.spotless.FormatterFunc$NeedsFile.apply (FormatterFunc.java:154)
    at com.diffplug.spotless.FormatterStepImpl$Standard.format (FormatterStepImpl.java:82)
    at com.diffplug.spotless.FormatterStep$Strict.format (FormatterStep.java:103)
    at com.diffplug.spotless.Formatter.compute (Formatter.java:246)
    at com.diffplug.spotless.PaddedCell.calculateDirtyState (PaddedCell.java:203)
    at com.diffplug.spotless.PaddedCell.calculateDirtyState (PaddedCell.java:190)
    at com.diffplug.spotless.maven.SpotlessApplyMojo.process (SpotlessApplyMojo.java:63)
    at com.diffplug.spotless.maven.AbstractSpotlessMojo.execute (AbstractSpotlessMojo.java:229)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
    at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
    at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
    at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
    at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
    at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:906)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:283)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:206)
    at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
    at java.lang.reflect.Method.invoke (Method.java:580)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:283)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:226)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:407)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:348)
    at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
    at java.lang.reflect.Method.invoke (Method.java:580)
    at org.apache.maven.wrapper.BootstrapMainStarter.start (BootstrapMainStarter.java:52)
    at org.apache.maven.wrapper.WrapperExecutor.execute (WrapperExecutor.java:161)
    at org.apache.maven.wrapper.MavenWrapperMain.main (MavenWrapperMain.java:73)

https://docs.oracle.com/javase/specs/jls/se21/html/jls-14.html#jls-SwitchBlock

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions