diffplug / diffplug/spotless

IndexOutOfBoundsException on two Java Multi-line String constants

Ouverte
#2,497 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
Java
Étoiles
5.7k
Forks
561
Merge moyen
1 j 14 h
PR mergées (30 j)
43

Description

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)
```

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Reproduisez l’échec avec deux constantes de chaînes Java multilignes vides à l’aide de Eclipse JDT formatter 4.10. Commencez par EclipseJdtFormatterStepImpl.format et suivez la pile à travers DefaultCodeFormatter, WrapPreparator et TokenManager. C’est terminé lorsque le formatage de l’exemple ne lève plus IndexOutOfBoundsException.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
java
Domaine
tooling
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.