Index: cfe/trunk/lib/Format/SortJavaScriptImports.cpp =================================================================== --- cfe/trunk/lib/Format/SortJavaScriptImports.cpp +++ cfe/trunk/lib/Format/SortJavaScriptImports.cpp @@ -170,12 +170,25 @@ if (ReferencesInOrder && SymbolsInOrder) return Result; + SourceRange InsertionPoint = References[0].Range; + InsertionPoint.setEnd(References[References.size() - 1].Range.getEnd()); + + // The loop above might collapse previously existing line breaks between + // import blocks, and thus shrink the file. SortIncludes must not shrink + // overall source length as there is currently no re-calculation of ranges + // after applying source sorting. + // This loop just backfills trailing spaces after the imports, which are + // harmless and will be stripped by the subsequent formatting pass. + // TODO: A better long term fix is to re-calculate Ranges after sorting. + unsigned PreviousSize = getSourceText(InsertionPoint).size(); + while (ReferencesText.size() < PreviousSize) { + ReferencesText += " "; + } + // Separate references from the main code body of the file. if (FirstNonImportLine && FirstNonImportLine->First->NewlinesBefore < 2) ReferencesText += "\n"; - SourceRange InsertionPoint = References[0].Range; - InsertionPoint.setEnd(References[References.size() - 1].Range.getEnd()); DEBUG(llvm::dbgs() << "Replacing imports:\n" << getSourceText(InsertionPoint) << "\nwith:\n" << ReferencesText << "\n"); Index: cfe/trunk/unittests/Format/SortImportsTestJS.cpp =================================================================== --- cfe/trunk/unittests/Format/SortImportsTestJS.cpp +++ cfe/trunk/unittests/Format/SortImportsTestJS.cpp @@ -223,6 +223,19 @@ 24, 30); } +TEST_F(SortImportsTestJS, SortingCanShrink) { + // Sort excluding a suffix. + verifySort("import {B} from 'a';\n" + "import {A} from 'b';\n" + "\n" + "1;", + "import {A} from 'b';\n" + "\n" + "import {B} from 'a';\n" + "\n" + "1;"); +} + } // end namespace } // end namespace format } // end namespace clang