diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index b04055500dafa..897919c8a3cee 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -8392,7 +8392,10 @@ namespace Parser { phaseModifier = SyntaxKind.TypeKeyword; identifier = isIdentifier() ? parseIdentifier() : undefined; } - else if (identifier?.escapedText === "defer" && token() !== SyntaxKind.FromKeyword) { + else if ( + identifier?.escapedText === "defer" && + (token() === SyntaxKind.FromKeyword ? !lookAhead(nextTokenIsStringLiteral) : token() !== SyntaxKind.CommaToken && token() !== SyntaxKind.EqualsToken) + ) { phaseModifier = SyntaxKind.DeferKeyword; identifier = isIdentifier() ? parseIdentifier() : undefined; } diff --git a/tests/baselines/reference/importBindingDefer.js b/tests/baselines/reference/importBindingDefer.js new file mode 100644 index 0000000000000..72d78c4183d61 --- /dev/null +++ b/tests/baselines/reference/importBindingDefer.js @@ -0,0 +1,13 @@ +//// [tests/cases/conformance/importDefer/importBindingDefer.ts] //// + +//// [a.ts] +export default 2; + +//// [b.ts] +import defer from "./a.js"; + + +//// [a.js] +export default 2; +//// [b.js] +export {}; diff --git a/tests/baselines/reference/importBindingDefer.symbols b/tests/baselines/reference/importBindingDefer.symbols new file mode 100644 index 0000000000000..232fb5cdfce6c --- /dev/null +++ b/tests/baselines/reference/importBindingDefer.symbols @@ -0,0 +1,10 @@ +//// [tests/cases/conformance/importDefer/importBindingDefer.ts] //// + +=== a.ts === + +export default 2; + +=== b.ts === +import defer from "./a.js"; +>defer : Symbol(defer, Decl(b.ts, 0, 6)) + diff --git a/tests/baselines/reference/importBindingDefer.types b/tests/baselines/reference/importBindingDefer.types new file mode 100644 index 0000000000000..3b3fbc649dcef --- /dev/null +++ b/tests/baselines/reference/importBindingDefer.types @@ -0,0 +1,11 @@ +//// [tests/cases/conformance/importDefer/importBindingDefer.ts] //// + +=== a.ts === + +export default 2; + +=== b.ts === +import defer from "./a.js"; +>defer : 2 +> : ^ + diff --git a/tests/baselines/reference/importBindingDefer2.js b/tests/baselines/reference/importBindingDefer2.js new file mode 100644 index 0000000000000..34912eef4f824 --- /dev/null +++ b/tests/baselines/reference/importBindingDefer2.js @@ -0,0 +1,13 @@ +//// [tests/cases/conformance/importDefer/importBindingDefer2.ts] //// + +//// [a.ts] +export default 2; + +//// [b.ts] +import defer, {} from "./a.js"; + + +//// [a.js] +export default 2; +//// [b.js] +export {}; diff --git a/tests/baselines/reference/importBindingDefer2.symbols b/tests/baselines/reference/importBindingDefer2.symbols new file mode 100644 index 0000000000000..641c4c6ec141e --- /dev/null +++ b/tests/baselines/reference/importBindingDefer2.symbols @@ -0,0 +1,10 @@ +//// [tests/cases/conformance/importDefer/importBindingDefer2.ts] //// + +=== a.ts === + +export default 2; + +=== b.ts === +import defer, {} from "./a.js"; +>defer : Symbol(defer, Decl(b.ts, 0, 6)) + diff --git a/tests/baselines/reference/importBindingDefer2.types b/tests/baselines/reference/importBindingDefer2.types new file mode 100644 index 0000000000000..d3843b24242f3 --- /dev/null +++ b/tests/baselines/reference/importBindingDefer2.types @@ -0,0 +1,11 @@ +//// [tests/cases/conformance/importDefer/importBindingDefer2.ts] //// + +=== a.ts === + +export default 2; + +=== b.ts === +import defer, {} from "./a.js"; +>defer : 2 +> : ^ + diff --git a/tests/baselines/reference/importDeferFromInvalid.errors.txt b/tests/baselines/reference/importDeferFromInvalid.errors.txt new file mode 100644 index 0000000000000..5a82911a235e6 --- /dev/null +++ b/tests/baselines/reference/importDeferFromInvalid.errors.txt @@ -0,0 +1,11 @@ +b.ts(1,8): error TS18058: Default imports are not allowed in a deferred import. + + +==== a.ts (0 errors) ==== + export default 2; + +==== b.ts (1 errors) ==== + import defer from from "./a.js"; + ~~~~~~~~~~ +!!! error TS18058: Default imports are not allowed in a deferred import. + \ No newline at end of file diff --git a/tests/baselines/reference/importDeferFromInvalid.js b/tests/baselines/reference/importDeferFromInvalid.js new file mode 100644 index 0000000000000..3ca61487491ad --- /dev/null +++ b/tests/baselines/reference/importDeferFromInvalid.js @@ -0,0 +1,13 @@ +//// [tests/cases/conformance/importDefer/importDeferFromInvalid.ts] //// + +//// [a.ts] +export default 2; + +//// [b.ts] +import defer from from "./a.js"; + + +//// [a.js] +export default 2; +//// [b.js] +export {}; diff --git a/tests/baselines/reference/importDeferFromInvalid.symbols b/tests/baselines/reference/importDeferFromInvalid.symbols new file mode 100644 index 0000000000000..6060cd3a13d62 --- /dev/null +++ b/tests/baselines/reference/importDeferFromInvalid.symbols @@ -0,0 +1,10 @@ +//// [tests/cases/conformance/importDefer/importDeferFromInvalid.ts] //// + +=== a.ts === + +export default 2; + +=== b.ts === +import defer from from "./a.js"; +>from : Symbol(from, Decl(b.ts, 0, 6)) + diff --git a/tests/baselines/reference/importDeferFromInvalid.types b/tests/baselines/reference/importDeferFromInvalid.types new file mode 100644 index 0000000000000..cee54257def3e --- /dev/null +++ b/tests/baselines/reference/importDeferFromInvalid.types @@ -0,0 +1,11 @@ +//// [tests/cases/conformance/importDefer/importDeferFromInvalid.ts] //// + +=== a.ts === + +export default 2; + +=== b.ts === +import defer from from "./a.js"; +>from : 2 +> : ^ + diff --git a/tests/baselines/reference/importEqualsBindingDefer.js b/tests/baselines/reference/importEqualsBindingDefer.js new file mode 100644 index 0000000000000..2b9f4e55a30ac --- /dev/null +++ b/tests/baselines/reference/importEqualsBindingDefer.js @@ -0,0 +1,15 @@ +//// [tests/cases/conformance/importDefer/importEqualsBindingDefer.ts] //// + +//// [a.ts] +export = 2; + +//// [b.ts] +import defer = require("./a"); + + +//// [a.js] +"use strict"; +module.exports = 2; +//// [b.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/tests/baselines/reference/importEqualsBindingDefer.symbols b/tests/baselines/reference/importEqualsBindingDefer.symbols new file mode 100644 index 0000000000000..5a0293bd1e803 --- /dev/null +++ b/tests/baselines/reference/importEqualsBindingDefer.symbols @@ -0,0 +1,10 @@ +//// [tests/cases/conformance/importDefer/importEqualsBindingDefer.ts] //// + +=== b.ts === +import defer = require("./a"); +>defer : Symbol(defer, Decl(b.ts, 0, 0)) + +=== a.ts === + +export = 2; + diff --git a/tests/baselines/reference/importEqualsBindingDefer.types b/tests/baselines/reference/importEqualsBindingDefer.types new file mode 100644 index 0000000000000..f510251742b29 --- /dev/null +++ b/tests/baselines/reference/importEqualsBindingDefer.types @@ -0,0 +1,11 @@ +//// [tests/cases/conformance/importDefer/importEqualsBindingDefer.ts] //// + +=== b.ts === +import defer = require("./a"); +>defer : 2 +> : ^ + +=== a.ts === + +export = 2; + diff --git a/tests/cases/conformance/importDefer/importBindingDefer.ts b/tests/cases/conformance/importDefer/importBindingDefer.ts new file mode 100644 index 0000000000000..caffb40c0defd --- /dev/null +++ b/tests/cases/conformance/importDefer/importBindingDefer.ts @@ -0,0 +1,8 @@ +// @module: esnext +// @target: es2020 + +// @filename: a.ts +export default 2; + +// @filename: b.ts +import defer from "./a.js"; diff --git a/tests/cases/conformance/importDefer/importBindingDefer2.ts b/tests/cases/conformance/importDefer/importBindingDefer2.ts new file mode 100644 index 0000000000000..23fa5230262a0 --- /dev/null +++ b/tests/cases/conformance/importDefer/importBindingDefer2.ts @@ -0,0 +1,8 @@ +// @module: esnext +// @target: es2020 + +// @filename: a.ts +export default 2; + +// @filename: b.ts +import defer, {} from "./a.js"; diff --git a/tests/cases/conformance/importDefer/importDeferFromInvalid.ts b/tests/cases/conformance/importDefer/importDeferFromInvalid.ts new file mode 100644 index 0000000000000..c2402592bff5d --- /dev/null +++ b/tests/cases/conformance/importDefer/importDeferFromInvalid.ts @@ -0,0 +1,8 @@ +// @module: esnext +// @target: es2020 + +// @filename: a.ts +export default 2; + +// @filename: b.ts +import defer from from "./a.js"; diff --git a/tests/cases/conformance/importDefer/importEqualsBindingDefer.ts b/tests/cases/conformance/importDefer/importEqualsBindingDefer.ts new file mode 100644 index 0000000000000..eac0676a5dac6 --- /dev/null +++ b/tests/cases/conformance/importDefer/importEqualsBindingDefer.ts @@ -0,0 +1,8 @@ +// @module: commonjs +// @target: es2020 + +// @filename: a.ts +export = 2; + +// @filename: b.ts +import defer = require("./a");