redhat-developer / redhat-developer/vscode-java
Formatting code using Java string literals fails.
未关闭
还没有人认领这个 Issue。
- 主要语言
- TypeScript
- 星标
- 2.3k
- 派生
- 546
- 平均合并
- 20 小时 1 分钟
- 30 天内合并 PR
- 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
- git clone https://github.com/Kamilake/Switch
- 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!
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
使用所引用的 Switch.java 文件重现该失败,并从 FormatterHandler.format 开始,沿着经过 DefaultCodeFormatter 和 TokenManager 的堆栈进行跟踪。当格式化 Java 字符串模板示例时不再引发 IndexOutOfBoundsException,并生成 issue 中显示的预期缩进时,工作即完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- java, typescript
- 领域
- tooling
- Issue 类型
- 缺陷
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 45/100