google / google/google-java-format

IndexOutOfBoundsException - Wrong formatted content when dealing with latex String

未关闭
#1,439 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Java
星标
6.2k
派生
937
平均合并
6 分钟
30 天内合并 PR
3

描述

Give this class
```java
package question;

class T {

private static final String JSON =
"{\n"
+ " \"a\": \"AAAAA AAA AAA AAA AA AAA AA AAAAA AA AAAAA AAA AAAA AAAA AA AAAA AAAA AAAAA AAAAA AAAAA AAAAA AAAAAA AAAAA AAAAAA AAAAA AAA at $-15.4{^{\\\\,\\\\circ}\\\\text{C}}$ BBB BBBBB BB BBB $42.7{^{\\\\,\\\\circ}\\\\text{C}}$?\\n\\n(CC CC CCC CC CCCCC CCC CCC CCC CCC CCC CC = $1.95\\\\;{\\\\text{J}/\\\\text{g}\\\\cdot{^{\\\\circ}\\\\text{C}}}$; DDD DDD DDDD DDDD DDDDD DDDD DDD DD DDDD = $1.18\\\\;{\\\\text{J}/\\\\text{g}\\\\cdot{^{\\\\circ}\\\\text{C}}}$C; $\\\\Delta H_\\\\text{fus}$ = 5.72 kJ/mol; normal freezing point, $T_f$ = $28.3{^{\\\\,\\\\circ}\\\\text{C}}$)\",\n"
+ " \"b\": \"*EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EEE.*\\n\\nFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F $-15.4^\\\\circ\\\\text C$ to $28.3^\\\\circ\\\\text C$.\\n\\\\[q=mc\\\\Delta T=(10.1\\\\;\\\\mathrm{g})(1.95\\\\;\\\\mathrm{J/g\\\\cdot °C})(28.3\\\\;\\\\mathrm{ °C}-(-15.4)\\\\;\\\\mathrm{ °C})=860.6715\\\\;\\\\mathrm{J} \\\\]\\n\\nGG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GGGGGGGGGGGGGGGGGGGGG.\\n\\\\[q=nH_{fus}=(\\\\frac{10.1\\\\;\\\\mathrm{g}}{67.44\\\\;\\\\mathrm{g/mol}})(5720\\\\;\\\\mathrm{J})=856.6429\\\\;\\\\mathrm{J}\\\\]\\n\\nHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH $28.3^\\\\circ\\\\text C$ to $42.7^\\\\circ\\\\text C$.\\n\\\\[q=mc\\\\Delta T=(10.1\\\\;\\\\mathrm{g})(1.18\\\\;\\\\mathrm{J/g\\\\cdot °C})(42.7\\\\;\\\\mathrm{ °C}-28.3\\\\;\\\\mathrm{ °C})=171.6192\\\\;\\\\mathrm{J}\\\\]\\n\\nIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.\\n\\\\[860.6715\\\\;\\\\mathrm{J}+856.6429\\\\;\\\\mathrm{J}+171.6192\\\\;\\\\mathrm{J}=1888.9336\\\\;\\\\mathrm{J}=1.89\\\\;\\\\mathrm{kJ}\\\\]\",\n"
+ "}";

private static final String JSON2 =
"{\n"
+ " \"a\": \"AAAAA AAA AAA AAA AA AAA AA AAAAA AA AAAAA AAA AAAA AAAA AA AAAA AAAA AAAAA AAAAA AAAAA AAAAA AAAAAA AAAAA AAAAAA AAAAA AAA at $-15.4{^{\\\\,\\\\circ}\\\\text{C}}$ BBB BBBBB BB BBB $42.7{^{\\\\,\\\\circ}\\\\text{C}}$?\\n\\n(CC CC CCC CC CCCCC CCC CCC CCC CCC CCC CC = $1.95\\\\;{\\\\text{J}/\\\\text{g}\\\\cdot{^{\\\\circ}\\\\text{C}}}$; DDD DDD DDDD DDDD DDDDD DDDD DDD DD DDDD = $1.18\\\\;{\\\\text{J}/\\\\text{g}\\\\cdot{^{\\\\circ}\\\\text{C}}}$C; $\\\\Delta H_\\\\text{fus}$ = 5.72 kJ/mol; normal freezing point, $T_f$ = $28.3{^{\\\\,\\\\circ}\\\\text{C}}$)\",\n"
+ " \"b\": \"*EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EEE.*\\n\\nFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F $-15.4^\\\\circ\\\\text C$ to $28.3^\\\\circ\\\\text C$.\\n\\\\[q=mc\\\\Delta T=(10.1\\\\;\\\\mathrm{g})(1.95\\\\;\\\\mathrm{J/g\\\\cdot °C})(28.3\\\\;\\\\mathrm{ °C}-(-15.4)\\\\;\\\\mathrm{ °C})=860.6715\\\\;\\\\mathrm{J} \\\\]\\n\\nGG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GGGGGGGGGGGGGGGGGGGGG.\\n\\\\[q=nH_{fus}=(\\\\frac{10.1\\\\;\\\\mathrm{g}}{67.44\\\\;\\\\mathrm{g/mol}})(5720\\\\;\\\\mathrm{J})=856.6429\\\\;\\\\mathrm{J}\\\\]\\n\\nHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH $28.3^\\\\circ\\\\text C$ to $42.7^\\\\circ\\\\text C$.\\n\\\\[q=mc\\\\Delta T=(10.1\\\\;\\\\mathrm{g})(1.18\\\\;\\\\mathrm{J/g\\\\cdot °C})(42.7\\\\;\\\\mathrm{ °C}-28.3\\\\;\\\\mathrm{ °C})=171.6192\\\\;\\\\mathrm{J}\\\\]\\n\\nIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.\\n\\\\[860.6715\\\\;\\\\mathrm{J}+856.6429\\\\;\\\\mathrm{J}+171.6192\\\\;\\\\mathrm{J}=1888.9336\\\\;\\\\mathrm{J}=1.89\\\\;\\\\mathrm{kJ}\\\\]\",\n"
+ "}";

public static void main(String[] args) {
System.out.println(JSON);
}

}
```

I ran the `main` method to ensure it is valid java source code
Image

But when trying to format it using GJF, I got
```
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 42 out of bounds for length 22
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:100)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
at java.base/java.util.Objects.checkIndex(Objects.java:385)
at java.base/java.util.ArrayList.get(ArrayList.java:427)
at java.base/java.util.Collections$UnmodifiableList.get(Collections.java:1502)
at com.google.googlejavaformat.java.FormatterException.formatDiagnostics(FormatterException.java:70)
at com.google.googlejavaformat.java.Main.formatFiles(Main.java:177)
at com.google.googlejavaformat.java.Main.format(Main.java:128)
at com.google.googlejavaformat.java.Main.main(Main.java:91)
at com.google.googlejavaformat.java.Main.main(Main.java:81)
at com.google.googlejavaformat.java.Main.main(Main.java:70)
```

Digging into the GJF, I found 2 issues:
1. The `com.google.googlejavaformat.java.StringWrapper#applyReplacements` give wrong result:
```java
package question;

class T {

private static final String JSON =
"{\n"
+ " \"a\": \"AAAAA AAA AAA AAA AA AAA AA AAAAA AA AAAAA AAA AAAA AAAA AA AAAA AAAA AAAAA"
+ " AAAAA AAAAA AAAAA AAAAAA AAAAA AAAAAA AAAAA AAA at $-15.4{^{\\\\,\\\\circ}\\\"
+ "\text{C}}$ BBB BBBBB BB BBB $42.7{^{\\\\,\\\\circ}\\\\text{C}}$?\\n"
+ "\\n"
+ "(CC CC CCC CC CCCCC CCC CCC CCC CCC CCC CC = $1.95\\\\;{\\\\text{J}/\\\"
+ "\text{g}\\\\cdot{^{\\\\circ}\\\\text{C}}}$; DDD DDD DDDD DDDD DDDDD DDDD DDD DD DDDD ="
+ " $1.18\\\\;{\\\\text{J}/\\\\text{g}\\\\cdot{^{\\\\circ}\\\\text{C}}}$C; $\\\\Delta"
+ " H_\\\\text{fus}$ = 5.72 kJ/mol; normal freezing point, $T_f$ ="
+ " $28.3{^{\\\\,\\\\circ}\\\\text{C}}$)\",\n"
+ " \"b\": \"*EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE"
+ " EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE"
+ " EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EEE.*\\n"
+ "\\n"
+ "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F"
+ " $-15.4^\\\\circ\\\\text C$ to $28.3^\\\\circ\\\\text C$.\\n"
+ "\\\\[q=mc\\\\Delta T=(10.1\\\\;\\\\mathrm{g})(1.95\\\\;\\\\mathrm{J/g\\\\cdot"
+ " °C})(28.3\\\\;\\\\mathrm{ °C}-(-15.4)\\\\;\\\\mathrm{ °C})=860.6715\\\\;\\\\mathrm{J}"
+ " \\\\]\\n"
+ "\\n"
+ "GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG"
+ " GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GGGGGGGGGGGGGGGGGGGGG.\\n"
+ "\\\\[q=nH_{fus}=(\\\\frac{10.1\\\\;\\\\mathrm{g}}{67.44\\\\;\\\\mathrm{g/mol}})(5720\\\\;\\\\mathrm{J})=856.6429\\\\;\\\\mathrm{J}\\\\]\\n"
+ "\\n"
+ "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH $28.3^\\\\circ\\\\text C$ to"
+ " $42.7^\\\\circ\\\\text C$.\\n"
+ "\\\\[q=mc\\\\Delta T=(10.1\\\\;\\\\mathrm{g})(1.18\\\\;\\\\mathrm{J/g\\\\cdot"
+ " °C})(42.7\\\\;\\\\mathrm{ °C}-28.3\\\\;\\\\mathrm{"
+ " °C})=171.6192\\\\;\\\\mathrm{J}\\\\]\\n"
+ "\\n"
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.\\n"
+ "\\\\[860.6715\\\\;\\\\mathrm{J}+856.6429\\\\;\\\\mathrm{J}+171.6192\\\\;\\\\mathrm{J}=1888.9336\\\\;\\\\mathrm{J}=1.89\\\\;\\\\mathrm{kJ}\\\\]\",\n"
+ "}";

private static final String JSON2 =
"{\n"
+ " \"a\": \"AAAAA AAA AAA AAA AA AAA AA AAAAA AA AAAAA AAA AAAA AAAA AA AAAA AAAA AAAAA"
+ " AAAAA AAAAA AAAAA AAAAAA AAAAA AAAAAA AAAAA AAA at $-15.4{^{\\\\,\\\\circ}\\\"
+ "\text{C}}$ BBB BBBBB BB BBB $42.7{^{\\\\,\\\\circ}\\\\text{C}}$?\\n"
+ "\\n"
+ "(CC CC CCC CC CCCCC CCC CCC CCC CCC CCC CC = $1.95\\\\;{\\\\text{J}/\\\"
+ "\text{g}\\\\cdot{^{\\\\circ}\\\\text{C}}}$; DDD DDD DDDD DDDD DDDDD DDDD DDD DD DDDD ="
+ " $1.18\\\\;{\\\\text{J}/\\\\text{g}\\\\cdot{^{\\\\circ}\\\\text{C}}}$C; $\\\\Delta"
+ " H_\\\\text{fus}$ = 5.72 kJ/mol; normal freezing point, $T_f$ ="
+ " $28.3{^{\\\\,\\\\circ}\\\\text{C}}$)\",\n"
+ " \"b\": \"*EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE"
+ " EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE"
+ " EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EEE.*\\n"
+ "\\n"
+ "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F"
+ " $-15.4^\\\\circ\\\\text C$ to $28.3^\\\\circ\\\\text C$.\\n"
+ "\\\\[q=mc\\\\Delta T=(10.1\\\\;\\\\mathrm{g})(1.95\\\\;\\\\mathrm{J/g\\\\cdot"
+ " °C})(28.3\\\\;\\\\mathrm{ °C}-(-15.4)\\\\;\\\\mathrm{ °C})=860.6715\\\\;\\\\mathrm{J}"
+ " \\\\]\\n"
+ "\\n"
+ "GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG"
+ " GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GGGGGGGGGGGGGGGGGGGGG.\\n"
+ "\\\\[q=nH_{fus}=(\\\\frac{10.1\\\\;\\\\mathrm{g}}{67.44\\\\;\\\\mathrm{g/mol}})(5720\\\\;\\\\mathrm{J})=856.6429\\\\;\\\\mathrm{J}\\\\]\\n"
+ "\\n"
+ "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH $28.3^\\\\circ\\\\text C$ to"
+ " $42.7^\\\\circ\\\\text C$.\\n"
+ "\\\\[q=mc\\\\Delta T=(10.1\\\\;\\\\mathrm{g})(1.18\\\\;\\\\mathrm{J/g\\\\cdot"
+ " °C})(42.7\\\\;\\\\mathrm{ °C}-28.3\\\\;\\\\mathrm{"
+ " °C})=171.6192\\\\;\\\\mathrm{J}\\\\]\\n"
+ "\\n"
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.\\n"
+ "\\\\[860.6715\\\\;\\\\mathrm{J}+856.6429\\\\;\\\\mathrm{J}+171.6192\\\\;\\\\mathrm{J}=1888.9336\\\\;\\\\mathrm{J}=1.89\\\\;\\\\mathrm{kJ}\\\\]\",\n"
+ "}";

public static void main(String[] args) {
System.out.println(JSON);
}
}
```
This result is completely not compilable
Image

2. `com.google.googlejavaformat.java.FormatterException#formatDiagnostics` using wrong param to format the diagnostics: It uses the original java content (22 lines intotal) instead of formatted java content (79 lines in total). That is why we getting IndexOutOfBoundsException

贡献指南

打开贡献指南

调研方向

Reproduce the failure with the supplied Java class, then inspect StringWrapper#applyReplacements and FormatterException#formatDiagnostics. Check the generated source and diagnostic line handling against the original input. Done means formatting no longer produces uncompilable Java and the formatter reports the error without IndexOutOfBoundsException.

由索引模型根据 Issue 内容生成。

评估

技术栈
java
领域
tooling
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
冷清
描述清晰度
基本清楚
新手友好度
55/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。