Skip to content

Commit 06c2905

Browse files
cushonError Prone Team
authored andcommitted
Consolidate usage of EndPosTable in Error Prone
This internal API may be changing, this refactoring starts to prepare for handling the breaking change. PiperOrigin-RevId: 839691795
1 parent b553126 commit 06c2905

File tree

15 files changed

+203
-68
lines changed

15 files changed

+203
-68
lines changed

check_api/src/main/java/com/google/errorprone/JavacErrorDescriptionListener.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
import com.google.common.collect.ImmutableList;
2323
import com.google.common.collect.ImmutableSet;
2424
import com.google.errorprone.fixes.AppliedFix;
25+
import com.google.errorprone.fixes.ErrorProneEndPosTable;
2526
import com.google.errorprone.fixes.Fix;
2627
import com.google.errorprone.matchers.Description;
2728
import com.sun.source.tree.ImportTree;
28-
import com.sun.tools.javac.tree.EndPosTable;
2929
import com.sun.tools.javac.util.Context;
3030
import com.sun.tools.javac.util.JCDiagnostic;
3131
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
@@ -68,7 +68,7 @@ public class JavacErrorDescriptionListener implements DescriptionListener {
6868

6969
private JavacErrorDescriptionListener(
7070
Log log,
71-
EndPosTable endPositions,
71+
ErrorProneEndPosTable endPositions,
7272
JavaFileObject sourceFile,
7373
Context context,
7474
boolean dontUseErrors) {
@@ -169,12 +169,20 @@ private static String messageForFixes(Description description, List<AppliedFix>
169169
static Factory provider(Context context) {
170170
return (log, compilation) ->
171171
new JavacErrorDescriptionListener(
172-
log, compilation.endPositions, compilation.getSourceFile(), context, false);
172+
log,
173+
ErrorProneEndPosTable.create(compilation),
174+
compilation.getSourceFile(),
175+
context,
176+
false);
173177
}
174178

175179
static Factory providerForRefactoring(Context context) {
176180
return (log, compilation) ->
177181
new JavacErrorDescriptionListener(
178-
log, compilation.endPositions, compilation.getSourceFile(), context, true);
182+
log,
183+
ErrorProneEndPosTable.create(compilation),
184+
compilation.getSourceFile(),
185+
context,
186+
true);
179187
}
180188
}

check_api/src/main/java/com/google/errorprone/apply/DescriptionBasedDiff.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
import static com.google.common.base.Preconditions.checkNotNull;
2020

2121
import com.google.errorprone.DescriptionListener;
22+
import com.google.errorprone.fixes.ErrorProneEndPosTable;
2223
import com.google.errorprone.fixes.Fix;
2324
import com.google.errorprone.fixes.Replacement;
2425
import com.google.errorprone.fixes.Replacements;
2526
import com.google.errorprone.matchers.Description;
26-
import com.sun.tools.javac.tree.EndPosTable;
2727
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
2828
import java.net.URI;
2929
import java.nio.file.Paths;
@@ -46,7 +46,7 @@ public final class DescriptionBasedDiff implements DescriptionListener, Diff {
4646
private final JCCompilationUnit compilationUnit;
4747
private final Set<String> importsToAdd;
4848
private final Set<String> importsToRemove;
49-
private final EndPosTable endPositions;
49+
private final ErrorProneEndPosTable endPositions;
5050
private final Replacements replacements = new Replacements();
5151
private final ImportOrganizer importOrganizer;
5252

@@ -73,7 +73,7 @@ private DescriptionBasedDiff(
7373
this.ignoreOverlappingFixes = ignoreOverlappingFixes;
7474
this.importsToAdd = new LinkedHashSet<>();
7575
this.importsToRemove = new LinkedHashSet<>();
76-
this.endPositions = compilationUnit.endPositions;
76+
this.endPositions = ErrorProneEndPosTable.create(compilationUnit);
7777
this.importOrganizer = importOrganizer;
7878
}
7979

check_api/src/main/java/com/google/errorprone/apply/ImportStatements.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@
1616

1717
package com.google.errorprone.apply;
1818

19+
import static com.google.errorprone.fixes.ErrorProneEndPosTable.getEndPosition;
20+
1921
import com.google.common.base.CharMatcher;
2022
import com.google.common.base.Preconditions;
2123
import com.google.common.collect.ImmutableSet;
2224
import com.google.common.collect.Lists;
2325
import com.google.errorprone.annotations.CanIgnoreReturnValue;
24-
import com.sun.tools.javac.tree.EndPosTable;
2526
import com.sun.tools.javac.tree.JCTree;
2627
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
2728
import com.sun.tools.javac.tree.JCTree.JCExpression;
@@ -58,31 +59,29 @@ public static ImportStatements create(
5859
return new ImportStatements(
5960
(JCExpression) compilationUnit.getPackageName(),
6061
compilationUnit.getImports(),
61-
compilationUnit.endPositions,
62+
compilationUnit,
6263
importOrganizer);
6364
}
6465

6566
ImportStatements(
6667
JCExpression packageTree,
6768
List<? extends JCTree> importTrees,
68-
EndPosTable endPositions,
69+
JCCompilationUnit unit,
6970
ImportOrganizer importOrganizer) {
7071

7172
// find start, end positions for current list of imports (for replacement)
7273
if (importTrees.isEmpty()) {
7374
// start/end positions are just after the package expression
7475
hasExistingImports = false;
75-
startPos =
76-
packageTree != null
77-
? packageTree.getEndPosition(endPositions) + 2 // +2 for semicolon and newline
78-
: 0;
76+
// +2 for semicolon and newline
77+
startPos = packageTree != null ? getEndPosition(packageTree, unit) + 2 : 0;
7978
endPos = startPos;
8079
} else {
8180
// process list of imports and find start/end positions
8281
hasExistingImports = true;
8382
for (JCTree importTree : importTrees) {
8483
int currStartPos = importTree.getStartPosition();
85-
int currEndPos = importTree.getEndPosition(endPositions);
84+
int currEndPos = getEndPosition(importTree, unit);
8685

8786
startPos = Math.min(startPos, currStartPos);
8887
endPos = Math.max(endPos, currEndPos);

check_api/src/main/java/com/google/errorprone/fixes/AdjustedPosition.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@
1818

1919
import com.sun.tools.javac.tree.EndPosTable;
2020
import com.sun.tools.javac.tree.JCTree;
21-
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
2221

2322
/** Describes a tree position with adjustments to the start and end indices. */
24-
public class AdjustedPosition implements DiagnosticPosition {
23+
public class AdjustedPosition implements ErrorPronePosition {
2524
protected final JCTree position;
2625
protected final int startPositionAdjustment;
2726
protected final int endPositionAdjustment;
@@ -51,4 +50,9 @@ public int getPreferredPosition() {
5150
public int getEndPosition(EndPosTable endPositions) {
5251
return position.getEndPosition(endPositions) + endPositionAdjustment;
5352
}
53+
54+
@Override
55+
public int getEndPosition(ErrorProneEndPosTable endPositions) {
56+
return endPositions.getEndPosition(position) + endPositionAdjustment;
57+
}
5458
}

check_api/src/main/java/com/google/errorprone/fixes/AppliedFix.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import com.google.common.collect.ImmutableSet;
2222
import com.google.common.collect.Range;
23-
import com.sun.tools.javac.tree.EndPosTable;
2423
import java.util.ArrayList;
2524
import java.util.Collection;
2625
import java.util.List;
@@ -39,7 +38,7 @@ public record AppliedFix(String snippet, boolean isRemoveLine) {
3938
* to the source, or a change only to imports.
4039
*/
4140
public static @Nullable AppliedFix apply(
42-
CharSequence source, EndPosTable endPositions, Fix suggestedFix) {
41+
CharSequence source, ErrorProneEndPosTable endPositions, Fix suggestedFix) {
4342
// We apply the replacements in ascending order here. Descending is simpler, since applying a
4443
// replacement can't change the index for future replacements, but it leads to quadratic
4544
// copying behavior as we constantly shift the tail of the file around in our StringBuilder.
@@ -91,7 +90,8 @@ private static String snippet(
9190
return firstEditedLine(replaced, shiftedReplacements.getFirst());
9291
}
9392

94-
public static String applyReplacements(CharSequence source, EndPosTable endPositions, Fix fix) {
93+
public static String applyReplacements(
94+
CharSequence source, ErrorProneEndPosTable endPositions, Fix fix) {
9595
return applyReplacements(source, fix.getReplacements(endPositions));
9696
}
9797

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Copyright 2025 The Error Prone Authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.google.errorprone.fixes;
18+
19+
import com.sun.source.tree.CompilationUnitTree;
20+
import com.sun.source.tree.Tree;
21+
import com.sun.tools.javac.tree.EndPosTable;
22+
import com.sun.tools.javac.tree.JCTree;
23+
import com.sun.tools.javac.util.JCDiagnostic;
24+
25+
/** A compatibility wrapper around {@link EndPosTable}. */
26+
public interface ErrorProneEndPosTable {
27+
28+
static ErrorProneEndPosTable create(CompilationUnitTree unit) {
29+
EndPosTable endPosTable = ((JCTree.JCCompilationUnit) unit).endPositions;
30+
return pos -> pos.getEndPosition(endPosTable);
31+
}
32+
33+
static ErrorProneEndPosTable create(EndPosTable endPosTable) {
34+
return pos -> pos.getEndPosition(endPosTable);
35+
}
36+
37+
default int getEndPosition(Tree tree) {
38+
return getEndPosition((JCDiagnostic.DiagnosticPosition) tree);
39+
}
40+
41+
default int getEndPosition(JCTree tree) {
42+
return getEndPosition((JCDiagnostic.DiagnosticPosition) tree);
43+
}
44+
45+
int getEndPosition(JCDiagnostic.DiagnosticPosition pos);
46+
47+
static int getEndPosition(Tree tree, CompilationUnitTree unit) {
48+
return getEndPosition((JCDiagnostic.DiagnosticPosition) tree, unit);
49+
}
50+
51+
static int getEndPosition(JCTree tree, CompilationUnitTree unit) {
52+
return getEndPosition((JCDiagnostic.DiagnosticPosition) tree, unit);
53+
}
54+
55+
static int getEndPosition(JCDiagnostic.DiagnosticPosition pos, CompilationUnitTree unit) {
56+
return create(unit).getEndPosition(pos);
57+
}
58+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright 2025 The Error Prone Authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.google.errorprone.fixes;
18+
19+
import com.sun.source.tree.Tree;
20+
import com.sun.tools.javac.tree.EndPosTable;
21+
import com.sun.tools.javac.tree.JCTree;
22+
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
23+
24+
/** A compatibility wrapper around {@link DiagnosticPosition}. */
25+
public interface ErrorPronePosition extends DiagnosticPosition {
26+
static ErrorPronePosition from(Tree node) {
27+
DiagnosticPosition pos = (DiagnosticPosition) node;
28+
return new ErrorPronePosition() {
29+
@Override
30+
public int getStartPosition() {
31+
return pos.getStartPosition();
32+
}
33+
34+
@Override
35+
public int getPreferredPosition() {
36+
return pos.getPreferredPosition();
37+
}
38+
39+
@Override
40+
public JCTree getTree() {
41+
return pos.getTree();
42+
}
43+
44+
@Override
45+
public int getEndPosition(EndPosTable endPosTable) {
46+
return pos.getEndPosition(endPosTable);
47+
}
48+
49+
@Override
50+
public int getEndPosition(ErrorProneEndPosTable endPosTable) {
51+
return endPosTable.getEndPosition(pos);
52+
}
53+
};
54+
}
55+
56+
int getEndPosition(ErrorProneEndPosTable endPosTable);
57+
}

check_api/src/main/java/com/google/errorprone/fixes/Fix.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,15 @@ public interface Fix {
3939

4040
Replacements.CoalescePolicy getCoalescePolicy();
4141

42-
ImmutableSet<Replacement> getReplacements(EndPosTable endPositions);
42+
ImmutableSet<Replacement> getReplacements(ErrorProneEndPosTable endPositions);
43+
44+
/**
45+
* @deprecated use {@link #getReplacements(ErrorProneEndPosTable) instead}
46+
*/
47+
@Deprecated
48+
default ImmutableSet<Replacement> getReplacements(EndPosTable endPositions) {
49+
return getReplacements(ErrorProneEndPosTable.create(endPositions));
50+
}
4351

4452
ImmutableSet<String> getImportsToAdd();
4553

check_api/src/main/java/com/google/errorprone/fixes/FixedPosition.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
2323

2424
/** A {@link DiagnosticPosition} with a fixed position. */
25-
public final class FixedPosition implements DiagnosticPosition {
25+
public final class FixedPosition implements ErrorPronePosition {
2626
private final JCTree tree;
2727
private final int startPosition;
2828

@@ -46,6 +46,11 @@ public int getPreferredPosition() {
4646
return startPosition;
4747
}
4848

49+
@Override
50+
public int getEndPosition(ErrorProneEndPosTable endPosTable) {
51+
return startPosition;
52+
}
53+
4954
@Override
5055
public int getEndPosition(EndPosTable endPosTable) {
5156
return startPosition;

check_api/src/main/java/com/google/errorprone/fixes/IndexedPosition.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,9 @@
2020

2121
import com.sun.tools.javac.tree.EndPosTable;
2222
import com.sun.tools.javac.tree.JCTree;
23-
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
2423

2524
/** Describes a position that only has a start and end index. */
26-
public class IndexedPosition implements DiagnosticPosition {
25+
public class IndexedPosition implements ErrorPronePosition {
2726

2827
final int startPos;
2928
final int endPos;
@@ -50,6 +49,11 @@ public int getPreferredPosition() {
5049
throw new UnsupportedOperationException();
5150
}
5251

52+
@Override
53+
public int getEndPosition(ErrorProneEndPosTable endPosTable) {
54+
return endPos;
55+
}
56+
5357
@Override
5458
public int getEndPosition(EndPosTable endPosTable) {
5559
return endPos;

0 commit comments

Comments
 (0)