Skip to content

Commit 2fcedcd

Browse files
committed
Revert "Drop replaceIncludingComments"
This reverts commit 133c85d.
1 parent 133c85d commit 2fcedcd

File tree

1 file changed

+38
-1
lines changed

1 file changed

+38
-1
lines changed

error-prone-contrib/src/main/java/tech/picnic/errorprone/bugpatterns/MemberOrdering.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ private static SuggestedFix swapMembersIncludingComments(
108108
getComments(classTree, correct, state).map(Tokens.Comment::getText),
109109
Stream.of(state.getSourceForNode(correct)))
110110
.collect(joining("\n"));
111-
fix.merge(SuggestedFixes.replaceIncludingComments(state.getPath(), replacement, state));
111+
fix.merge(replaceIncludingComments(classTree, original, replacement, state));
112112
}
113113
}
114114
return fix.build();
@@ -131,6 +131,43 @@ private static Stream<Tokens.Comment> getComments(
131131
.flatMap(List::stream);
132132
}
133133

134+
// XXX: From this point the code is just a fancy copy of `SuggestFixes.replaceIncludingComments` -
135+
// if we cannot use existing solutions for this functionality, this one needs a big refactor.
136+
137+
private static SuggestedFix replaceIncludingComments(
138+
ClassTree classTree, Tree member, String replacement, VisitorState state) {
139+
Optional<Tree> previousMember = getPreviousMember(member, classTree);
140+
ImmutableList<ErrorProneToken> tokens =
141+
getTokensBeforeMember(classTree, member, state).collect(toImmutableList());
142+
143+
if (tokens.isEmpty()) {
144+
return SuggestedFix.replace(member, replacement);
145+
}
146+
if (tokens.get(0).comments().isEmpty()) {
147+
return SuggestedFix.replace(tokens.get(0).pos(), state.getEndPosition(member), replacement);
148+
}
149+
ImmutableList<Tokens.Comment> comments =
150+
ImmutableList.sortedCopyOf(
151+
Comparator.<Tokens.Comment>comparingInt(c -> c.getSourcePos(0)).reversed(),
152+
tokens.get(0).comments());
153+
@Var int startPos = ASTHelpers.getStartPosition(member);
154+
// This can happen for desugared expressions like `int a, b;`.
155+
if (startPos < getStartTokenization(classTree, state, previousMember)) {
156+
return SuggestedFix.emptyFix();
157+
}
158+
// Delete backwards for comments which are not separated from our target by a blank line.
159+
CharSequence sourceCode = state.getSourceCode();
160+
for (Tokens.Comment comment : comments) {
161+
int endOfCommentPos = comment.getSourcePos(comment.getText().length() - 1);
162+
CharSequence stringBetweenComments = sourceCode.subSequence(endOfCommentPos, startPos);
163+
if (stringBetweenComments.chars().filter(c -> c == '\n').count() > 1) {
164+
break;
165+
}
166+
startPos = comment.getSourcePos(0);
167+
}
168+
return SuggestedFix.replace(startPos, state.getEndPosition(member), replacement);
169+
}
170+
134171
private static Optional<Tree> getPreviousMember(Tree tree, ClassTree classTree) {
135172
@Var Tree previousMember = null;
136173
for (Tree member : classTree.getMembers()) {

0 commit comments

Comments
 (0)