From 628bf0ec85be7c58019dc1742e50bc3f97168a5a Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Tue, 14 Nov 2023 00:43:24 +0200 Subject: [PATCH] fix(56376): import type from from "foo" (#56385) --- src/compiler/parser.ts | 7 ++++++- .../reference/importDefaultNamedType2.js | 21 +++++++++++++++++++ .../reference/importDefaultNamedType2.symbols | 10 +++++++++ .../reference/importDefaultNamedType2.types | 10 +++++++++ .../typeOnly/importDefaultNamedType2.ts | 5 +++++ 5 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/importDefaultNamedType2.js create mode 100644 tests/baselines/reference/importDefaultNamedType2.symbols create mode 100644 tests/baselines/reference/importDefaultNamedType2.types create mode 100644 tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType2.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 2789da86796..c80400d1557 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -7496,6 +7496,11 @@ namespace Parser { function nextTokenIsStringLiteral() { return nextToken() === SyntaxKind.StringLiteral; } + + function nextTokenIsFromKeyword() { + return nextToken() === SyntaxKind.FromKeyword; + } + function nextTokenIsIdentifierOrStringLiteralOnSameLine() { nextToken(); return !scanner.hasPrecedingLineBreak() && (isIdentifier() || token() === SyntaxKind.StringLiteral); @@ -8328,8 +8333,8 @@ namespace Parser { let isTypeOnly = false; if ( - token() !== SyntaxKind.FromKeyword && identifier?.escapedText === "type" && + (token() !== SyntaxKind.FromKeyword || isIdentifier() && lookAhead(nextTokenIsFromKeyword)) && (isIdentifier() || tokenAfterImportDefinitelyProducesImportDeclaration()) ) { isTypeOnly = true; diff --git a/tests/baselines/reference/importDefaultNamedType2.js b/tests/baselines/reference/importDefaultNamedType2.js new file mode 100644 index 00000000000..45dd7935813 --- /dev/null +++ b/tests/baselines/reference/importDefaultNamedType2.js @@ -0,0 +1,21 @@ +//// [tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType2.ts] //// + +//// [a.ts] +export default class A {} + +//// [b.ts] +import type from from './a'; + + +//// [a.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var A = /** @class */ (function () { + function A() { + } + return A; +}()); +exports.default = A; +//// [b.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/tests/baselines/reference/importDefaultNamedType2.symbols b/tests/baselines/reference/importDefaultNamedType2.symbols new file mode 100644 index 00000000000..1bc97c87beb --- /dev/null +++ b/tests/baselines/reference/importDefaultNamedType2.symbols @@ -0,0 +1,10 @@ +//// [tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType2.ts] //// + +=== /a.ts === +export default class A {} +>A : Symbol(A, Decl(a.ts, 0, 0)) + +=== /b.ts === +import type from from './a'; +>from : Symbol(from, Decl(b.ts, 0, 6)) + diff --git a/tests/baselines/reference/importDefaultNamedType2.types b/tests/baselines/reference/importDefaultNamedType2.types new file mode 100644 index 00000000000..4ac365dcd3e --- /dev/null +++ b/tests/baselines/reference/importDefaultNamedType2.types @@ -0,0 +1,10 @@ +//// [tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType2.ts] //// + +=== /a.ts === +export default class A {} +>A : A + +=== /b.ts === +import type from from './a'; +>from : from + diff --git a/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType2.ts b/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType2.ts new file mode 100644 index 00000000000..b56518a1dc8 --- /dev/null +++ b/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType2.ts @@ -0,0 +1,5 @@ +// @Filename: /a.ts +export default class A {} + +// @Filename: /b.ts +import type from from './a';