diff --git a/src/services/textChanges.ts b/src/services/textChanges.ts index 41f0797ca8ef9..131cb029c6537 100644 --- a/src/services/textChanges.ts +++ b/src/services/textChanges.ts @@ -384,7 +384,7 @@ namespace ts.textChanges { } } - public insertNodeBefore(sourceFile: SourceFile, before: Node, newNode: Node, blankLineBetween = false, options = {}): void { + public insertNodeBefore(sourceFile: SourceFile, before: Node, newNode: Node, blankLineBetween = false, options: ConfigurableStartEnd = {}): void { this.insertNodeAt(sourceFile, getAdjustedStartPosition(sourceFile, before, options), newNode, this.getOptionsForInsertNodeBefore(before, newNode, blankLineBetween)); } diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 216586c8f86ad..a0ab840cf07b1 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -1913,9 +1913,10 @@ namespace ts { for (const newImport of sortedNewImports) { const insertionIndex = OrganizeImports.getImportDeclarationInsertionIndex(existingImportStatements, newImport); if (insertionIndex === 0) { - changes.insertNodeBefore(sourceFile, existingImportStatements[0], newImport, /*blankLineBetween*/ false, { - leadingTriviaOption: textChanges.LeadingTriviaOption.Exclude, - }); + // If the first import is top-of-file, insert after the leading comment which is likely the header. + const options = existingImportStatements[0] === sourceFile.statements[0] ? + { leadingTriviaOption: textChanges.LeadingTriviaOption.Exclude } : {}; + changes.insertNodeBefore(sourceFile, existingImportStatements[0], newImport, /*blankLineBetween*/ false, options); } else { const prevImport = existingImportStatements[insertionIndex - 1]; diff --git a/tests/cases/fourslash/importNameCodeFix_HeaderComment.ts b/tests/cases/fourslash/importNameCodeFix_HeaderComment1.ts similarity index 100% rename from tests/cases/fourslash/importNameCodeFix_HeaderComment.ts rename to tests/cases/fourslash/importNameCodeFix_HeaderComment1.ts diff --git a/tests/cases/fourslash/importNameCodeFix_HeaderComment2.ts b/tests/cases/fourslash/importNameCodeFix_HeaderComment2.ts new file mode 100644 index 0000000000000..994d770ff24c5 --- /dev/null +++ b/tests/cases/fourslash/importNameCodeFix_HeaderComment2.ts @@ -0,0 +1,32 @@ +/// + +// @Filename: /a.ts +////export const foo = 0; + +// @Filename: /b.ts +////export const bar = 0; + +// @Filename: /c.ts +/////*-------------------- +//// * Copyright Header +//// *--------------------*/ +//// +////const afterHeader = 1; +//// +////// non-header comment +////import { bar } from "./b"; +////foo; + +goTo.file("/c.ts"); +verify.importFixAtPosition([ +`/*-------------------- + * Copyright Header + *--------------------*/ + +const afterHeader = 1; + +import { foo } from "./a"; +// non-header comment +import { bar } from "./b"; +foo;`, +]);