google / google/google-java-format

IndexOutOfBoundsException - Wrong formatted content when dealing with latex String

Aperta
#1,439 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Java
Stelle
6.2k
Fork
937
Merge medio
6m
PR unite (30g)
3

Descrizione

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

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

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.

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à
Tranquilla
Chiarezza
Abbastanza chiara
Idoneità per principianti
55/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.