@@ -82,10 +82,16 @@ private TextEdit formatInternal(int kind, String source, IRegion[] regions, int
82
82
default :
83
83
throw new IllegalArgumentException (String .format ("Unknown snippet kind: %d" , kind ));
84
84
}
85
- return editFromReplacements (
85
+ List < Replacement > replacements =
86
86
new SnippetFormatter ()
87
87
.format (
88
- snippetKind , source , rangesFromRegions (regions ), initialIndent , includeComments ));
88
+ snippetKind , source , rangesFromRegions (regions ), initialIndent , includeComments );
89
+ if (idempotent (source , regions , replacements )) {
90
+ // Do not create edits if there's no diff.
91
+ return null ;
92
+ }
93
+ // Convert replacements to text edits.
94
+ return editFromReplacements (replacements );
89
95
} catch (IllegalArgumentException | FormatterException exception ) {
90
96
// Do not format on errors.
91
97
return null ;
@@ -100,6 +106,28 @@ private List<Range<Integer>> rangesFromRegions(IRegion[] regions) {
100
106
return ranges ;
101
107
}
102
108
109
+ /** @return {@code true} if input and output texts are equal, else {@code false}. */
110
+ private boolean idempotent (String source , IRegion [] regions , List <Replacement > replacements ) {
111
+ // This implementation only checks for single replacement.
112
+ if (replacements .size () == 1 ) {
113
+ Replacement replacement = replacements .get (0 );
114
+ String output = replacement .getReplacementString ();
115
+ // Entire source case: input = output, nothing changed.
116
+ if (output .equals (source )) {
117
+ return true ;
118
+ }
119
+ // Single region and single replacement case: if they are equal, nothing changed.
120
+ if (regions .length == 1 ) {
121
+ Range <Integer > range = replacement .getReplaceRange ();
122
+ String snippet = source .substring (range .lowerEndpoint (), range .upperEndpoint ());
123
+ if (output .equals (snippet )) {
124
+ return true ;
125
+ }
126
+ }
127
+ }
128
+ return false ;
129
+ }
130
+
103
131
private TextEdit editFromReplacements (List <Replacement > replacements ) {
104
132
// Split the replacements that cross line boundaries.
105
133
TextEdit edit = new MultiTextEdit ();
0 commit comments