Skip to content

Commit 2e36c83

Browse files
author
Andy Hanson
committed
isDeclarationName: Return false for LHS of import { x as y } and export { x as y }
1 parent 8321b81 commit 2e36c83

10 files changed

+50
-31
lines changed

src/compiler/checker.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22254,7 +22254,7 @@ namespace ts {
2225422254
return undefined;
2225522255
}
2225622256

22257-
if (isDeclarationName(node)) {
22257+
if (isDeclarationNameOrImportPropertyName(node)) {
2225822258
// This is a declaration, call getSymbolOfNode
2225922259
return getSymbolOfNode(node.parent);
2226022260
}
@@ -22401,7 +22401,7 @@ namespace ts {
2240122401
return getTypeOfSymbol(symbol);
2240222402
}
2240322403

22404-
if (isDeclarationName(node)) {
22404+
if (isDeclarationNameOrImportPropertyName(node)) {
2240522405
const symbol = getSymbolAtLocation(node);
2240622406
return symbol && getTypeOfSymbol(symbol);
2240722407
}
@@ -24430,4 +24430,19 @@ namespace ts {
2443024430
return result;
2443124431
}
2443224432
}
24433+
24434+
/** Like 'isDeclarationName', but returns true for LHS of `import { x as y }` or `export { x as y }`. */
24435+
function isDeclarationNameOrImportPropertyName(name: Node): boolean {
24436+
switch (name.parent.kind) {
24437+
case SyntaxKind.ImportSpecifier:
24438+
case SyntaxKind.ExportSpecifier:
24439+
if ((name.parent as ImportOrExportSpecifier).propertyName) {
24440+
return true;
24441+
}
24442+
// falls through
24443+
default:
24444+
return isDeclarationName(name);
24445+
24446+
}
24447+
}
2443324448
}

src/compiler/utilities.ts

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1758,22 +1758,14 @@ namespace ts {
17581758

17591759
// True if the given identifier, string literal, or number literal is the name of a declaration node
17601760
export function isDeclarationName(name: Node): boolean {
1761-
if (name.kind !== SyntaxKind.Identifier && name.kind !== SyntaxKind.StringLiteral && name.kind !== SyntaxKind.NumericLiteral) {
1762-
return false;
1763-
}
1764-
1765-
const parent = name.parent;
1766-
if (parent.kind === SyntaxKind.ImportSpecifier || parent.kind === SyntaxKind.ExportSpecifier) {
1767-
if ((<ImportOrExportSpecifier>parent).propertyName) {
1768-
return true;
1769-
}
1770-
}
1771-
1772-
if (isDeclaration(parent)) {
1773-
return parent.name === name;
1761+
switch (name.kind) {
1762+
case SyntaxKind.Identifier:
1763+
case SyntaxKind.StringLiteral:
1764+
case SyntaxKind.NumericLiteral:
1765+
return isDeclaration(name.parent) && name.parent.name === name;
1766+
default:
1767+
return false;
17741768
}
1775-
1776-
return false;
17771769
}
17781770

17791771
export function getNameOfDeclaration(declaration: Declaration): DeclarationName {

tests/cases/fourslash/findAllRefsOnImportAliases2.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
/// <reference path="fourslash.ts" />
22

33
//@Filename: a.ts
4-
////export class [|{| "isWriteAccess": true, "isDefinition": true |}Class|] {
5-
////}
4+
////export class [|{| "isWriteAccess": true, "isDefinition": true |}Class|] {}
65

76
//@Filename: b.ts
8-
////import { [|{| "isWriteAccess": true, "isDefinition": true |}Class|] as [|{| "isWriteAccess": true, "isDefinition": true |}C2|] } from "./a";
9-
////
7+
////import { [|Class|] as [|{| "isWriteAccess": true, "isDefinition": true |}C2|] } from "./a";
108
////var c = new [|C2|]();
119

1210
//@Filename: c.ts
13-
////export { [|{| "isWriteAccess": true, "isDefinition": true |}Class|] as [|{| "isWriteAccess": true, "isDefinition": true |}C3|] } from "./a";
11+
////export { [|Class|] as [|{| "isWriteAccess": true, "isDefinition": true |}C3|] } from "./a";
1412

1513
const ranges = test.rangesByText();
1614
const classRanges = ranges.get("Class");

tests/cases/fourslash/findAllRefsReExportLocal.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// @Filename: /a.ts
66
////var [|{| "isWriteAccess": true, "isDefinition": true |}x|];
77
////export { [|{| "isWriteAccess": true, "isDefinition": true |}x|] };
8-
////export { [|{| "isWriteAccess": true, "isDefinition": true |}x|] as [|{| "isWriteAccess": true, "isDefinition": true |}y|] };
8+
////export { [|x|] as [|{| "isWriteAccess": true, "isDefinition": true |}y|] };
99

1010
// @Filename: /b.ts
1111
////import { [|{| "isWriteAccess": true, "isDefinition": true |}x|], [|{| "isWriteAccess": true, "isDefinition": true |}y|] } from "./a";

tests/cases/fourslash/findAllRefsReExports.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,18 @@
44
////export function [|{| "isWriteAccess": true, "isDefinition": true |}foo|](): void {}
55

66
// @Filename: /b.ts
7-
////export { [|{| "isWriteAccess": true, "isDefinition": true |}foo|] as [|{| "isWriteAccess": true, "isDefinition": true |}bar|] } from "./a";
7+
////export { [|foo|] as [|{| "isWriteAccess": true, "isDefinition": true |}bar|] } from "./a";
88

99
// @Filename: /c.ts
10-
////export { [|{| "isWriteAccess": true, "isDefinition": true |}foo|] as [|{| "isWriteAccess": true, "isDefinition": true |}default|] } from "./a";
10+
////export { [|foo|] as [|{| "isWriteAccess": true, "isDefinition": true |}default|] } from "./a";
1111

1212
// @Filename: /d.ts
1313
////export { [|{| "isWriteAccess": true, "isDefinition": true |}default|] } from "./c";
1414

1515
// @Filename: /e.ts
1616
////import { [|{| "isWriteAccess": true, "isDefinition": true |}bar|] } from "./b";
1717
////import [|{| "isWriteAccess": true, "isDefinition": true |}baz|] from "./c";
18-
////import { [|{| "isWriteAccess": true, "isDefinition": true |}default|] as [|{| "isWriteAccess": true, "isDefinition": true |}bang|] } from "./c";
18+
////import { [|default|] as [|{| "isWriteAccess": true, "isDefinition": true |}bang|] } from "./c";
1919
////import [|{| "isWriteAccess": true, "isDefinition": true |}boom|] from "./d";
2020
////[|bar|](); [|baz|](); [|bang|](); [|boom|]();
2121

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/// <reference path="fourslash.ts" />
2+
3+
// @Filename: /a.ts
4+
////export function [|{| "isWriteAccess": true, "isDefinition": true |}foo|](): void {}
5+
6+
// @Filename: /b.ts
7+
////import { [|foo|] as [|{| "isWriteAccess": true, "isDefinition": true |}oof|] } from "./a";
8+
9+
verify.noErrors();
10+
const [r0, r1, r2] = test.ranges();
11+
verify.referenceGroups(r0, [
12+
{ definition: "function foo(): void", ranges: [r0, r1] },
13+
{ definition: "import oof", ranges: [r2] }
14+
]);

tests/cases/fourslash/findAllRefsRenameImportWithSameName.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
////export const [|{| "isWriteAccess": true, "isDefinition": true |}x|] = 0;
55

66
//@Filename: /b.ts
7-
////import { [|{| "isWriteAccess": true, "isDefinition": true |}x|] as [|{| "isWriteAccess": true, "isDefinition": true |}x|] } from "./a";
7+
////import { [|x|] as [|{| "isWriteAccess": true, "isDefinition": true |}x|] } from "./a";
88
////[|x|];
99

1010
verify.noErrors();

tests/cases/fourslash/renameImportOfExportEquals2.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
////}
99
////declare module "a" {
1010
//// import * as [|{| "isWriteAccess": true, "isDefinition": true |}O|] from "mod";
11-
//// export { [|{| "isWriteAccess": true, "isDefinition": true |}O|] as [|{| "isWriteAccess": true, "isDefinition": true |}P|] }; // Renaming N here would rename
11+
//// export { [|O|] as [|{| "isWriteAccess": true, "isDefinition": true |}P|] }; // Renaming N here would rename
1212
////}
1313
////declare module "b" {
14-
//// import { [|{| "isWriteAccess": true, "isDefinition": true |}P|] as [|{| "isWriteAccess": true, "isDefinition": true |}Q|] } from "a";
14+
//// import { [|P|] as [|{| "isWriteAccess": true, "isDefinition": true |}Q|] } from "a";
1515
//// export const y: typeof [|Q|].x;
1616
////}
1717

tests/cases/fourslash/renameImportOfReExport2.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//// export class [|{| "isWriteAccess": true, "isDefinition": true |}C|] {}
55
////}
66
////declare module "b" {
7-
//// export { [|{| "isWriteAccess": true, "isDefinition": true |}C|] as [|{| "isWriteAccess": true, "isDefinition": true |}D|] } from "a";
7+
//// export { [|C|] as [|{| "isWriteAccess": true, "isDefinition": true |}D|] } from "a";
88
////}
99
////declare module "c" {
1010
//// import { [|{| "isWriteAccess": true, "isDefinition": true |}D|] } from "b";

tests/cases/fourslash/transitiveExportImports3.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
////export function [|{| "isWriteAccess": true, "isDefinition": true |}f|]() {}
55

66
// @Filename: b.ts
7-
////export { [|{| "isWriteAccess": true, "isDefinition": true |}f|] as [|{| "isWriteAccess": true, "isDefinition": true |}g|] } from "./a";
7+
////export { [|f|] as [|{| "isWriteAccess": true, "isDefinition": true |}g|] } from "./a";
88
////import { [|{| "isWriteAccess": true, "isDefinition": true |}f|] } from "./a";
99
////import { [|{| "isWriteAccess": true, "isDefinition": true |}g|] } from "./b";
1010

0 commit comments

Comments
 (0)