From 87d8e381c4ad22aae237d18e0cdb5db6e2bd3e80 Mon Sep 17 00:00:00 2001 From: lirismankarina Date: Wed, 7 Jun 2023 14:39:34 +0300 Subject: [PATCH] [ets] Object expression cast Signed-off-by: lirismankarina --- ir/ts/tsAsExpression.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ir/ts/tsAsExpression.cpp b/ir/ts/tsAsExpression.cpp index 09f3db9e3..fbfb140bc 100644 --- a/ir/ts/tsAsExpression.cpp +++ b/ir/ts/tsAsExpression.cpp @@ -21,6 +21,7 @@ #include "plugins/ecmascript/es2panda/compiler/core/ETSGen.h" #include "plugins/ecmascript/es2panda/ir/expressions/identifier.h" #include "plugins/ecmascript/es2panda/ir/expressions/literal.h" +#include "plugins/ecmascript/es2panda/ir/expressions/arrayExpression.h" #include "plugins/ecmascript/es2panda/ir/expressions/memberExpression.h" #include "plugins/ecmascript/es2panda/ir/expressions/unaryExpression.h" #include "plugins/ecmascript/es2panda/ir/typeNode.h" @@ -184,9 +185,14 @@ checker::Type *TSAsExpression::Check([[maybe_unused]] checker::TSChecker *checke checker::Type *TSAsExpression::Check(checker::ETSChecker *const checker) { - auto *const source_type = checker->GetReferredTypeFromETSTypeReference(expression_->Check(checker)); auto *const target_type = checker->GetReferredTypeFromETSTypeReference(TypeAnnotation()->AsTypeNode()->GetType(checker)); + // Object expression requires that its type be set by the context before checking. in this case, the target type + // provides that context. + if (expression_->IsObjectExpression()) { + expression_->SetTsType(target_type); + } + auto *const source_type = checker->GetReferredTypeFromETSTypeReference(expression_->Check(checker)); const checker::CastingContext ctx(checker->Relation(), expression_, source_type, target_type, expression_->Start(), {"Cannot cast type '", source_type, "' to '", target_type, "'"}); -- Gitee