redhat-developer / redhat-developer/vscode-java

Formatting code using Java string literals fails.

オープン
#3,575 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

主要言語
TypeScript
スター
2.3k
フォーク
546
平均マージ
20時間 1分
マージ済み PR(30日)
11

説明

Formatting code using Java string literals fails.

Environment
  • Operating System: W11 23H2, Ubuntu 24.04
  • JDK version: OpenJDK 22 2024-03-19 (build 22+36-2370)
  • Java extension version: v1.30.2024041208 (pre-release)

code: 1.88.1 (system setup)
commit: e170252f762678dec6ca2cc69aba1570769a5d39
date: 2024-04-10T17:41:02.734Z
Electron: 28.2.8
ElectronBuildId: 27744544
Chromium: 120.0.6099.291
Node.js: 18.18.2
V8: 12.0.267.19-electron.0
OS: Windows_NT x64 10.0.22631

Steps To Reproduce
  1. git clone https://github.com/Kamilake/Switch
  2. Format Switch.java
[Error - 오전 9:41:44] Request textDocument/formatting failed.
  Message: Internal error.
  Code: -32603 
java.util.concurrent.CompletionException: java.lang.IndexOutOfBoundsException: Index 2983 out of bounds for length 2983
	at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source)
	at java.base/java.util.concurrent.CompletableFuture.completeThrowable(Unknown Source)
	at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(Unknown Source)
	at java.base/java.util.concurrent.CompletableFuture$Completion.exec(Unknown Source)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)
	at java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
Caused by: java.lang.IndexOutOfBoundsException: Index 2983 out of bounds for length 2983
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Unknown Source)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Unknown Source)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Unknown Source)
	at java.base/java.util.Objects.checkIndex(Unknown Source)
	at java.base/java.util.ArrayList.get(Unknown Source)
	at org.eclipse.jdt.internal.formatter.TokenManager.get(TokenManager.java:79)
	at org.eclipse.jdt.internal.formatter.TokenManager.findIndex(TokenManager.java:173)
	at org.eclipse.jdt.internal.formatter.TokenManager.firstIndexAfter(TokenManager.java:213)
	at org.eclipse.jdt.internal.formatter.linewrap.WrapPreparator.visit(WrapPreparator.java:756)
	at org.eclipse.jdt.core.dom.ConditionalExpression.accept0(ConditionalExpression.java:178)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:3334)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:3382)
	at org.eclipse.jdt.core.dom.StringTemplateComponent.accept0(StringTemplateComponent.java:216)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:3334)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:3405)
	at org.eclipse.jdt.core.dom.StringTemplateExpression.accept0(StringTemplateExpression.java:284)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:3334)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:3382)
	at org.eclipse.jdt.core.dom.ReturnStatement.accept0(ReturnStatement.java:128)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:3334)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:3405)
	at org.eclipse.jdt.core.dom.Block.accept0(Block.java:128)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:3334)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:3382)
	at org.eclipse.jdt.core.dom.IfStatement.accept0(IfStatement.java:182)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:3334)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:3405)
	at org.eclipse.jdt.core.dom.Block.accept0(Block.java:128)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:3334)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:3382)
	at org.eclipse.jdt.core.dom.MethodDeclaration.accept0(MethodDeclaration.java:677)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:3334)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:3405)
	at org.eclipse.jdt.core.dom.TypeDeclaration.accept0(TypeDeclaration.java:498)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:3334)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:3405)
	at org.eclipse.jdt.core.dom.CompilationUnit.accept0(CompilationUnit.java:258)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:3334)
	at org.eclipse.jdt.internal.formatter.DefaultCodeFormatter.prepareWraps(DefaultCodeFormatter.java:434)
	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:168)
	at org.eclipse.jdt.ls.core.internal.handlers.FormatterHandler.format(FormatterHandler.java:116)
	at org.eclipse.jdt.ls.core.internal.handlers.FormatterHandler.format(FormatterHandler.java:103)
	at org.eclipse.jdt.ls.core.internal.handlers.FormatterHandler.formatting(FormatterHandler.java:74)
	at org.eclipse.jdt.ls.core.internal.handlers.JDTLanguageServer.lambda$18(JDTLanguageServer.java:830)
	at org.eclipse.jdt.ls.core.internal.BaseJDTLanguageServer.lambda$0(BaseJDTLanguageServer.java:87)
	... 7 more
Current Result
public class Switch {
public static String handleSwitch(boolean enabled) {
return STR."{\"success\":\"true\", \"message\":\"Switch \{enabled ? "ON" : "OFF"}!\"}";}}
Expected Result
public class Switch {
    public static String handleSwitch(boolean enabled) {
        return STR."{\"success\":\"true\", \"message\":\"Switch \{enabled ? "ON" : "OFF"}!\"}";
    }
}
Additional Informations

If you need further information, please do not hesitate to contact me!

image

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

参照されている Switch.java ファイルで失敗を再現し、FormatterHandler.format から開始して、DefaultCodeFormatter と TokenManager を通るスタックを追跡します。Java の文字列テンプレートの例をフォーマットしても IndexOutOfBoundsException が発生せず、issue に示されている期待されるインデントが生成されれば、作業は完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
java, typescript
領域
tooling
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
45/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。