From dd00a34e5a30b224503645bce8f26231f9a38b7e Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 17 Apr 2023 14:53:21 -0700 Subject: [PATCH] Revert "Defer type comparability check for assertions (#53261)" This reverts commit 89478254c8c7dc982621a253da4d6368bb8a2588. --- src/compiler/checker.ts | 48 ++++--------------- .../reference/classVarianceCircularity.js | 32 ------------- .../classVarianceCircularity.symbols | 42 ---------------- .../reference/classVarianceCircularity.types | 45 ----------------- .../compiler/classVarianceCircularity.ts | 16 ------- 5 files changed, 10 insertions(+), 173 deletions(-) delete mode 100644 tests/baselines/reference/classVarianceCircularity.js delete mode 100644 tests/baselines/reference/classVarianceCircularity.symbols delete mode 100644 tests/baselines/reference/classVarianceCircularity.types delete mode 100644 tests/cases/compiler/classVarianceCircularity.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7d940cf747ee8..11fc0fb648698 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -767,7 +767,6 @@ import { JSDocSatisfiesTag, JSDocSignature, JSDocTemplateTag, - JSDocTypeAssertion, JSDocTypedefTag, JSDocTypeExpression, JSDocTypeLiteral, @@ -1045,6 +1044,7 @@ import { TypeReferenceSerializationKind, TypeReferenceType, TypeVariable, + UnaryExpression, unescapeLeadingUnderscores, UnionOrIntersectionType, UnionOrIntersectionTypeNode, @@ -34434,14 +34434,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return getReturnTypeOfSignature(signature); } - function checkAssertion(node: AssertionExpression, checkMode: CheckMode | undefined) { + function checkAssertion(node: AssertionExpression) { if (node.kind === SyntaxKind.TypeAssertionExpression) { const file = getSourceFileOfNode(node); if (file && fileExtensionIsOneOf(file.fileName, [Extension.Cts, Extension.Mts])) { grammarErrorOnNode(node, Diagnostics.This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Use_an_as_expression_instead); } } - return checkAssertionWorker(node, checkMode); + return checkAssertionWorker(node, node.type, node.expression); } function isValidConstAssertionArgument(node: Node): boolean { @@ -34472,9 +34472,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return false; } - function checkAssertionWorker(node: JSDocTypeAssertion | AssertionExpression, checkMode: CheckMode | undefined) { - const { type, expression } = getAssertionTypeAndExpression(node); - const exprType = checkExpression(expression, checkMode); + function checkAssertionWorker(errNode: Node, type: TypeNode, expression: UnaryExpression | Expression, checkMode?: CheckMode) { + let exprType = checkExpression(expression, checkMode); if (isConstTypeReference(type)) { if (!isValidConstAssertionArgument(expression)) { error(expression, Diagnostics.A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_or_object_literals); @@ -34482,32 +34481,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return getRegularTypeOfLiteralType(exprType); } checkSourceElement(type); - checkNodeDeferred(node); - return getTypeFromTypeNode(type); - } - - function getAssertionTypeAndExpression(node: JSDocTypeAssertion | AssertionExpression) { - let type: TypeNode; - let expression: Expression; - switch (node.kind) { - case SyntaxKind.AsExpression: - case SyntaxKind.TypeAssertionExpression: - type = node.type; - expression = node.expression; - break; - case SyntaxKind.ParenthesizedExpression: - type = getJSDocTypeAssertionType(node); - expression = node.expression; - break; - } - - return { type, expression }; - } - - function checkAssertionDeferred(node: JSDocTypeAssertion | AssertionExpression) { - const { type, expression } = getAssertionTypeAndExpression(node); - const errNode = isParenthesizedExpression(node) ? type : node; - const exprType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(checkExpression(expression))); + exprType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(exprType)); const targetType = getTypeFromTypeNode(type); if (!isErrorType(targetType)) { addLazyDiagnostic(() => { @@ -34518,6 +34492,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } }); } + return targetType; } function checkNonNullChain(node: NonNullChain) { @@ -37756,7 +37731,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return checkSatisfiesExpressionWorker(node.expression, getJSDocSatisfiesExpressionType(node), checkMode); } if (isJSDocTypeAssertion(node)) { - return checkAssertionWorker(node, checkMode); + const type = getJSDocTypeAssertionType(node); + return checkAssertionWorker(type, type, node.expression, checkMode); } } return checkExpression(node.expression, checkMode); @@ -37837,7 +37813,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return checkTypeOfExpression(node as TypeOfExpression); case SyntaxKind.TypeAssertionExpression: case SyntaxKind.AsExpression: - return checkAssertion(node as AssertionExpression, checkMode); + return checkAssertion(node as AssertionExpression); case SyntaxKind.NonNullExpression: return checkNonNullAssertion(node as NonNullExpression); case SyntaxKind.ExpressionWithTypeArguments: @@ -44951,10 +44927,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { case SyntaxKind.JsxElement: checkJsxElementDeferred(node as JsxElement); break; - case SyntaxKind.TypeAssertionExpression: - case SyntaxKind.AsExpression: - case SyntaxKind.ParenthesizedExpression: - checkAssertionDeferred(node as AssertionExpression | JSDocTypeAssertion); } currentNode = saveCurrentNode; tracing?.pop(); diff --git a/tests/baselines/reference/classVarianceCircularity.js b/tests/baselines/reference/classVarianceCircularity.js deleted file mode 100644 index 60b4dd2995aab..0000000000000 --- a/tests/baselines/reference/classVarianceCircularity.js +++ /dev/null @@ -1,32 +0,0 @@ -//// [classVarianceCircularity.ts] -// Issue #52813 - -function f() { - const b = new Bar(); - // Uncomment to create error - console.log(b.Value); -} - -class Bar { - num!: number; - // Or swap these two lines - Field: number = (this as Bar).num; - Value = (this as Bar).num; -} - -//// [classVarianceCircularity.js] -"use strict"; -// Issue #52813 -function f() { - var b = new Bar(); - // Uncomment to create error - console.log(b.Value); -} -var Bar = /** @class */ (function () { - function Bar() { - // Or swap these two lines - this.Field = this.num; - this.Value = this.num; - } - return Bar; -}()); diff --git a/tests/baselines/reference/classVarianceCircularity.symbols b/tests/baselines/reference/classVarianceCircularity.symbols deleted file mode 100644 index c0c3085755311..0000000000000 --- a/tests/baselines/reference/classVarianceCircularity.symbols +++ /dev/null @@ -1,42 +0,0 @@ -=== tests/cases/compiler/classVarianceCircularity.ts === -// Issue #52813 - -function f() { ->f : Symbol(f, Decl(classVarianceCircularity.ts, 0, 0)) - - const b = new Bar(); ->b : Symbol(b, Decl(classVarianceCircularity.ts, 3, 9)) ->Bar : Symbol(Bar, Decl(classVarianceCircularity.ts, 6, 1)) - - // Uncomment to create error - console.log(b.Value); ->console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) ->console : Symbol(console, Decl(lib.dom.d.ts, --, --)) ->log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) ->b.Value : Symbol(Bar.Value, Decl(classVarianceCircularity.ts, 11, 43)) ->b : Symbol(b, Decl(classVarianceCircularity.ts, 3, 9)) ->Value : Symbol(Bar.Value, Decl(classVarianceCircularity.ts, 11, 43)) -} - -class Bar { ->Bar : Symbol(Bar, Decl(classVarianceCircularity.ts, 6, 1)) ->T : Symbol(T, Decl(classVarianceCircularity.ts, 8, 10)) - - num!: number; ->num : Symbol(Bar.num, Decl(classVarianceCircularity.ts, 8, 14)) - - // Or swap these two lines - Field: number = (this as Bar).num; ->Field : Symbol(Bar.Field, Decl(classVarianceCircularity.ts, 9, 17)) ->(this as Bar).num : Symbol(Bar.num, Decl(classVarianceCircularity.ts, 8, 14)) ->this : Symbol(Bar, Decl(classVarianceCircularity.ts, 6, 1)) ->Bar : Symbol(Bar, Decl(classVarianceCircularity.ts, 6, 1)) ->num : Symbol(Bar.num, Decl(classVarianceCircularity.ts, 8, 14)) - - Value = (this as Bar).num; ->Value : Symbol(Bar.Value, Decl(classVarianceCircularity.ts, 11, 43)) ->(this as Bar).num : Symbol(Bar.num, Decl(classVarianceCircularity.ts, 8, 14)) ->this : Symbol(Bar, Decl(classVarianceCircularity.ts, 6, 1)) ->Bar : Symbol(Bar, Decl(classVarianceCircularity.ts, 6, 1)) ->num : Symbol(Bar.num, Decl(classVarianceCircularity.ts, 8, 14)) -} diff --git a/tests/baselines/reference/classVarianceCircularity.types b/tests/baselines/reference/classVarianceCircularity.types deleted file mode 100644 index 664e5ef220490..0000000000000 --- a/tests/baselines/reference/classVarianceCircularity.types +++ /dev/null @@ -1,45 +0,0 @@ -=== tests/cases/compiler/classVarianceCircularity.ts === -// Issue #52813 - -function f() { ->f : () => void - - const b = new Bar(); ->b : Bar ->new Bar() : Bar ->Bar : typeof Bar - - // Uncomment to create error - console.log(b.Value); ->console.log(b.Value) : void ->console.log : (...data: any[]) => void ->console : Console ->log : (...data: any[]) => void ->b.Value : number ->b : Bar ->Value : number -} - -class Bar { ->Bar : Bar - - num!: number; ->num : number - - // Or swap these two lines - Field: number = (this as Bar).num; ->Field : number ->(this as Bar).num : number ->(this as Bar) : Bar ->this as Bar : Bar ->this : this ->num : number - - Value = (this as Bar).num; ->Value : number ->(this as Bar).num : number ->(this as Bar) : Bar ->this as Bar : Bar ->this : this ->num : number -} diff --git a/tests/cases/compiler/classVarianceCircularity.ts b/tests/cases/compiler/classVarianceCircularity.ts deleted file mode 100644 index 3c92600d4197d..0000000000000 --- a/tests/cases/compiler/classVarianceCircularity.ts +++ /dev/null @@ -1,16 +0,0 @@ -// @strict: true - -// Issue #52813 - -function f() { - const b = new Bar(); - // Uncomment to create error - console.log(b.Value); -} - -class Bar { - num!: number; - // Or swap these two lines - Field: number = (this as Bar).num; - Value = (this as Bar).num; -} \ No newline at end of file