diffplug / diffplug/spotless

IndexOutOfBoundsException on two Java Multi-line String constants

Aperta
#2,497 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Java
Stelle
5.6k
Fork
559
Merge medio
1g 14h
PR unite (30g)
43

Descrizione

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

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Riproduci il problema con due costanti stringa Java multilinea vuote usando Eclipse JDT formatter 4.10. Inizia da EclipseJdtFormatterStepImpl.format e segui lo stack attraverso DefaultCodeFormatter, WrapPreparator e TokenManager. Il lavoro è completato quando la formattazione dell'esempio non genera più IndexOutOfBoundsException.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
java
Ambito
tooling
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.