@@ -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