spotless icon indicating copy to clipboard operation
spotless copied to clipboard

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

Open adase11 opened this issue 1 year ago • 5 comments

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

adase11 avatar Jan 12 '24 15:01 adase11

I experience the same error, also when using a guarded case statement.

scampi avatar Mar 13 '24 09:03 scampi

Explicitly upgrading the Eclipse version resolved the issue for me:

<eclipse>
  <version>4.31</version>
</eclipse>

marcphilipp avatar Mar 19 '24 11:03 marcphilipp

This resolves the issue for me too, thanks!

scampi avatar Mar 20 '24 01:03 scampi

Thanks for he suggestion @marcphilipp I'm excited to give it a try tomorrow and remove the exclusion I put in to my config.

adase11 avatar Mar 20 '24 01:03 adase11

Confirmed it works for me. Thanks @marcphilipp !

adase11 avatar Mar 20 '24 12:03 adase11