diff options
-rw-r--r-- | clang/lib/Format/SortJavaScriptImports.cpp | 17 | ||||
-rw-r--r-- | clang/unittests/Format/SortImportsTestJS.cpp | 13 |
2 files changed, 28 insertions, 2 deletions
diff --git a/clang/lib/Format/SortJavaScriptImports.cpp b/clang/lib/Format/SortJavaScriptImports.cpp index 28c3ae9f6a8..fc2a6534927 100644 --- a/clang/lib/Format/SortJavaScriptImports.cpp +++ b/clang/lib/Format/SortJavaScriptImports.cpp @@ -170,12 +170,25 @@ public: 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"); diff --git a/clang/unittests/Format/SortImportsTestJS.cpp b/clang/unittests/Format/SortImportsTestJS.cpp index 140fe4a7466..17e73b08554 100644 --- a/clang/unittests/Format/SortImportsTestJS.cpp +++ b/clang/unittests/Format/SortImportsTestJS.cpp @@ -223,6 +223,19 @@ TEST_F(SortImportsTestJS, AffectedRange) { 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 |