Skip to content

Commit

Permalink
Cherry-pick PR microsoft#39924 into release-4.0
Browse files Browse the repository at this point in the history
Component commits:
45d9eb5 place first import after header

d35d719 don't insert before non-header
  • Loading branch information
jessetrinity authored and typescript-bot committed Sep 16, 2020
1 parent 65b84e7 commit e3301f7
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 3 deletions.
4 changes: 2 additions & 2 deletions src/services/textChanges.ts
Expand Up @@ -384,8 +384,8 @@ namespace ts.textChanges {
}
}

public insertNodeBefore(sourceFile: SourceFile, before: Node, newNode: Node, blankLineBetween = false): void {
this.insertNodeAt(sourceFile, getAdjustedStartPosition(sourceFile, before, {}), newNode, this.getOptionsForInsertNodeBefore(before, newNode, blankLineBetween));
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));
}

public insertModifierBefore(sourceFile: SourceFile, modifier: SyntaxKind, before: Node): void {
Expand Down
5 changes: 4 additions & 1 deletion src/services/utilities.ts
Expand Up @@ -1913,7 +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);
// 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];
Expand Down
26 changes: 26 additions & 0 deletions tests/cases/fourslash/importNameCodeFix_HeaderComment1.ts
@@ -0,0 +1,26 @@
/// <reference path="fourslash.ts" />

// @Filename: /a.ts
////export const foo = 0;

// @Filename: /b.ts
////export const bar = 0;

// @Filename: /c.ts
/////*--------------------
//// * Copyright Header
//// *--------------------*/
////
////import { bar } from "./b";
////foo;

goTo.file("/c.ts");
verify.importFixAtPosition([
`/*--------------------
* Copyright Header
*--------------------*/
import { foo } from "./a";
import { bar } from "./b";
foo;`,
]);
32 changes: 32 additions & 0 deletions tests/cases/fourslash/importNameCodeFix_HeaderComment2.ts
@@ -0,0 +1,32 @@
/// <reference path="fourslash.ts" />

// @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;`,
]);

0 comments on commit e3301f7

Please sign in to comment.