Skip to content

Commit dec1011

Browse files
Do not consider import.defer in import.defer(...) as an expression
1 parent fc0908f commit dec1011

7 files changed

Lines changed: 14 additions & 11 deletions

src/compiler/checker.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38022,7 +38022,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3802238022

3802338023
if (node.keywordToken === SyntaxKind.ImportKeyword) {
3802438024
if (node.name.escapedText === "defer") {
38025-
// 'checkGrammarMetaProperty' already reported the error for the standalone import.defer.
38025+
Debug.assert(!isCallExpression(node.parent) || node.parent.expression !== node, "Trying to get the type of `import.defer` in `import.defer(...)`");
3802638026
return errorType;
3802738027
} else {
3802838028
return checkImportMetaProperty(node);
@@ -41464,7 +41464,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4146441464
}
4146541465
// Optimize for the common case of a call to a function with a single non-generic call
4146641466
// signature where we can just fetch the return type without checking the arguments.
41467-
if (isCallExpression(expr) && expr.expression.kind !== SyntaxKind.SuperKeyword && !isRequireCall(expr, /*requireStringLiteralLikeArgument*/ true) && !isSymbolOrSymbolForCall(expr)) {
41467+
if (isCallExpression(expr) && expr.expression.kind !== SyntaxKind.SuperKeyword && !isRequireCall(expr, /*requireStringLiteralLikeArgument*/ true) && !isSymbolOrSymbolForCall(expr) && !isImportCall(expr)) {
4146841468
return isCallChain(expr) ? getReturnTypeOfSingleNonGenericSignatureOfCallChain(expr) :
4146941469
getReturnTypeOfSingleNonGenericCallSignature(checkNonNullExpression(expr.expression));
4147041470
}
@@ -49886,6 +49886,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4988649886
return isExportAssignment(node.parent) ? Debug.checkDefined(node.parent.symbol) : undefined;
4988749887

4988849888
case SyntaxKind.ImportKeyword:
49889+
if (isMetaProperty(node.parent) && node.parent.name.escapedText === "defer") {
49890+
return undefined;
49891+
}
49892+
// falls through
4988949893
case SyntaxKind.NewKeyword:
4989049894
return isMetaProperty(node.parent) ? checkMetaPropertyKeyword(node.parent).symbol : undefined;
4989149895
case SyntaxKind.InstanceOfKeyword:
@@ -49958,7 +49962,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4995849962
}
4995949963

4996049964
if (isExpressionNode(node)) {
49965+
try {
4996149966
return getRegularTypeOfExpression(node as Expression);
49967+
} catch (e) {
49968+
console.error("Error while getting the type of", isExpressionNode(node), node.kind, (node as MetaProperty).keywordToken !== SyntaxKind.ImportKeyword, (node as MetaProperty).name?.escapedText)
49969+
throw e;
49970+
}
4996249971
}
4996349972

4996449973
if (classType && !classDecl.isImplements) {

src/compiler/utilities.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3605,8 +3605,10 @@ export function isExpressionNode(node: Node): boolean {
36053605
case SyntaxKind.JsxFragment:
36063606
case SyntaxKind.YieldExpression:
36073607
case SyntaxKind.AwaitExpression:
3608-
case SyntaxKind.MetaProperty:
36093608
return true;
3609+
case SyntaxKind.MetaProperty:
3610+
// `import.defer` in `import.defer(...)` is not an expression
3611+
return !isImportCall(node.parent) || node.parent.expression !== node;
36103612
case SyntaxKind.ExpressionWithTypeArguments:
36113613
return !isHeritageClause(node.parent) && !isJSDocAugmentsTag(node.parent);
36123614
case SyntaxKind.QualifiedName:

tests/baselines/reference/dynamicImportDefer(module=commonjs).types

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ import.defer("./a.js").then(ns => {
2626
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2727
>import.defer("./a.js") : Promise<typeof import("a")>
2828
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^
29-
>import.defer : any
30-
> : ^^^
3129
>defer : any
3230
> : ^^^
3331
>"./a.js" : "./a.js"

tests/baselines/reference/dynamicImportDefer(module=es2015).types

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ import.defer("./a.js").then(ns => {
2626
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2727
>import.defer("./a.js") : Promise<typeof import("a")>
2828
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^
29-
>import.defer : any
30-
> : ^^^
3129
>defer : any
3230
> : ^^^
3331
>"./a.js" : "./a.js"

tests/baselines/reference/dynamicImportDefer(module=es2020).types

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ import.defer("./a.js").then(ns => {
2626
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2727
>import.defer("./a.js") : Promise<typeof import("a")>
2828
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^
29-
>import.defer : any
30-
> : ^^^
3129
>defer : any
3230
> : ^^^
3331
>"./a.js" : "./a.js"

tests/baselines/reference/dynamicImportDefer(module=esnext).types

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import.defer("./a.js").then(ns => {
2626
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2727
>import.defer("./a.js") : Promise<typeof import("a")>
2828
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^
29-
>import.defer : error
3029
>defer : any
3130
> : ^^^
3231
>"./a.js" : "./a.js"

tests/baselines/reference/dynamicImportDefer(module=nodenext).types

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import.defer("./a.js").then(ns => {
2626
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2727
>import.defer("./a.js") : Promise<{ default: typeof import("a"); foo(): void; }>
2828
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
29-
>import.defer : error
3029
>defer : any
3130
> : ^^^
3231
>"./a.js" : "./a.js"

0 commit comments

Comments
 (0)