diffplug / diffplug/spotless

IndexOutOfBoundsException on two Java Multi-line String constants

Abierto
#2,497 0 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Java
Estrellas
5.7k
Forks
561
Merge medio
1 d 14 h
PR fusionados (30 d)
43

Descripción

Hi,
Spotless throws an Java Multi-line IndexOutOfBoundsException on two Java Multi-line String constants in a unit test. Even when they are empty.

```
private static final String TEST_ONE = """
""";

private static final String TEST_TWO = """
""";
```

Change either into a regular String and there is no problem. Here is the output:

```
[ERROR] Step 'eclipse jdt formatter' found problem in 'xxxxxxTest.java':
eclipse jdt formatter 4.10 is currently being used, but outdated.
eclipse jdt formatter 4.34 is the recommended version, which may have fixed this problem.
eclipse jdt formatter 4.34 requires JVM 17+.
java.lang.Exception: eclipse jdt formatter 4.10 is currently being used, but outdated.
eclipse jdt formatter 4.34 is the recommended version, which may have fixed this problem.
eclipse jdt formatter 4.34 requires JVM 17+.
at com.diffplug.spotless.Jvm$Support$1.apply (Jvm.java:211)
at com.diffplug.spotless.FormatterStepEqualityOnStateSerialization.format (FormatterStepEqualityOnStateSerialization.java:49)
at com.diffplug.spotless.Formatter.computeWithLint (Formatter.java:170)
at com.diffplug.spotless.DirtyState.of (DirtyState.java:97)
at com.diffplug.spotless.DirtyState.of (DirtyState.java:82)
at com.diffplug.spotless.DirtyState.of (DirtyState.java:77)
at com.diffplug.spotless.DirtyState.of (DirtyState.java:73)
at com.diffplug.spotless.maven.SpotlessCheckMojo.process (SpotlessCheckMojo.java:81)
at com.diffplug.spotless.maven.AbstractSpotlessMojo.execute (AbstractSpotlessMojo.java:255)
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:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:361)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
Caused by: 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:52)
at com.diffplug.spotless.FormatterFunc$NeedsFile.apply (FormatterFunc.java:174)
at com.diffplug.spotless.Jvm$Support$1.apply (Jvm.java:209)
at com.diffplug.spotless.FormatterStepEqualityOnStateSerialization.format (FormatterStepEqualityOnStateSerialization.java:49)
at com.diffplug.spotless.Formatter.computeWithLint (Formatter.java:170)
at com.diffplug.spotless.DirtyState.of (DirtyState.java:97)
at com.diffplug.spotless.DirtyState.of (DirtyState.java:82)
at com.diffplug.spotless.DirtyState.of (DirtyState.java:77)
at com.diffplug.spotless.DirtyState.of (DirtyState.java:73)
at com.diffplug.spotless.maven.SpotlessCheckMojo.process (SpotlessCheckMojo.java:81)
at com.diffplug.spotless.maven.AbstractSpotlessMojo.execute (AbstractSpotlessMojo.java:255)
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:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:361)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
Caused by: java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 751
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:365)
at java.util.ArrayList.get (ArrayList.java:428)
at org.eclipse.jdt.internal.formatter.TokenManager.get (TokenManager.java:71)
at org.eclipse.jdt.internal.formatter.TokenManager.lastTokenIn (TokenManager.java:192)
at org.eclipse.jdt.internal.formatter.linewrap.WrapPreparator.preVisit2 (WrapPreparator.java:215)
at org.eclipse.jdt.core.dom.ASTNode.accept (ASTNode.java:2813)
at org.eclipse.jdt.core.dom.ASTNode.acceptChildren (ASTNode.java:2886)
at org.eclipse.jdt.core.dom.FieldDeclaration.accept0 (FieldDeclaration.java:273)
at org.eclipse.jdt.core.dom.ASTNode.accept (ASTNode.java:2815)
at org.eclipse.jdt.core.dom.ASTNode.acceptChildren (ASTNode.java:2886)
at org.eclipse.jdt.core.dom.TypeDeclaration.accept0 (TypeDeclaration.java:447)
at org.eclipse.jdt.core.dom.ASTNode.accept (ASTNode.java:2815)
at org.eclipse.jdt.core.dom.ASTNode.acceptChildren (ASTNode.java:2886)
at org.eclipse.jdt.core.dom.CompilationUnit.accept0 (CompilationUnit.java:258)
at org.eclipse.jdt.core.dom.ASTNode.accept (ASTNode.java:2815)
at org.eclipse.jdt.internal.formatter.DefaultCodeFormatter.prepareWraps (DefaultCodeFormatter.java:432)
at org.eclipse.jdt.internal.formatter.DefaultCodeFormatter.prepareFormattedCode (DefaultCodeFormatter.java:230)
at org.eclipse.jdt.internal.formatter.DefaultCodeFormatter.format (DefaultCodeFormatter.java:184)
at org.eclipse.jdt.internal.formatter.DefaultCodeFormatter.format (DefaultCodeFormatter.java:166)
at com.diffplug.spotless.extra.glue.jdt.EclipseJdtFormatterStepImpl.format (EclipseJdtFormatterStepImpl.java:54)
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:52)
at com.diffplug.spotless.FormatterFunc$NeedsFile.apply (FormatterFunc.java:174)
at com.diffplug.spotless.Jvm$Support$1.apply (Jvm.java:209)
at com.diffplug.spotless.FormatterStepEqualityOnStateSerialization.format (FormatterStepEqualityOnStateSerialization.java:49)
at com.diffplug.spotless.Formatter.computeWithLint (Formatter.java:170)
at com.diffplug.spotless.DirtyState.of (DirtyState.java:97)
at com.diffplug.spotless.DirtyState.of (DirtyState.java:82)
at com.diffplug.spotless.DirtyState.of (DirtyState.java:77)
at com.diffplug.spotless.DirtyState.of (DirtyState.java:73)
at com.diffplug.spotless.maven.SpotlessCheckMojo.process (SpotlessCheckMojo.java:81)
at com.diffplug.spotless.maven.AbstractSpotlessMojo.execute (AbstractSpotlessMojo.java:255)
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:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:361)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
```

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Reproduce el fallo con dos constantes de cadena multilínea de Java vacías usando Eclipse JDT formatter 4.10. Empieza en EclipseJdtFormatterStepImpl.format y sigue la pila a través de DefaultCodeFormatter, WrapPreparator y TokenManager. Se considera terminado cuando formatear el ejemplo ya no lanza IndexOutOfBoundsException.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
java
Área
tooling
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.