From a8edea5e74f9f9f6ef64478e692dca8c2fa0b53a Mon Sep 17 00:00:00 2001 From: fcc Date: Wed, 18 Jun 2025 09:51:02 +0800 Subject: [PATCH] fix crash related to rest parameter Remove assertion failure in compiler. Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/ICFY21 Signed-off-by: fcc --- ets2panda/checker/ets/aliveAnalyzer.cpp | 3 ++- ets2panda/checker/ets/function.cpp | 17 ++++++--------- ets2panda/checker/ets/typeCreation.cpp | 6 ++---- .../compiler/lowering/ets/lambdaLowering.cpp | 6 ++++++ ets2panda/ir/annotationAllowed.h | 3 ++- ets2panda/ir/as/namedType.cpp | 6 +++--- ets2panda/ir/as/prefixAssertionExpression.cpp | 6 +++--- ets2panda/ir/astNode.h | 8 +++++-- ets2panda/ir/base/catchClause.cpp | 4 ++-- ets2panda/ir/base/classDefinition.cpp | 15 ++++++------- ets2panda/ir/base/classProperty.cpp | 13 +++++++----- ets2panda/ir/base/classStaticBlock.cpp | 2 +- ets2panda/ir/base/decorator.cpp | 2 +- ets2panda/ir/base/methodDefinition.cpp | 9 ++++---- ets2panda/ir/base/property.cpp | 4 ++-- ets2panda/ir/base/scriptFunction.cpp | 4 ++-- ets2panda/ir/base/scriptFunctionSignature.cpp | 7 ++++--- ets2panda/ir/base/spreadElement.cpp | 7 ++++--- ets2panda/ir/base/tsIndexSignature.cpp | 4 ++-- ets2panda/ir/base/tsMethodSignature.cpp | 4 ++-- ets2panda/ir/base/tsPropertySignature.cpp | 5 +++-- ets2panda/ir/ets/etsClassLiteral.cpp | 2 +- ets2panda/ir/ets/etsKeyofType.cpp | 2 +- .../ir/ets/etsNewArrayInstanceExpression.cpp | 4 ++-- .../ir/ets/etsNewClassInstanceExpression.cpp | 4 ++-- .../etsNewMultiDimArrayInstanceExpression.cpp | 4 ++-- ets2panda/ir/ets/etsNonNullishTypeNode.cpp | 2 +- ets2panda/ir/ets/etsPackageDeclaration.cpp | 2 +- ets2panda/ir/ets/etsParameterExpression.cpp | 6 +++--- ets2panda/ir/ets/etsReExportDeclaration.cpp | 2 +- ets2panda/ir/ets/etsTuple.cpp | 2 +- ets2panda/ir/ets/etsTypeReference.cpp | 2 +- ets2panda/ir/ets/etsTypeReferencePart.cpp | 6 +++--- ets2panda/ir/ets/etsUnionType.cpp | 2 +- ets2panda/ir/ets/etsWildcardType.cpp | 3 ++- ets2panda/ir/expressions/arrayExpression.cpp | 7 ++++--- .../expressions/arrowFunctionExpression.cpp | 2 +- .../ir/expressions/assignmentExpression.cpp | 4 ++-- ets2panda/ir/expressions/awaitExpression.cpp | 2 +- ets2panda/ir/expressions/binaryExpression.cpp | 4 ++-- ets2panda/ir/expressions/blockExpression.cpp | 2 +- ets2panda/ir/expressions/callExpression.cpp | 9 ++++---- ets2panda/ir/expressions/chainExpression.cpp | 2 +- ets2panda/ir/expressions/classExpression.cpp | 2 +- .../ir/expressions/conditionalExpression.cpp | 6 +++--- .../ir/expressions/functionExpression.cpp | 2 +- ets2panda/ir/expressions/identifier.cpp | 6 ++++-- ets2panda/ir/expressions/importExpression.cpp | 2 +- ets2panda/ir/expressions/memberExpression.cpp | 4 ++-- ets2panda/ir/expressions/newExpression.cpp | 4 ++-- ets2panda/ir/expressions/objectExpression.cpp | 7 ++++--- .../ir/expressions/sequenceExpression.cpp | 2 +- .../expressions/taggedTemplateExpression.cpp | 6 +++--- ets2panda/ir/expressions/templateLiteral.cpp | 4 ++-- ets2panda/ir/expressions/typeofExpression.cpp | 2 +- ets2panda/ir/expressions/unaryExpression.cpp | 2 +- ets2panda/ir/expressions/updateExpression.cpp | 2 +- ets2panda/ir/expressions/yieldExpression.cpp | 2 +- ets2panda/ir/module/exportAllDeclaration.cpp | 6 +++--- .../ir/module/exportDefaultDeclaration.cpp | 4 ++-- .../ir/module/exportNamedDeclaration.cpp | 10 ++++----- ets2panda/ir/module/exportSpecifier.cpp | 6 +++--- ets2panda/ir/module/importDeclaration.cpp | 5 +++-- .../ir/module/importDefaultSpecifier.cpp | 4 ++-- .../ir/module/importNamespaceSpecifier.cpp | 2 +- ets2panda/ir/module/importSpecifier.cpp | 6 +++--- .../ir/statements/annotationDeclaration.cpp | 5 +++-- ets2panda/ir/statements/annotationUsage.cpp | 4 ++-- ets2panda/ir/statements/blockStatement.cpp | 2 +- ets2panda/ir/statements/breakStatement.cpp | 2 +- ets2panda/ir/statements/classDeclaration.cpp | 5 +++-- ets2panda/ir/statements/continueStatement.cpp | 2 +- ets2panda/ir/statements/doWhileStatement.cpp | 4 ++-- .../ir/statements/expressionStatement.cpp | 2 +- ets2panda/ir/statements/forInStatement.cpp | 6 +++--- ets2panda/ir/statements/forOfStatement.cpp | 6 +++--- .../ir/statements/forUpdateStatement.cpp | 8 +++---- .../ir/statements/functionDeclaration.cpp | 5 +++-- ets2panda/ir/statements/ifStatement.cpp | 6 +++--- ets2panda/ir/statements/labelledStatement.cpp | 4 ++-- ets2panda/ir/statements/returnStatement.cpp | 2 +- .../ir/statements/switchCaseStatement.cpp | 4 ++-- ets2panda/ir/statements/switchStatement.cpp | 4 ++-- ets2panda/ir/statements/throwStatement.cpp | 2 +- ets2panda/ir/statements/tryStatement.cpp | 6 +++--- .../ir/statements/variableDeclaration.cpp | 9 +++++--- .../ir/statements/variableDeclarator.cpp | 4 ++-- ets2panda/ir/statements/whileStatement.cpp | 4 ++-- ets2panda/ir/ts/tsArrayType.cpp | 2 +- ets2panda/ir/ts/tsAsExpression.cpp | 5 +++-- ets2panda/ir/ts/tsClassImplements.cpp | 2 +- ets2panda/ir/ts/tsConditionalType.cpp | 8 +++---- ets2panda/ir/ts/tsEnumDeclaration.cpp | 7 ++++--- ets2panda/ir/ts/tsEnumMember.cpp | 4 ++-- ets2panda/ir/ts/tsExternalModuleReference.cpp | 4 ++-- ets2panda/ir/ts/tsImportEqualsDeclaration.cpp | 7 ++++--- ets2panda/ir/ts/tsImportType.cpp | 6 +++--- ets2panda/ir/ts/tsIndexedAccessType.cpp | 4 ++-- ets2panda/ir/ts/tsInferType.cpp | 2 +- ets2panda/ir/ts/tsInterfaceBody.cpp | 2 +- ets2panda/ir/ts/tsInterfaceDeclaration.cpp | 11 +++++----- ets2panda/ir/ts/tsInterfaceHeritage.cpp | 2 +- ets2panda/ir/ts/tsIntersectionType.cpp | 2 +- ets2panda/ir/ts/tsLiteralType.cpp | 2 +- ets2panda/ir/ts/tsMappedType.cpp | 5 +++-- ets2panda/ir/ts/tsModuleBlock.cpp | 4 ++-- ets2panda/ir/ts/tsModuleDeclaration.cpp | 8 +++---- ets2panda/ir/ts/tsNamedTupleMember.cpp | 4 ++-- ets2panda/ir/ts/tsNonNullExpression.cpp | 2 +- ets2panda/ir/ts/tsParameterProperty.cpp | 4 ++-- ets2panda/ir/ts/tsParenthesizedType.cpp | 2 +- ets2panda/ir/ts/tsQualifiedName.cpp | 4 ++-- ets2panda/ir/ts/tsTupleType.cpp | 2 +- ets2panda/ir/ts/tsTypeAliasDeclaration.cpp | 13 +++++++----- ets2panda/ir/ts/tsTypeAssertion.cpp | 7 ++++--- ets2panda/ir/ts/tsTypeLiteral.cpp | 2 +- ets2panda/ir/ts/tsTypeOperator.cpp | 2 +- ets2panda/ir/ts/tsTypeParameter.cpp | 9 ++++---- .../ir/ts/tsTypeParameterDeclaration.cpp | 2 +- .../ir/ts/tsTypeParameterInstantiation.cpp | 2 +- ets2panda/ir/ts/tsTypePredicate.cpp | 5 +++-- ets2panda/ir/ts/tsTypeQuery.cpp | 2 +- ets2panda/ir/ts/tsTypeReference.cpp | 4 ++-- ets2panda/ir/ts/tsUnionType.cpp | 2 +- .../lambda_infer_type/lambda_rest_param.ets | 21 +++++++++++++++++++ 125 files changed, 318 insertions(+), 260 deletions(-) create mode 100644 ets2panda/test/ast/compiler/ets/lambda_infer_type/lambda_rest_param.ets diff --git a/ets2panda/checker/ets/aliveAnalyzer.cpp b/ets2panda/checker/ets/aliveAnalyzer.cpp index e3b69b9a5a..1ea5c06c03 100644 --- a/ets2panda/checker/ets/aliveAnalyzer.cpp +++ b/ets2panda/checker/ets/aliveAnalyzer.cpp @@ -375,7 +375,8 @@ void AliveAnalyzer::AnalyzeCall(const ir::CallExpression *callExpr) for (const auto *it : callExpr->Arguments()) { AnalyzeNode(it); } - if (callExpr->Signature()->ReturnType() == checker_->GetGlobalTypesHolder()->GlobalETSNeverType()) { + if (callExpr->Signature() != nullptr && + callExpr->Signature()->ReturnType() == checker_->GetGlobalTypesHolder()->GlobalETSNeverType()) { MarkDead(); } } diff --git a/ets2panda/checker/ets/function.cpp b/ets2panda/checker/ets/function.cpp index ea80a961c3..8ebd162350 100644 --- a/ets2panda/checker/ets/function.cpp +++ b/ets2panda/checker/ets/function.cpp @@ -1461,7 +1461,6 @@ bool ETSChecker::CheckIdenticalOverloads(ETSFunctionType *func, ETSFunctionType { // Don't necessary to check overload for invalid functions if (func->Name().Is(ERROR_LITERAL)) { - ES2PANDA_ASSERT(IsAnyError()); return false; } @@ -1493,8 +1492,7 @@ Signature *ETSChecker::ComposeSignature(ir::ScriptFunction *func, SignatureInfo varbinder::Variable *nameVar) { auto *signature = CreateSignature(signatureInfo, returnType, func); - if (signature == nullptr) { // #23134 - ES2PANDA_ASSERT(IsAnyError()); + if (signature == nullptr) { return nullptr; } signature->SetOwner(Context().ContainingClass()); @@ -1527,7 +1525,7 @@ Type *ETSChecker::ComposeReturnType(ir::TypeNode *typeAnnotation, bool isAsync) static varbinder::LocalVariable *SetupSignatureParameter(ir::ETSParameterExpression *param, Type *type) { - auto *const variable = param->Ident()->Variable(); // #23134 + auto *const variable = param->Ident()->Variable(); if (variable == nullptr) { return nullptr; } @@ -1558,7 +1556,7 @@ static bool AppendSignatureInfoParam(ETSChecker *checker, SignatureInfo *sigInfo return checker->GlobalTypeError(); }()); - if (variable == nullptr) { // #23134 + if (variable == nullptr) { return false; } @@ -1586,16 +1584,14 @@ SignatureInfo *ETSChecker::ComposeSignatureInfo(ir::TSTypeParameterDeclaration * for (auto *const p : params) { if (!p->IsETSParameterExpression() || - !AppendSignatureInfoParam(this, signatureInfo, p->AsETSParameterExpression())) { // #23134 - ES2PANDA_ASSERT(IsAnyError()); + !AppendSignatureInfoParam(this, signatureInfo, p->AsETSParameterExpression())) { return nullptr; } } if (!params.empty()) { if (auto param = params.back()->AsETSParameterExpression(); param->IsRestParameter()) { - if (param->TypeAnnotation() == nullptr) { // #23134 - ES2PANDA_ASSERT(IsAnyError()); + if (param->TypeAnnotation() == nullptr) { return nullptr; } auto restParamType = param->RestParameter()->TypeAnnotation()->GetType(this); @@ -1657,8 +1653,7 @@ void ETSChecker::BuildFunctionSignature(ir::ScriptFunction *func, bool isConstru ? func->GetPreferredReturnType() : ComposeReturnType(func->ReturnTypeAnnotation(), func->IsAsyncFunc()); auto *signature = ComposeSignature(func, signatureInfo, returnType, nameVar); - if (signature == nullptr) { // #23134 - ES2PANDA_ASSERT(IsAnyError()); + if (signature == nullptr) { return; } diff --git a/ets2panda/checker/ets/typeCreation.cpp b/ets2panda/checker/ets/typeCreation.cpp index 1c8c6c9a98..1d90416d54 100644 --- a/ets2panda/checker/ets/typeCreation.cpp +++ b/ets2panda/checker/ets/typeCreation.cpp @@ -192,8 +192,7 @@ static SignatureFlags ConvertToSignatureFlags(ir::ModifierFlags inModifiers, ir: Signature *ETSChecker::CreateSignature(SignatureInfo *info, Type *returnType, ir::ScriptFunction *func) { - if (info == nullptr) { // #23134 - ES2PANDA_ASSERT(IsAnyError()); + if (info == nullptr) { return nullptr; } auto signature = ProgramAllocator()->New(info, returnType, func); @@ -206,8 +205,7 @@ Signature *ETSChecker::CreateSignature(SignatureInfo *info, Type *returnType, ir Signature *ETSChecker::CreateSignature(SignatureInfo *info, Type *returnType, ir::ScriptFunctionFlags sff, bool hasReceiver) { - if (info == nullptr) { // #23134 - ES2PANDA_ASSERT(IsAnyError()); + if (info == nullptr) { return nullptr; } auto signature = ProgramAllocator()->New(info, returnType, nullptr); diff --git a/ets2panda/compiler/lowering/ets/lambdaLowering.cpp b/ets2panda/compiler/lowering/ets/lambdaLowering.cpp index c62bcac5c1..0764e54677 100644 --- a/ets2panda/compiler/lowering/ets/lambdaLowering.cpp +++ b/ets2panda/compiler/lowering/ets/lambdaLowering.cpp @@ -955,6 +955,9 @@ static ir::AstNode *ConvertLambda(public_lib::Context *ctx, ir::ArrowFunctionExp auto *checker = ctx->GetChecker()->AsETSChecker(); lambda->Check(checker); + if (lambda->TsType() == nullptr || lambda->TsType()->IsTypeError()) { + return nullptr; + } ES2PANDA_ASSERT(lambda->TsType()->IsETSFunctionType()); LambdaInfo info; @@ -1149,6 +1152,9 @@ static ir::AstNode *InsertInvokeCall(public_lib::Context *ctx, ir::CallExpressio auto *oldCallee = call->Callee(); auto *oldType = checker->GetApparentType(oldCallee->TsType()); + if (oldType == nullptr || oldType->IsTypeError()) { + return nullptr; + } size_t arity = call->Arguments().size(); auto *ifaceType = oldType->IsETSObjectType() ? oldType->AsETSObjectType() diff --git a/ets2panda/ir/annotationAllowed.h b/ets2panda/ir/annotationAllowed.h index 90eea9d954..d9a6cc98b6 100644 --- a/ets2panda/ir/annotationAllowed.h +++ b/ets2panda/ir/annotationAllowed.h @@ -56,7 +56,8 @@ public: { auto &annotations = Annotations(); for (size_t ix = 0; ix < annotations.size(); ix++) { - if (auto *transformedNode = cb(annotations[ix]); annotations[ix] != transformedNode) { + if (auto *transformedNode = cb(annotations[ix]); + annotations[ix] != transformedNode && transformedNode != nullptr) { annotations[ix]->SetTransformedNode(transformationName, transformedNode); SetValueAnnotations(transformedNode->AsAnnotationUsage(), ix); } diff --git a/ets2panda/ir/as/namedType.cpp b/ets2panda/ir/as/namedType.cpp index 48880e1589..79c6519a93 100644 --- a/ets2panda/ir/as/namedType.cpp +++ b/ets2panda/ir/as/namedType.cpp @@ -26,20 +26,20 @@ namespace ark::es2panda::ir { void NamedType::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(name_); name_ != transformedNode) { + if (auto *transformedNode = cb(name_); name_ != transformedNode && transformedNode != nullptr) { name_->SetTransformedNode(transformationName, transformedNode); name_ = transformedNode->AsIdentifier(); } if (typeParams_ != nullptr) { - if (auto *transformedNode = cb(typeParams_); typeParams_ != transformedNode) { + if (auto *transformedNode = cb(typeParams_); typeParams_ != transformedNode && transformedNode != nullptr) { typeParams_->SetTransformedNode(transformationName, transformedNode); typeParams_ = transformedNode->AsTSTypeParameterInstantiation(); } } if (next_ != nullptr) { - if (auto *transformedNode = cb(next_); next_ != transformedNode) { + if (auto *transformedNode = cb(next_); next_ != transformedNode && transformedNode != nullptr) { next_->SetTransformedNode(transformationName, transformedNode); next_ = transformedNode->AsNamedType(); } diff --git a/ets2panda/ir/as/prefixAssertionExpression.cpp b/ets2panda/ir/as/prefixAssertionExpression.cpp index 544713d799..50dbec51fd 100644 --- a/ets2panda/ir/as/prefixAssertionExpression.cpp +++ b/ets2panda/ir/as/prefixAssertionExpression.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -25,12 +25,12 @@ namespace ark::es2panda::ir { void PrefixAssertionExpression::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(type_); type_ != transformedNode) { + if (auto *transformedNode = cb(type_); type_ != transformedNode && transformedNode != nullptr) { type_->SetTransformedNode(transformationName, transformedNode); type_ = static_cast(transformedNode); } - if (auto *transformedNode = cb(expr_); expr_ != transformedNode) { + if (auto *transformedNode = cb(expr_); expr_ != transformedNode && transformedNode != nullptr) { expr_->SetTransformedNode(transformationName, transformedNode); expr_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/astNode.h b/ets2panda/ir/astNode.h index 431dd5a046..35eee16d7b 100644 --- a/ets2panda/ir/astNode.h +++ b/ets2panda/ir/astNode.h @@ -552,7 +552,9 @@ public: { std::function hcb = [&](AstNode *child) { AstNode *res = cb(child); - res->TransformChildren(hcb, transformationName); + if (res != nullptr) { + res->TransformChildren(hcb, transformationName); + } return res; }; TransformChildren(hcb, transformationName); @@ -573,7 +575,9 @@ public: { std::function hcb = [&](AstNode *child) { AstNode *upd = pre(child); - upd->TransformChildren(hcb, transformationName); + if (upd != nullptr) { + upd->TransformChildren(hcb, transformationName); + } post(upd); return upd; }; diff --git a/ets2panda/ir/base/catchClause.cpp b/ets2panda/ir/base/catchClause.cpp index 53b37af715..8eb136193f 100644 --- a/ets2panda/ir/base/catchClause.cpp +++ b/ets2panda/ir/base/catchClause.cpp @@ -23,13 +23,13 @@ namespace ark::es2panda::ir { void CatchClause::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { if (param_ != nullptr) { - if (auto *transformedNode = cb(param_); param_ != transformedNode) { + if (auto *transformedNode = cb(param_); param_ != transformedNode && transformedNode != nullptr) { param_->SetTransformedNode(transformationName, transformedNode); param_ = transformedNode->AsExpression(); } } - if (auto *transformedNode = cb(body_); body_ != transformedNode) { + if (auto *transformedNode = cb(body_); body_ != transformedNode && transformedNode != nullptr) { body_->SetTransformedNode(transformationName, transformedNode); body_ = transformedNode->AsBlockStatement(); } diff --git a/ets2panda/ir/base/classDefinition.cpp b/ets2panda/ir/base/classDefinition.cpp index 5fe57979b3..c6b4ea839d 100644 --- a/ets2panda/ir/base/classDefinition.cpp +++ b/ets2panda/ir/base/classDefinition.cpp @@ -181,7 +181,7 @@ void ClassDefinition::TransformBase(const NodeTransformer &cb, std::string_view { auto const ident = Ident(); if (ident != nullptr) { - if (auto *transformedNode = cb(ident); ident != transformedNode) { + if (auto *transformedNode = cb(ident); ident != transformedNode && transformedNode != nullptr) { ident->SetTransformedNode(transformationName, transformedNode); SetIdent(transformedNode->AsIdentifier()); } @@ -189,7 +189,7 @@ void ClassDefinition::TransformBase(const NodeTransformer &cb, std::string_view auto const typeParam = TypeParams(); if (typeParam != nullptr) { - if (auto *transformedNode = cb(typeParam); typeParam != transformedNode) { + if (auto *transformedNode = cb(typeParam); typeParam != transformedNode && transformedNode != nullptr) { typeParam->SetTransformedNode(transformationName, transformedNode); SetTypeParams(transformedNode->AsTSTypeParameterDeclaration()); } @@ -197,7 +197,7 @@ void ClassDefinition::TransformBase(const NodeTransformer &cb, std::string_view auto const superClass = SuperClass(); if (superClass != nullptr) { - if (auto *transformedNode = cb(superClass); superClass != transformedNode) { + if (auto *transformedNode = cb(superClass); superClass != transformedNode && transformedNode != nullptr) { superClass->SetTransformedNode(transformationName, transformedNode); SetSuperClass(transformedNode->AsExpression()); } @@ -205,7 +205,8 @@ void ClassDefinition::TransformBase(const NodeTransformer &cb, std::string_view auto const superTypeParam = SuperTypeParams(); if (superTypeParam != nullptr) { - if (auto *transformedNode = cb(superTypeParam); superTypeParam != transformedNode) { + if (auto *transformedNode = cb(superTypeParam); + superTypeParam != transformedNode && transformedNode != nullptr) { superTypeParam->SetTransformedNode(transformationName, transformedNode); SetSuperTypeParams(transformedNode->AsTSTypeParameterInstantiation()); } @@ -218,7 +219,7 @@ void ClassDefinition::TransformChildren(const NodeTransformer &cb, std::string_v auto const &implement = Implements(); for (size_t ix = 0; ix < implement.size(); ix++) { - if (auto *transformedNode = cb(implement[ix]); implement[ix] != transformedNode) { + if (auto *transformedNode = cb(implement[ix]); implement[ix] != transformedNode && transformedNode != nullptr) { implement[ix]->SetTransformedNode(transformationName, transformedNode); SetValueImplements(transformedNode->AsTSClassImplements(), ix); } @@ -228,7 +229,7 @@ void ClassDefinition::TransformChildren(const NodeTransformer &cb, std::string_v auto const &ctor = Ctor(); if (ctor != nullptr) { - if (auto *transformedNode = cb(ctor); ctor != transformedNode) { + if (auto *transformedNode = cb(ctor); ctor != transformedNode && transformedNode != nullptr) { ctor->SetTransformedNode(transformationName, transformedNode); SetCtor(transformedNode->AsMethodDefinition()); } @@ -238,7 +239,7 @@ void ClassDefinition::TransformChildren(const NodeTransformer &cb, std::string_v // NOLINTNEXTLINE(modernize-loop-convert) auto const &body = Body(); for (size_t ix = 0; ix < body.size(); ix++) { - if (auto *transformedNode = cb(body[ix]); body[ix] != transformedNode) { + if (auto *transformedNode = cb(body[ix]); body[ix] != transformedNode && transformedNode != nullptr) { body[ix]->SetTransformedNode(transformationName, transformedNode); SetValueBody(transformedNode, ix); } diff --git a/ets2panda/ir/base/classProperty.cpp b/ets2panda/ir/base/classProperty.cpp index 9fb04ee715..5ec70086cc 100644 --- a/ets2panda/ir/base/classProperty.cpp +++ b/ets2panda/ir/base/classProperty.cpp @@ -37,7 +37,7 @@ void ClassProperty::TransformChildren(const NodeTransformer &cb, std::string_vie { auto *key = Key(); if (key != nullptr) { - if (auto *transformedNode = cb(key); key != transformedNode) { + if (auto *transformedNode = cb(key); key != transformedNode && transformedNode != nullptr) { key->SetTransformedNode(transformationName, transformedNode); SetKey(transformedNode->AsExpression()); } @@ -45,7 +45,7 @@ void ClassProperty::TransformChildren(const NodeTransformer &cb, std::string_vie auto *value = Value(); if (value != nullptr) { - if (auto *transformedNode = cb(value); value != transformedNode) { + if (auto *transformedNode = cb(value); value != transformedNode && transformedNode != nullptr) { value->SetTransformedNode(transformationName, transformedNode); SetValue(transformedNode->AsExpression()); } @@ -53,7 +53,8 @@ void ClassProperty::TransformChildren(const NodeTransformer &cb, std::string_vie auto *typeAnnotation = TypeAnnotation(); if (typeAnnotation != nullptr) { - if (auto *transformedNode = cb(typeAnnotation); typeAnnotation != transformedNode) { + if (auto *transformedNode = cb(typeAnnotation); + typeAnnotation != transformedNode && transformedNode != nullptr) { typeAnnotation->SetTransformedNode(transformationName, transformedNode); SetTypeAnnotation(static_cast(transformedNode)); } @@ -61,7 +62,8 @@ void ClassProperty::TransformChildren(const NodeTransformer &cb, std::string_vie auto const &decorators = Decorators(); for (size_t ix = 0; ix < decorators.size(); ix++) { - if (auto *transformedNode = cb(decorators[ix]); decorators[ix] != transformedNode) { + if (auto *transformedNode = cb(decorators[ix]); + decorators[ix] != transformedNode && transformedNode != nullptr) { decorators[ix]->SetTransformedNode(transformationName, transformedNode); SetValueDecorators(transformedNode->AsDecorator(), ix); } @@ -69,7 +71,8 @@ void ClassProperty::TransformChildren(const NodeTransformer &cb, std::string_vie auto const &annotations = Annotations(); for (size_t ix = 0; ix < annotations.size(); ix++) { - if (auto *transformedNode = cb(annotations[ix]); annotations[ix] != transformedNode) { + if (auto *transformedNode = cb(annotations[ix]); + annotations[ix] != transformedNode && transformedNode != nullptr) { annotations[ix]->SetTransformedNode(transformationName, transformedNode); SetValueAnnotations(transformedNode->AsAnnotationUsage(), ix); } diff --git a/ets2panda/ir/base/classStaticBlock.cpp b/ets2panda/ir/base/classStaticBlock.cpp index f8b01d54a7..f44c717440 100644 --- a/ets2panda/ir/base/classStaticBlock.cpp +++ b/ets2panda/ir/base/classStaticBlock.cpp @@ -31,7 +31,7 @@ namespace ark::es2panda::ir { void ClassStaticBlock::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { auto const value = Value(); - if (auto *transformedNode = cb(value); value != transformedNode) { + if (auto *transformedNode = cb(value); value != transformedNode && transformedNode != nullptr) { value->SetTransformedNode(transformationName, transformedNode); SetValue(transformedNode->AsExpression()); } diff --git a/ets2panda/ir/base/decorator.cpp b/ets2panda/ir/base/decorator.cpp index 08bb4ffc5c..9824aea6e5 100644 --- a/ets2panda/ir/base/decorator.cpp +++ b/ets2panda/ir/base/decorator.cpp @@ -23,7 +23,7 @@ namespace ark::es2panda::ir { void Decorator::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(expr_); expr_ != transformedNode) { + if (auto *transformedNode = cb(expr_); expr_ != transformedNode && transformedNode != nullptr) { expr_->SetTransformedNode(transformationName, transformedNode); expr_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/base/methodDefinition.cpp b/ets2panda/ir/base/methodDefinition.cpp index 6f705a2f97..e0e0bac901 100644 --- a/ets2panda/ir/base/methodDefinition.cpp +++ b/ets2panda/ir/base/methodDefinition.cpp @@ -106,20 +106,20 @@ void MethodDefinition::Iterate(const NodeTraverser &cb) const void MethodDefinition::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { auto *key = Key(); - if (auto *transformedNode = cb(key); key != transformedNode) { + if (auto *transformedNode = cb(key); key != transformedNode && transformedNode != nullptr) { key->SetTransformedNode(transformationName, transformedNode); SetKey(transformedNode->AsExpression()); } auto *value = Value(); - if (auto *transformedNode = cb(value); value != transformedNode) { + if (auto *transformedNode = cb(value); value != transformedNode && transformedNode != nullptr) { value->SetTransformedNode(transformationName, transformedNode); SetValue(transformedNode->AsExpression()); } auto const &overloads = Overloads(); for (size_t ix = 0; ix < overloads.size(); ix++) { - if (auto *transformedNode = cb(overloads[ix]); overloads[ix] != transformedNode) { + if (auto *transformedNode = cb(overloads[ix]); overloads[ix] != transformedNode && transformedNode != nullptr) { overloads[ix]->SetTransformedNode(transformationName, transformedNode); SetValueOverloads(transformedNode->AsMethodDefinition(), ix); } @@ -127,7 +127,8 @@ void MethodDefinition::TransformChildren(const NodeTransformer &cb, std::string_ auto const &decorators = Decorators(); for (size_t ix = 0; ix < decorators.size(); ix++) { - if (auto *transformedNode = cb(decorators[ix]); decorators[ix] != transformedNode) { + if (auto *transformedNode = cb(decorators[ix]); + decorators[ix] != transformedNode && transformedNode != nullptr) { decorators[ix]->SetTransformedNode(transformationName, transformedNode); SetValueDecorators(transformedNode->AsDecorator(), ix); } diff --git a/ets2panda/ir/base/property.cpp b/ets2panda/ir/base/property.cpp index 24deab39d0..ddcbeea86e 100644 --- a/ets2panda/ir/base/property.cpp +++ b/ets2panda/ir/base/property.cpp @@ -117,12 +117,12 @@ ValidationInfo Property::ValidateExpression() void Property::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(key_); key_ != transformedNode) { + if (auto *transformedNode = cb(key_); key_ != transformedNode && transformedNode != nullptr) { key_->SetTransformedNode(transformationName, transformedNode); key_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(value_); value_ != transformedNode) { + if (auto *transformedNode = cb(value_); value_ != transformedNode && transformedNode != nullptr) { value_->SetTransformedNode(transformationName, transformedNode); value_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/base/scriptFunction.cpp b/ets2panda/ir/base/scriptFunction.cpp index 71fe36ba69..034ab5d1cd 100644 --- a/ets2panda/ir/base/scriptFunction.cpp +++ b/ets2panda/ir/base/scriptFunction.cpp @@ -209,7 +209,7 @@ void ScriptFunction::TransformChildren(const NodeTransformer &cb, std::string_vi { auto const id = Id(); if (id != nullptr) { - if (auto *transformedNode = cb(id); id != transformedNode) { + if (auto *transformedNode = cb(id); id != transformedNode && transformedNode != nullptr) { id->SetTransformedNode(transformationName, transformedNode); SetIdent(transformedNode->AsIdentifier()); } @@ -219,7 +219,7 @@ void ScriptFunction::TransformChildren(const NodeTransformer &cb, std::string_vi auto const &body = Body(); if (body != nullptr) { - if (auto *transformedNode = cb(body); body != transformedNode) { + if (auto *transformedNode = cb(body); body != transformedNode && transformedNode != nullptr) { body->SetTransformedNode(transformationName, transformedNode); SetBody(transformedNode); } diff --git a/ets2panda/ir/base/scriptFunctionSignature.cpp b/ets2panda/ir/base/scriptFunctionSignature.cpp index 85b03b1dc0..f4c40b2539 100644 --- a/ets2panda/ir/base/scriptFunctionSignature.cpp +++ b/ets2panda/ir/base/scriptFunctionSignature.cpp @@ -37,21 +37,22 @@ void FunctionSignature::Iterate(const NodeTraverser &cb) const void FunctionSignature::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { if (typeParams_ != nullptr) { - if (auto *transformedNode = cb(typeParams_); typeParams_ != transformedNode) { + if (auto *transformedNode = cb(typeParams_); typeParams_ != transformedNode && transformedNode != nullptr) { typeParams_->SetTransformedNode(transformationName, transformedNode); typeParams_ = transformedNode->AsTSTypeParameterDeclaration(); } } for (auto *&it : VectorIterationGuard(params_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsExpression(); } } if (returnTypeAnnotation_ != nullptr) { - if (auto *transformedNode = cb(returnTypeAnnotation_); returnTypeAnnotation_ != transformedNode) { + if (auto *transformedNode = cb(returnTypeAnnotation_); + returnTypeAnnotation_ != transformedNode && transformedNode != nullptr) { returnTypeAnnotation_->SetTransformedNode(transformationName, transformedNode); returnTypeAnnotation_ = static_cast(transformedNode); } diff --git a/ets2panda/ir/base/spreadElement.cpp b/ets2panda/ir/base/spreadElement.cpp index a841793031..9c6bf01bbe 100644 --- a/ets2panda/ir/base/spreadElement.cpp +++ b/ets2panda/ir/base/spreadElement.cpp @@ -98,19 +98,20 @@ bool SpreadElement::ConvertibleToRest(bool isDeclaration, bool allowPattern) void SpreadElement::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { for (auto *&it : VectorIterationGuard(decorators_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsDecorator(); } } - if (auto *transformedNode = cb(argument_); argument_ != transformedNode) { + if (auto *transformedNode = cb(argument_); argument_ != transformedNode && transformedNode != nullptr) { argument_->SetTransformedNode(transformationName, transformedNode); argument_ = transformedNode->AsExpression(); } if (auto *const typeAnnotation = TypeAnnotation(); typeAnnotation != nullptr) { - if (auto *transformedNode = cb(typeAnnotation); typeAnnotation != transformedNode) { + if (auto *transformedNode = cb(typeAnnotation); + typeAnnotation != transformedNode && transformedNode != nullptr) { typeAnnotation->SetTransformedNode(transformationName, transformedNode); SetTsTypeAnnotation(static_cast(transformedNode)); } diff --git a/ets2panda/ir/base/tsIndexSignature.cpp b/ets2panda/ir/base/tsIndexSignature.cpp index ae7cd74478..08d8e3dbe0 100644 --- a/ets2panda/ir/base/tsIndexSignature.cpp +++ b/ets2panda/ir/base/tsIndexSignature.cpp @@ -28,12 +28,12 @@ TSIndexSignature::TSIndexSignatureKind TSIndexSignature::Kind() const noexcept void TSIndexSignature::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(param_); param_ != transformedNode) { + if (auto *transformedNode = cb(param_); param_ != transformedNode && transformedNode != nullptr) { param_->SetTransformedNode(transformationName, transformedNode); param_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(typeAnnotation_); typeAnnotation_ != transformedNode) { + if (auto *transformedNode = cb(typeAnnotation_); typeAnnotation_ != transformedNode && transformedNode != nullptr) { typeAnnotation_->SetTransformedNode(transformationName, transformedNode); typeAnnotation_ = static_cast(transformedNode); } diff --git a/ets2panda/ir/base/tsMethodSignature.cpp b/ets2panda/ir/base/tsMethodSignature.cpp index de2b99a6a1..0cbd1a986a 100644 --- a/ets2panda/ir/base/tsMethodSignature.cpp +++ b/ets2panda/ir/base/tsMethodSignature.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -23,7 +23,7 @@ namespace ark::es2panda::ir { void TSMethodSignature::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(key_); key_ != transformedNode) { + if (auto *transformedNode = cb(key_); key_ != transformedNode && transformedNode != nullptr) { key_->SetTransformedNode(transformationName, transformedNode); key_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/base/tsPropertySignature.cpp b/ets2panda/ir/base/tsPropertySignature.cpp index 7c993c2ad7..78df8b2c41 100644 --- a/ets2panda/ir/base/tsPropertySignature.cpp +++ b/ets2panda/ir/base/tsPropertySignature.cpp @@ -22,13 +22,14 @@ namespace ark::es2panda::ir { void TSPropertySignature::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(key_); key_ != transformedNode) { + if (auto *transformedNode = cb(key_); key_ != transformedNode && transformedNode != nullptr) { key_->SetTransformedNode(transformationName, transformedNode); key_ = transformedNode->AsExpression(); } if (auto *const typeAnnotation = TypeAnnotation(); typeAnnotation != nullptr) { - if (auto *transformedNode = cb(typeAnnotation); typeAnnotation != transformedNode) { + if (auto *transformedNode = cb(typeAnnotation); + typeAnnotation != transformedNode && transformedNode != nullptr && transformedNode != nullptr) { typeAnnotation->SetTransformedNode(transformationName, transformedNode); SetTsTypeAnnotation(static_cast(transformedNode)); } diff --git a/ets2panda/ir/ets/etsClassLiteral.cpp b/ets2panda/ir/ets/etsClassLiteral.cpp index fa65001a99..9789eb63c3 100644 --- a/ets2panda/ir/ets/etsClassLiteral.cpp +++ b/ets2panda/ir/ets/etsClassLiteral.cpp @@ -22,7 +22,7 @@ namespace ark::es2panda::ir { void ETSClassLiteral::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(expr_); expr_ != transformedNode) { + if (auto *transformedNode = cb(expr_); expr_ != transformedNode && transformedNode != nullptr) { expr_->SetTransformedNode(transformationName, transformedNode); expr_ = static_cast(transformedNode); } diff --git a/ets2panda/ir/ets/etsKeyofType.cpp b/ets2panda/ir/ets/etsKeyofType.cpp index d266214e5b..ebb0a48af0 100644 --- a/ets2panda/ir/ets/etsKeyofType.cpp +++ b/ets2panda/ir/ets/etsKeyofType.cpp @@ -20,7 +20,7 @@ namespace ark::es2panda::ir { void ETSKeyofType::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(type_); type_ != transformedNode) { + if (auto *transformedNode = cb(type_); type_ != transformedNode && transformedNode != nullptr) { type_->SetTransformedNode(transformationName, transformedNode); type_ = static_cast(transformedNode); } diff --git a/ets2panda/ir/ets/etsNewArrayInstanceExpression.cpp b/ets2panda/ir/ets/etsNewArrayInstanceExpression.cpp index db8c7b5eea..29581a4b5c 100644 --- a/ets2panda/ir/ets/etsNewArrayInstanceExpression.cpp +++ b/ets2panda/ir/ets/etsNewArrayInstanceExpression.cpp @@ -25,12 +25,12 @@ namespace ark::es2panda::ir { void ETSNewArrayInstanceExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(typeReference_); typeReference_ != transformedNode) { + if (auto *transformedNode = cb(typeReference_); typeReference_ != transformedNode && transformedNode != nullptr) { typeReference_->SetTransformedNode(transformationName, transformedNode); typeReference_ = static_cast(transformedNode); } - if (auto *transformedNode = cb(dimension_); dimension_ != transformedNode) { + if (auto *transformedNode = cb(dimension_); dimension_ != transformedNode && transformedNode != nullptr) { dimension_->SetTransformedNode(transformationName, transformedNode); dimension_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ets/etsNewClassInstanceExpression.cpp b/ets2panda/ir/ets/etsNewClassInstanceExpression.cpp index 4a32953e5d..85429c9ccb 100644 --- a/ets2panda/ir/ets/etsNewClassInstanceExpression.cpp +++ b/ets2panda/ir/ets/etsNewClassInstanceExpression.cpp @@ -22,13 +22,13 @@ namespace ark::es2panda::ir { void ETSNewClassInstanceExpression::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(typeReference_); typeReference_ != transformedNode) { + if (auto *transformedNode = cb(typeReference_); typeReference_ != transformedNode && transformedNode != nullptr) { typeReference_->SetTransformedNode(transformationName, transformedNode); typeReference_ = transformedNode->AsExpression(); } for (auto *&arg : arguments_) { - if (auto *transformedNode = cb(arg); arg != transformedNode) { + if (auto *transformedNode = cb(arg); arg != transformedNode && transformedNode != nullptr) { arg->SetTransformedNode(transformationName, transformedNode); arg = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ets/etsNewMultiDimArrayInstanceExpression.cpp b/ets2panda/ir/ets/etsNewMultiDimArrayInstanceExpression.cpp index d5cd0530e8..4308404156 100644 --- a/ets2panda/ir/ets/etsNewMultiDimArrayInstanceExpression.cpp +++ b/ets2panda/ir/ets/etsNewMultiDimArrayInstanceExpression.cpp @@ -24,13 +24,13 @@ namespace ark::es2panda::ir { void ETSNewMultiDimArrayInstanceExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(typeReference_); typeReference_ != transformedNode) { + if (auto *transformedNode = cb(typeReference_); typeReference_ != transformedNode && transformedNode != nullptr) { typeReference_->SetTransformedNode(transformationName, transformedNode); typeReference_ = static_cast(transformedNode); } for (auto *&dim : dimensions_) { - if (auto *transformedNode = cb(dim); dim != transformedNode) { + if (auto *transformedNode = cb(dim); dim != transformedNode && transformedNode != nullptr) { dim->SetTransformedNode(transformationName, transformedNode); dim = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ets/etsNonNullishTypeNode.cpp b/ets2panda/ir/ets/etsNonNullishTypeNode.cpp index 14226f3c0f..be9d02552a 100644 --- a/ets2panda/ir/ets/etsNonNullishTypeNode.cpp +++ b/ets2panda/ir/ets/etsNonNullishTypeNode.cpp @@ -20,7 +20,7 @@ namespace ark::es2panda::ir { void ETSNonNullishTypeNode::TransformChildren([[maybe_unused]] const NodeTransformer &cb, [[maybe_unused]] std::string_view const transformationName) { - if (auto *transformedNode = cb(typeNode_); typeNode_ != transformedNode) { + if (auto *transformedNode = cb(typeNode_); typeNode_ != transformedNode && transformedNode != nullptr) { typeNode_->SetTransformedNode(transformationName, transformedNode); typeNode_ = static_cast(transformedNode); } diff --git a/ets2panda/ir/ets/etsPackageDeclaration.cpp b/ets2panda/ir/ets/etsPackageDeclaration.cpp index 277abfc2d3..f4b2a2accf 100644 --- a/ets2panda/ir/ets/etsPackageDeclaration.cpp +++ b/ets2panda/ir/ets/etsPackageDeclaration.cpp @@ -22,7 +22,7 @@ namespace ark::es2panda::ir { void ETSPackageDeclaration::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(name_); name_ != transformedNode) { + if (auto *transformedNode = cb(name_); name_ != transformedNode && transformedNode != nullptr) { name_->SetTransformedNode(transformationName, transformedNode); name_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ets/etsParameterExpression.cpp b/ets2panda/ir/ets/etsParameterExpression.cpp index 300573755b..f7006c894e 100644 --- a/ets2panda/ir/ets/etsParameterExpression.cpp +++ b/ets2panda/ir/ets/etsParameterExpression.cpp @@ -162,13 +162,13 @@ void ETSParameterExpression::TransformChildren(const NodeTransformer &cb, std::s auto const ident = Ident(); auto newNode = GetOrCreateHistoryNodeAs(); if (IsRestParameter()) { - if (auto *transformedNode = cb(spread); spread != transformedNode) { + if (auto *transformedNode = cb(spread); spread != transformedNode && transformedNode != nullptr) { spread->SetTransformedNode(transformationName, transformedNode); SetSpread(transformedNode->AsRestElement()); } newNode->ident_ = Spread()->Argument()->AsIdentifier(); } else { - if (auto *transformedNode = cb(ident); ident != transformedNode) { + if (auto *transformedNode = cb(ident); ident != transformedNode && transformedNode != nullptr) { ident->SetTransformedNode(transformationName, transformedNode); SetIdent(transformedNode->AsIdentifier()); } @@ -176,7 +176,7 @@ void ETSParameterExpression::TransformChildren(const NodeTransformer &cb, std::s auto const initializer = Initializer(); if (initializer != nullptr) { - if (auto *transformedNode = cb(initializer); initializer != transformedNode) { + if (auto *transformedNode = cb(initializer); initializer != transformedNode && transformedNode != nullptr) { initializer->SetTransformedNode(transformationName, transformedNode); SetInitializer(transformedNode->AsExpression()); } diff --git a/ets2panda/ir/ets/etsReExportDeclaration.cpp b/ets2panda/ir/ets/etsReExportDeclaration.cpp index 4475c8b08c..97dd4af5c9 100644 --- a/ets2panda/ir/ets/etsReExportDeclaration.cpp +++ b/ets2panda/ir/ets/etsReExportDeclaration.cpp @@ -42,7 +42,7 @@ void ETSReExportDeclaration::TransformChildren(const NodeTransformer &cb, std::s { auto const etsImportDecl = GetETSImportDeclarations(); if (etsImportDecl != nullptr) { - if (auto *transformedNode = cb(etsImportDecl); etsImportDecl != transformedNode) { + if (auto *transformedNode = cb(etsImportDecl); etsImportDecl != transformedNode && transformedNode != nullptr) { etsImportDecl->SetTransformedNode(transformationName, transformedNode); SetETSImportDeclarations(transformedNode->AsETSImportDeclaration()); } diff --git a/ets2panda/ir/ets/etsTuple.cpp b/ets2panda/ir/ets/etsTuple.cpp index 3b143a0872..a75fd4b2cc 100644 --- a/ets2panda/ir/ets/etsTuple.cpp +++ b/ets2panda/ir/ets/etsTuple.cpp @@ -23,7 +23,7 @@ namespace ark::es2panda::ir { void ETSTuple::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { for (auto *&it : GetTupleTypeAnnotationsList()) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = static_cast(transformedNode); } diff --git a/ets2panda/ir/ets/etsTypeReference.cpp b/ets2panda/ir/ets/etsTypeReference.cpp index 7986198c72..59865bf9c5 100644 --- a/ets2panda/ir/ets/etsTypeReference.cpp +++ b/ets2panda/ir/ets/etsTypeReference.cpp @@ -30,7 +30,7 @@ void ETSTypeReference::SetPart(ETSTypeReferencePart *part) void ETSTypeReference::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { auto const part = Part(); - if (auto *transformedNode = cb(part); part != transformedNode) { + if (auto *transformedNode = cb(part); part != transformedNode && transformedNode != nullptr) { part->SetTransformedNode(transformationName, transformedNode); SetPart(transformedNode->AsETSTypeReferencePart()); } diff --git a/ets2panda/ir/ets/etsTypeReferencePart.cpp b/ets2panda/ir/ets/etsTypeReferencePart.cpp index 9dbef072a2..1169fd75cb 100644 --- a/ets2panda/ir/ets/etsTypeReferencePart.cpp +++ b/ets2panda/ir/ets/etsTypeReferencePart.cpp @@ -42,7 +42,7 @@ void ETSTypeReferencePart::TransformChildren(const NodeTransformer &cb, std::str { auto const name = Name(); if (name != nullptr) { - if (auto *transformedNode = cb(name); name != transformedNode) { + if (auto *transformedNode = cb(name); name != transformedNode && transformedNode != nullptr) { name->SetTransformedNode(transformationName, transformedNode); SetName(transformedNode->AsExpression()); } @@ -50,7 +50,7 @@ void ETSTypeReferencePart::TransformChildren(const NodeTransformer &cb, std::str auto const typeParams = TypeParams(); if (typeParams != nullptr) { - if (auto *transformedNode = cb(typeParams); typeParams != transformedNode) { + if (auto *transformedNode = cb(typeParams); typeParams != transformedNode && transformedNode != nullptr) { typeParams->SetTransformedNode(transformationName, transformedNode); SetTypeParams(transformedNode->AsTSTypeParameterInstantiation()); } @@ -58,7 +58,7 @@ void ETSTypeReferencePart::TransformChildren(const NodeTransformer &cb, std::str auto const prev = Previous(); if (prev != nullptr) { - if (auto *transformedNode = cb(prev); prev != transformedNode) { + if (auto *transformedNode = cb(prev); prev != transformedNode && transformedNode != nullptr) { prev->SetTransformedNode(transformationName, transformedNode); SetPrevious(transformedNode->AsETSTypeReferencePart()); } diff --git a/ets2panda/ir/ets/etsUnionType.cpp b/ets2panda/ir/ets/etsUnionType.cpp index de035bcd61..b4f3934f7e 100644 --- a/ets2panda/ir/ets/etsUnionType.cpp +++ b/ets2panda/ir/ets/etsUnionType.cpp @@ -22,7 +22,7 @@ void ETSUnionType::TransformChildren(const NodeTransformer &cb, std::string_view { auto const &types = Types(); for (size_t ix = 0; ix < types.size(); ix++) { - if (auto *transformedNode = cb(types[ix]); types[ix] != transformedNode) { + if (auto *transformedNode = cb(types[ix]); types[ix] != transformedNode && transformedNode != nullptr) { types[ix]->SetTransformedNode(transformationName, transformedNode); SetValueTypes(static_cast(transformedNode), ix); } diff --git a/ets2panda/ir/ets/etsWildcardType.cpp b/ets2panda/ir/ets/etsWildcardType.cpp index ab5ffc9e50..aaff31fc98 100644 --- a/ets2panda/ir/ets/etsWildcardType.cpp +++ b/ets2panda/ir/ets/etsWildcardType.cpp @@ -27,7 +27,8 @@ namespace ark::es2panda::ir { void ETSWildcardType::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { if (typeReference_ != nullptr) { - if (auto *transformedNode = cb(typeReference_); typeReference_ != transformedNode) { + if (auto *transformedNode = cb(typeReference_); + typeReference_ != transformedNode && transformedNode != nullptr) { typeReference_->SetTransformedNode(transformationName, transformedNode); typeReference_ = transformedNode->AsETSTypeReference(); } diff --git a/ets2panda/ir/expressions/arrayExpression.cpp b/ets2panda/ir/expressions/arrayExpression.cpp index 418e936818..381571a852 100644 --- a/ets2panda/ir/expressions/arrayExpression.cpp +++ b/ets2panda/ir/expressions/arrayExpression.cpp @@ -159,21 +159,22 @@ ValidationInfo ArrayExpression::ValidateExpression() void ArrayExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { for (auto *&it : VectorIterationGuard(decorators_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsDecorator(); } } for (auto *&it : VectorIterationGuard(elements_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsExpression(); } } if (auto *typeAnnotation = TypeAnnotation(); typeAnnotation != nullptr) { - if (auto *transformedNode = cb(typeAnnotation); typeAnnotation != transformedNode) { + if (auto *transformedNode = cb(typeAnnotation); + typeAnnotation != transformedNode && transformedNode != nullptr) { typeAnnotation->SetTransformedNode(transformationName, transformedNode); SetTsTypeAnnotation(static_cast(transformedNode)); } diff --git a/ets2panda/ir/expressions/arrowFunctionExpression.cpp b/ets2panda/ir/expressions/arrowFunctionExpression.cpp index 772cf69fc0..d4e0b1fd51 100644 --- a/ets2panda/ir/expressions/arrowFunctionExpression.cpp +++ b/ets2panda/ir/expressions/arrowFunctionExpression.cpp @@ -23,7 +23,7 @@ namespace ark::es2panda::ir { void ArrowFunctionExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(func_); func_ != transformedNode) { + if (auto *transformedNode = cb(func_); func_ != transformedNode && transformedNode != nullptr) { func_->SetTransformedNode(transformationName, transformedNode); func_ = transformedNode->AsScriptFunction(); } diff --git a/ets2panda/ir/expressions/assignmentExpression.cpp b/ets2panda/ir/expressions/assignmentExpression.cpp index d6ff928480..e639889246 100644 --- a/ets2panda/ir/expressions/assignmentExpression.cpp +++ b/ets2panda/ir/expressions/assignmentExpression.cpp @@ -84,12 +84,12 @@ bool AssignmentExpression::ConvertibleToAssignmentPattern(bool mustBePattern) void AssignmentExpression::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(left_); left_ != transformedNode) { + if (auto *transformedNode = cb(left_); left_ != transformedNode && transformedNode != nullptr) { left_->SetTransformedNode(transformationName, transformedNode); left_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(right_); right_ != transformedNode) { + if (auto *transformedNode = cb(right_); right_ != transformedNode && transformedNode != nullptr) { right_->SetTransformedNode(transformationName, transformedNode); right_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/expressions/awaitExpression.cpp b/ets2panda/ir/expressions/awaitExpression.cpp index 6071bd4155..c58f6a9111 100644 --- a/ets2panda/ir/expressions/awaitExpression.cpp +++ b/ets2panda/ir/expressions/awaitExpression.cpp @@ -23,7 +23,7 @@ namespace ark::es2panda::ir { void AwaitExpression::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { if (argument_ != nullptr) { - if (auto *transformedNode = cb(argument_); argument_ != transformedNode) { + if (auto *transformedNode = cb(argument_); argument_ != transformedNode && transformedNode != nullptr) { argument_->SetTransformedNode(transformationName, transformedNode); argument_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/expressions/binaryExpression.cpp b/ets2panda/ir/expressions/binaryExpression.cpp index 21babd5626..3ae20b372d 100644 --- a/ets2panda/ir/expressions/binaryExpression.cpp +++ b/ets2panda/ir/expressions/binaryExpression.cpp @@ -22,12 +22,12 @@ namespace ark::es2panda::ir { void BinaryExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(left_); left_ != transformedNode) { + if (auto *transformedNode = cb(left_); left_ != transformedNode && transformedNode != nullptr) { left_->SetTransformedNode(transformationName, transformedNode); left_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(right_); right_ != transformedNode) { + if (auto *transformedNode = cb(right_); right_ != transformedNode && transformedNode != nullptr) { right_->SetTransformedNode(transformationName, transformedNode); right_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/expressions/blockExpression.cpp b/ets2panda/ir/expressions/blockExpression.cpp index c38cb57710..31caf86dec 100644 --- a/ets2panda/ir/expressions/blockExpression.cpp +++ b/ets2panda/ir/expressions/blockExpression.cpp @@ -50,7 +50,7 @@ BlockExpression *BlockExpression::Clone(ArenaAllocator *const allocator, AstNode void BlockExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { for (auto *&node : statements_) { - if (auto *transformedNode = cb(node); node != transformedNode) { + if (auto *transformedNode = cb(node); node != transformedNode && transformedNode != nullptr) { node->SetTransformedNode(transformationName, transformedNode); node = transformedNode->AsStatement(); } diff --git a/ets2panda/ir/expressions/callExpression.cpp b/ets2panda/ir/expressions/callExpression.cpp index a7bfa507bb..5b79bde506 100644 --- a/ets2panda/ir/expressions/callExpression.cpp +++ b/ets2panda/ir/expressions/callExpression.cpp @@ -22,27 +22,28 @@ namespace ark::es2panda::ir { void CallExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(callee_); callee_ != transformedNode) { + if (auto *transformedNode = cb(callee_); callee_ != transformedNode && transformedNode != nullptr) { callee_->SetTransformedNode(transformationName, transformedNode); callee_ = transformedNode->AsExpression(); } if (typeParams_ != nullptr) { - if (auto *transformedNode = cb(typeParams_); typeParams_ != transformedNode) { + if (auto *transformedNode = cb(typeParams_); typeParams_ != transformedNode && transformedNode != nullptr) { typeParams_->SetTransformedNode(transformationName, transformedNode); typeParams_ = transformedNode->AsTSTypeParameterInstantiation(); } } for (auto *&it : VectorIterationGuard(arguments_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsExpression(); } } if (trailingLambdaInfo_.block != nullptr) { - if (auto *transformedNode = cb(trailingLambdaInfo_.block); trailingLambdaInfo_.block != transformedNode) { + if (auto *transformedNode = cb(trailingLambdaInfo_.block); + trailingLambdaInfo_.block != transformedNode && transformedNode != nullptr) { trailingLambdaInfo_.block->SetTransformedNode(transformationName, transformedNode); trailingLambdaInfo_.block = transformedNode->AsBlockStatement(); } diff --git a/ets2panda/ir/expressions/chainExpression.cpp b/ets2panda/ir/expressions/chainExpression.cpp index d805249fd3..980701fd83 100644 --- a/ets2panda/ir/expressions/chainExpression.cpp +++ b/ets2panda/ir/expressions/chainExpression.cpp @@ -22,7 +22,7 @@ namespace ark::es2panda::ir { void ChainExpression::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(expression_); expression_ != transformedNode) { + if (auto *transformedNode = cb(expression_); expression_ != transformedNode && transformedNode != nullptr) { expression_->SetTransformedNode(transformationName, transformedNode); expression_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/expressions/classExpression.cpp b/ets2panda/ir/expressions/classExpression.cpp index d5d8d83cfb..fa4ed95066 100644 --- a/ets2panda/ir/expressions/classExpression.cpp +++ b/ets2panda/ir/expressions/classExpression.cpp @@ -22,7 +22,7 @@ namespace ark::es2panda::ir { void ClassExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(def_); def_ != transformedNode) { + if (auto *transformedNode = cb(def_); def_ != transformedNode && transformedNode != nullptr) { def_->SetTransformedNode(transformationName, transformedNode); def_ = transformedNode->AsClassDefinition(); } diff --git a/ets2panda/ir/expressions/conditionalExpression.cpp b/ets2panda/ir/expressions/conditionalExpression.cpp index e0db6c2ec3..3c7f846fe7 100644 --- a/ets2panda/ir/expressions/conditionalExpression.cpp +++ b/ets2panda/ir/expressions/conditionalExpression.cpp @@ -22,17 +22,17 @@ namespace ark::es2panda::ir { void ConditionalExpression::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(test_); test_ != transformedNode) { + if (auto *transformedNode = cb(test_); test_ != transformedNode && transformedNode != nullptr) { test_->SetTransformedNode(transformationName, transformedNode); test_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(consequent_); consequent_ != transformedNode) { + if (auto *transformedNode = cb(consequent_); consequent_ != transformedNode && transformedNode != nullptr) { consequent_->SetTransformedNode(transformationName, transformedNode); consequent_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(alternate_); alternate_ != transformedNode) { + if (auto *transformedNode = cb(alternate_); alternate_ != transformedNode && transformedNode != nullptr) { alternate_->SetTransformedNode(transformationName, transformedNode); alternate_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/expressions/functionExpression.cpp b/ets2panda/ir/expressions/functionExpression.cpp index 8e39aaff4b..6ab33a2d40 100644 --- a/ets2panda/ir/expressions/functionExpression.cpp +++ b/ets2panda/ir/expressions/functionExpression.cpp @@ -22,7 +22,7 @@ namespace ark::es2panda::ir { void FunctionExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(func_); func_ != transformedNode) { + if (auto *transformedNode = cb(func_); func_ != transformedNode && transformedNode != nullptr) { func_->SetTransformedNode(transformationName, transformedNode); func_ = transformedNode->AsScriptFunction(); } diff --git a/ets2panda/ir/expressions/identifier.cpp b/ets2panda/ir/expressions/identifier.cpp index 7689fcca37..6574115daa 100644 --- a/ets2panda/ir/expressions/identifier.cpp +++ b/ets2panda/ir/expressions/identifier.cpp @@ -95,7 +95,8 @@ Identifier *Identifier::CloneReference(ArenaAllocator *const allocator, AstNode void Identifier::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { if (auto *typeAnnotation = TypeAnnotation(); typeAnnotation != nullptr) { - if (auto *transformedNode = cb(typeAnnotation); typeAnnotation != transformedNode) { + if (auto *transformedNode = cb(typeAnnotation); + typeAnnotation != transformedNode && transformedNode != nullptr) { typeAnnotation->SetTransformedNode(transformationName, transformedNode); SetTsTypeAnnotation(static_cast(transformedNode)); } @@ -103,7 +104,8 @@ void Identifier::TransformChildren(const NodeTransformer &cb, std::string_view c auto const &decorators = Decorators(); for (size_t ix = 0; ix < decorators.size(); ix++) { - if (auto *transformedNode = cb(decorators[ix]); decorators[ix] != transformedNode) { + if (auto *transformedNode = cb(decorators[ix]); + decorators[ix] != transformedNode && transformedNode != nullptr) { decorators[ix]->SetTransformedNode(transformationName, transformedNode); SetValueDecorators(transformedNode->AsDecorator(), ix); } diff --git a/ets2panda/ir/expressions/importExpression.cpp b/ets2panda/ir/expressions/importExpression.cpp index 9a0c7d40fe..8585eda326 100644 --- a/ets2panda/ir/expressions/importExpression.cpp +++ b/ets2panda/ir/expressions/importExpression.cpp @@ -22,7 +22,7 @@ namespace ark::es2panda::ir { void ImportExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(source_); source_ != transformedNode) { + if (auto *transformedNode = cb(source_); source_ != transformedNode && transformedNode != nullptr) { source_->SetTransformedNode(transformationName, transformedNode); source_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/expressions/memberExpression.cpp b/ets2panda/ir/expressions/memberExpression.cpp index 2ea5a0d847..3ea03a21ab 100644 --- a/ets2panda/ir/expressions/memberExpression.cpp +++ b/ets2panda/ir/expressions/memberExpression.cpp @@ -38,12 +38,12 @@ bool MemberExpression::IsPrivateReference() const noexcept void MemberExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(object_); object_ != transformedNode) { + if (auto *transformedNode = cb(object_); object_ != transformedNode && transformedNode != nullptr) { object_->SetTransformedNode(transformationName, transformedNode); object_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(property_); property_ != transformedNode) { + if (auto *transformedNode = cb(property_); property_ != transformedNode && transformedNode != nullptr) { property_->SetTransformedNode(transformationName, transformedNode); property_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/expressions/newExpression.cpp b/ets2panda/ir/expressions/newExpression.cpp index 0138a4216c..0cf9ee5182 100644 --- a/ets2panda/ir/expressions/newExpression.cpp +++ b/ets2panda/ir/expressions/newExpression.cpp @@ -45,13 +45,13 @@ NewExpression *NewExpression::Clone(ArenaAllocator *const allocator, AstNode *co void NewExpression::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(callee_); callee_ != transformedNode) { + if (auto *transformedNode = cb(callee_); callee_ != transformedNode && transformedNode != nullptr) { callee_->SetTransformedNode(transformationName, transformedNode); callee_ = transformedNode->AsExpression(); } for (auto *&it : VectorIterationGuard(arguments_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/expressions/objectExpression.cpp b/ets2panda/ir/expressions/objectExpression.cpp index 81da3dda08..8912892cef 100644 --- a/ets2panda/ir/expressions/objectExpression.cpp +++ b/ets2panda/ir/expressions/objectExpression.cpp @@ -176,21 +176,22 @@ void ObjectExpression::SetOptional(bool optional) void ObjectExpression::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { for (auto *&it : VectorIterationGuard(decorators_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsDecorator(); } } for (auto *&it : VectorIterationGuard(properties_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsExpression(); } } if (auto *typeAnnotation = TypeAnnotation(); typeAnnotation != nullptr) { - if (auto *transformedNode = cb(typeAnnotation); typeAnnotation != transformedNode) { + if (auto *transformedNode = cb(typeAnnotation); + typeAnnotation != transformedNode && transformedNode != nullptr) { typeAnnotation->SetTransformedNode(transformationName, transformedNode); SetTsTypeAnnotation(static_cast(transformedNode)); } diff --git a/ets2panda/ir/expressions/sequenceExpression.cpp b/ets2panda/ir/expressions/sequenceExpression.cpp index cbe9d5dbbb..7e97275d5f 100644 --- a/ets2panda/ir/expressions/sequenceExpression.cpp +++ b/ets2panda/ir/expressions/sequenceExpression.cpp @@ -43,7 +43,7 @@ SequenceExpression *SequenceExpression::Clone(ArenaAllocator *const allocator, A void SequenceExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { for (auto *&it : VectorIterationGuard(sequence_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/expressions/taggedTemplateExpression.cpp b/ets2panda/ir/expressions/taggedTemplateExpression.cpp index 54eb9a71c8..f7cc97df5e 100644 --- a/ets2panda/ir/expressions/taggedTemplateExpression.cpp +++ b/ets2panda/ir/expressions/taggedTemplateExpression.cpp @@ -23,18 +23,18 @@ namespace ark::es2panda::ir { void TaggedTemplateExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { if (typeParams_ != nullptr) { - if (auto *transformedNode = cb(typeParams_); typeParams_ != transformedNode) { + if (auto *transformedNode = cb(typeParams_); typeParams_ != transformedNode && transformedNode != nullptr) { typeParams_->SetTransformedNode(transformationName, transformedNode); typeParams_ = transformedNode->AsTSTypeParameterInstantiation(); } } - if (auto *transformedNode = cb(tag_); tag_ != transformedNode) { + if (auto *transformedNode = cb(tag_); tag_ != transformedNode && transformedNode != nullptr) { tag_->SetTransformedNode(transformationName, transformedNode); tag_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(quasi_); quasi_ != transformedNode) { + if (auto *transformedNode = cb(quasi_); quasi_ != transformedNode && transformedNode != nullptr) { quasi_->SetTransformedNode(transformationName, transformedNode); quasi_ = transformedNode->AsTemplateLiteral(); } diff --git a/ets2panda/ir/expressions/templateLiteral.cpp b/ets2panda/ir/expressions/templateLiteral.cpp index e7c10eda77..38cefb2887 100644 --- a/ets2panda/ir/expressions/templateLiteral.cpp +++ b/ets2panda/ir/expressions/templateLiteral.cpp @@ -51,14 +51,14 @@ TemplateLiteral *TemplateLiteral::Clone(ArenaAllocator *const allocator, AstNode void TemplateLiteral::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { for (auto *&it : VectorIterationGuard(expressions_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsExpression(); } } for (auto *&it : VectorIterationGuard(quasis_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsTemplateElement(); } diff --git a/ets2panda/ir/expressions/typeofExpression.cpp b/ets2panda/ir/expressions/typeofExpression.cpp index c5d2b5e4d7..2569b9baf8 100644 --- a/ets2panda/ir/expressions/typeofExpression.cpp +++ b/ets2panda/ir/expressions/typeofExpression.cpp @@ -23,7 +23,7 @@ namespace ark::es2panda::ir { void TypeofExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(argument_); argument_ != transformedNode) { + if (auto *transformedNode = cb(argument_); argument_ != transformedNode && transformedNode != nullptr) { argument_->SetTransformedNode(transformationName, transformedNode); argument_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/expressions/unaryExpression.cpp b/ets2panda/ir/expressions/unaryExpression.cpp index 8cdaa4bdf7..11f6ea1636 100644 --- a/ets2panda/ir/expressions/unaryExpression.cpp +++ b/ets2panda/ir/expressions/unaryExpression.cpp @@ -23,7 +23,7 @@ namespace ark::es2panda::ir { void UnaryExpression::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(argument_); argument_ != transformedNode) { + if (auto *transformedNode = cb(argument_); argument_ != transformedNode && transformedNode != nullptr) { argument_->SetTransformedNode(transformationName, transformedNode); argument_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/expressions/updateExpression.cpp b/ets2panda/ir/expressions/updateExpression.cpp index f594e7fc09..12020d11b1 100644 --- a/ets2panda/ir/expressions/updateExpression.cpp +++ b/ets2panda/ir/expressions/updateExpression.cpp @@ -23,7 +23,7 @@ namespace ark::es2panda::ir { void UpdateExpression::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(argument_); argument_ != transformedNode) { + if (auto *transformedNode = cb(argument_); argument_ != transformedNode && transformedNode != nullptr) { argument_->SetTransformedNode(transformationName, transformedNode); argument_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/expressions/yieldExpression.cpp b/ets2panda/ir/expressions/yieldExpression.cpp index a64f33df86..ef0886faee 100644 --- a/ets2panda/ir/expressions/yieldExpression.cpp +++ b/ets2panda/ir/expressions/yieldExpression.cpp @@ -24,7 +24,7 @@ namespace ark::es2panda::ir { void YieldExpression::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { if (argument_ != nullptr) { - if (auto *transformedNode = cb(argument_); argument_ != transformedNode) { + if (auto *transformedNode = cb(argument_); argument_ != transformedNode && transformedNode != nullptr) { argument_->SetTransformedNode(transformationName, transformedNode); argument_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/module/exportAllDeclaration.cpp b/ets2panda/ir/module/exportAllDeclaration.cpp index b61b9dd17c..2dcc19c1af 100644 --- a/ets2panda/ir/module/exportAllDeclaration.cpp +++ b/ets2panda/ir/module/exportAllDeclaration.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -24,13 +24,13 @@ namespace ark::es2panda::ir { void ExportAllDeclaration::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(source_); source_ != transformedNode) { + if (auto *transformedNode = cb(source_); source_ != transformedNode && transformedNode != nullptr) { source_->SetTransformedNode(transformationName, transformedNode); source_ = transformedNode->AsStringLiteral(); } if (exported_ != nullptr) { - if (auto *transformedNode = cb(exported_); exported_ != transformedNode) { + if (auto *transformedNode = cb(exported_); exported_ != transformedNode && transformedNode != nullptr) { exported_->SetTransformedNode(transformationName, transformedNode); exported_ = transformedNode->AsIdentifier(); } diff --git a/ets2panda/ir/module/exportDefaultDeclaration.cpp b/ets2panda/ir/module/exportDefaultDeclaration.cpp index 5d96ad38e2..6f808e1696 100644 --- a/ets2panda/ir/module/exportDefaultDeclaration.cpp +++ b/ets2panda/ir/module/exportDefaultDeclaration.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -24,7 +24,7 @@ namespace ark::es2panda::ir { void ExportDefaultDeclaration::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(decl_); decl_ != transformedNode) { + if (auto *transformedNode = cb(decl_); decl_ != transformedNode && transformedNode != nullptr) { decl_->SetTransformedNode(transformationName, transformedNode); decl_ = transformedNode; } diff --git a/ets2panda/ir/module/exportNamedDeclaration.cpp b/ets2panda/ir/module/exportNamedDeclaration.cpp index 8225acdd1b..39d15ddef3 100644 --- a/ets2panda/ir/module/exportNamedDeclaration.cpp +++ b/ets2panda/ir/module/exportNamedDeclaration.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -25,27 +25,27 @@ namespace ark::es2panda::ir { void ExportNamedDeclaration::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { for (auto *&it : VectorIterationGuard(decorators_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsDecorator(); } } if (decl_ != nullptr) { - if (auto *transformedNode = cb(decl_); decl_ != transformedNode) { + if (auto *transformedNode = cb(decl_); decl_ != transformedNode && transformedNode != nullptr) { decl_->SetTransformedNode(transformationName, transformedNode); decl_ = transformedNode; } } else { if (source_ != nullptr) { - if (auto *transformedNode = cb(source_); source_ != transformedNode) { + if (auto *transformedNode = cb(source_); source_ != transformedNode && transformedNode != nullptr) { source_->SetTransformedNode(transformationName, transformedNode); source_ = transformedNode->AsStringLiteral(); } } for (auto *&it : VectorIterationGuard(specifiers_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsExportSpecifier(); } diff --git a/ets2panda/ir/module/exportSpecifier.cpp b/ets2panda/ir/module/exportSpecifier.cpp index 1133414d19..6c00ca5889 100644 --- a/ets2panda/ir/module/exportSpecifier.cpp +++ b/ets2panda/ir/module/exportSpecifier.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -24,12 +24,12 @@ namespace ark::es2panda::ir { void ExportSpecifier::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(local_); local_ != transformedNode) { + if (auto *transformedNode = cb(local_); local_ != transformedNode && transformedNode != nullptr) { local_->SetTransformedNode(transformationName, transformedNode); local_ = transformedNode->AsIdentifier(); } - if (auto *transformedNode = cb(exported_); exported_ != transformedNode) { + if (auto *transformedNode = cb(exported_); exported_ != transformedNode && transformedNode != nullptr) { exported_->SetTransformedNode(transformationName, transformedNode); exported_ = transformedNode->AsIdentifier(); } diff --git a/ets2panda/ir/module/importDeclaration.cpp b/ets2panda/ir/module/importDeclaration.cpp index 161970f5f5..59a383ef31 100644 --- a/ets2panda/ir/module/importDeclaration.cpp +++ b/ets2panda/ir/module/importDeclaration.cpp @@ -32,14 +32,15 @@ void ImportDeclaration::SetSource(StringLiteral *source) void ImportDeclaration::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { auto const source = Source(); - if (auto *transformedNode = cb(source); source != transformedNode) { + if (auto *transformedNode = cb(source); source != transformedNode && transformedNode != nullptr) { source->SetTransformedNode(transformationName, transformedNode); SetSource(transformedNode->AsStringLiteral()); } auto const &specifiers = Specifiers(); for (size_t index = 0; index < specifiers.size(); ++index) { - if (auto *transformedNode = cb(specifiers[index]); specifiers[index] != transformedNode) { + if (auto *transformedNode = cb(specifiers[index]); + specifiers[index] != transformedNode && transformedNode != nullptr) { specifiers[index]->SetTransformedNode(transformationName, transformedNode); SetValueSpecifiers(transformedNode, index); } diff --git a/ets2panda/ir/module/importDefaultSpecifier.cpp b/ets2panda/ir/module/importDefaultSpecifier.cpp index cd2c11fd56..4cc402a2eb 100644 --- a/ets2panda/ir/module/importDefaultSpecifier.cpp +++ b/ets2panda/ir/module/importDefaultSpecifier.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -24,7 +24,7 @@ namespace ark::es2panda::ir { void ImportDefaultSpecifier::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(local_); local_ != transformedNode) { + if (auto *transformedNode = cb(local_); local_ != transformedNode && transformedNode != nullptr) { local_->SetTransformedNode(transformationName, transformedNode); local_ = transformedNode->AsIdentifier(); } diff --git a/ets2panda/ir/module/importNamespaceSpecifier.cpp b/ets2panda/ir/module/importNamespaceSpecifier.cpp index 5519952e54..401410f6d2 100644 --- a/ets2panda/ir/module/importNamespaceSpecifier.cpp +++ b/ets2panda/ir/module/importNamespaceSpecifier.cpp @@ -24,7 +24,7 @@ namespace ark::es2panda::ir { void ImportNamespaceSpecifier::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(local_); local_ != transformedNode) { + if (auto *transformedNode = cb(local_); local_ != transformedNode && transformedNode != nullptr) { local_->SetTransformedNode(transformationName, transformedNode); local_ = transformedNode->AsIdentifier(); } diff --git a/ets2panda/ir/module/importSpecifier.cpp b/ets2panda/ir/module/importSpecifier.cpp index fd79082120..afe75a164f 100644 --- a/ets2panda/ir/module/importSpecifier.cpp +++ b/ets2panda/ir/module/importSpecifier.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -25,13 +25,13 @@ namespace ark::es2panda::ir { void ImportSpecifier::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { if (local_ != nullptr) { - if (auto *transformedNode = cb(local_); local_ != transformedNode) { + if (auto *transformedNode = cb(local_); local_ != transformedNode && transformedNode != nullptr) { local_->SetTransformedNode(transformationName, transformedNode); local_ = transformedNode->AsIdentifier(); } } - if (auto *transformedNode = cb(imported_); imported_ != transformedNode) { + if (auto *transformedNode = cb(imported_); imported_ != transformedNode && transformedNode != nullptr) { imported_->SetTransformedNode(transformationName, transformedNode); imported_ = transformedNode->AsIdentifier(); } diff --git a/ets2panda/ir/statements/annotationDeclaration.cpp b/ets2panda/ir/statements/annotationDeclaration.cpp index f353444a46..6a8af12a56 100644 --- a/ets2panda/ir/statements/annotationDeclaration.cpp +++ b/ets2panda/ir/statements/annotationDeclaration.cpp @@ -68,7 +68,8 @@ void AnnotationDeclaration::TransformChildren(const NodeTransformer &cb, std::st { auto const &properties = Properties(); for (size_t ix = 0; ix < properties.size(); ix++) { - if (auto *transformedNode = cb(properties[ix]); properties[ix] != transformedNode) { + if (auto *transformedNode = cb(properties[ix]); + properties[ix] != transformedNode && transformedNode != nullptr) { properties[ix]->SetTransformedNode(transformationName, transformedNode); SetValueProperties(transformedNode->AsTSClassImplements(), ix); } @@ -76,7 +77,7 @@ void AnnotationDeclaration::TransformChildren(const NodeTransformer &cb, std::st auto const expr = Expr(); if (expr != nullptr) { - if (auto *transformedNode = cb(expr); expr != transformedNode) { + if (auto *transformedNode = cb(expr); expr != transformedNode && transformedNode != nullptr) { expr->SetTransformedNode(transformationName, transformedNode); SetExpr(transformedNode->AsIdentifier()); } diff --git a/ets2panda/ir/statements/annotationUsage.cpp b/ets2panda/ir/statements/annotationUsage.cpp index 3ef4f21faf..a9ddd65ce4 100644 --- a/ets2panda/ir/statements/annotationUsage.cpp +++ b/ets2panda/ir/statements/annotationUsage.cpp @@ -21,13 +21,13 @@ namespace ark::es2panda::ir { void AnnotationUsage::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(expr_); expr_ != transformedNode) { + if (auto *transformedNode = cb(expr_); expr_ != transformedNode && transformedNode != nullptr) { expr_->SetTransformedNode(transformationName, transformedNode); expr_ = transformedNode->AsExpression(); } for (auto *&it : VectorIterationGuard(properties_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode; } diff --git a/ets2panda/ir/statements/blockStatement.cpp b/ets2panda/ir/statements/blockStatement.cpp index abbe7d12b0..8ddb4ea1cc 100644 --- a/ets2panda/ir/statements/blockStatement.cpp +++ b/ets2panda/ir/statements/blockStatement.cpp @@ -31,7 +31,7 @@ void BlockStatement::TransformChildren(const NodeTransformer &cb, std::string_vi auto const &constStatements = Statements(); for (size_t index = 0; index < constStatements.size(); index++) { auto statement = constStatements[index]; - if (auto *transformedNode = cb(statement); statement != transformedNode) { + if (auto *transformedNode = cb(statement); statement != transformedNode && transformedNode != nullptr) { statement->SetTransformedNode(transformationName, transformedNode); auto &statements = AstNode::GetOrCreateHistoryNodeAs()->statements_; statements[index] = transformedNode->AsStatement(); diff --git a/ets2panda/ir/statements/breakStatement.cpp b/ets2panda/ir/statements/breakStatement.cpp index 3a8b44bde4..20ff4216cd 100644 --- a/ets2panda/ir/statements/breakStatement.cpp +++ b/ets2panda/ir/statements/breakStatement.cpp @@ -26,7 +26,7 @@ namespace ark::es2panda::ir { void BreakStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { if (ident_ != nullptr) { - if (auto *transformedNode = cb(ident_); ident_ != transformedNode) { + if (auto *transformedNode = cb(ident_); ident_ != transformedNode && transformedNode != nullptr) { ident_->SetTransformedNode(transformationName, transformedNode); ident_ = transformedNode->AsIdentifier(); } diff --git a/ets2panda/ir/statements/classDeclaration.cpp b/ets2panda/ir/statements/classDeclaration.cpp index 398e74f231..522d420483 100644 --- a/ets2panda/ir/statements/classDeclaration.cpp +++ b/ets2panda/ir/statements/classDeclaration.cpp @@ -75,14 +75,15 @@ void ClassDeclaration::TransformChildren(const NodeTransformer &cb, std::string_ { auto const &decorators = Decorators(); for (size_t ix = 0; ix < decorators.size(); ix++) { - if (auto *transformedNode = cb(decorators[ix]); decorators[ix] != transformedNode) { + if (auto *transformedNode = cb(decorators[ix]); + decorators[ix] != transformedNode && transformedNode != nullptr) { decorators[ix]->SetTransformedNode(transformationName, transformedNode); SetValueDecorators(transformedNode->AsDecorator(), ix); } } auto const def = Definition(); - if (auto *transformedNode = cb(def); def != transformedNode) { + if (auto *transformedNode = cb(def); def != transformedNode && transformedNode != nullptr) { def->SetTransformedNode(transformationName, transformedNode); SetDefinition(transformedNode->AsClassDefinition()); } diff --git a/ets2panda/ir/statements/continueStatement.cpp b/ets2panda/ir/statements/continueStatement.cpp index 89bacf1b71..90c9a05361 100644 --- a/ets2panda/ir/statements/continueStatement.cpp +++ b/ets2panda/ir/statements/continueStatement.cpp @@ -25,7 +25,7 @@ namespace ark::es2panda::ir { void ContinueStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { if (ident_ != nullptr) { - if (auto *transformedNode = cb(ident_); ident_ != transformedNode) { + if (auto *transformedNode = cb(ident_); ident_ != transformedNode && transformedNode != nullptr) { ident_->SetTransformedNode(transformationName, transformedNode); ident_ = transformedNode->AsIdentifier(); } diff --git a/ets2panda/ir/statements/doWhileStatement.cpp b/ets2panda/ir/statements/doWhileStatement.cpp index 58e70f28f5..4653e3834b 100644 --- a/ets2panda/ir/statements/doWhileStatement.cpp +++ b/ets2panda/ir/statements/doWhileStatement.cpp @@ -28,12 +28,12 @@ namespace ark::es2panda::ir { void DoWhileStatement::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(body_); body_ != transformedNode) { + if (auto *transformedNode = cb(body_); body_ != transformedNode && transformedNode != nullptr) { body_->SetTransformedNode(transformationName, transformedNode); body_ = transformedNode->AsStatement(); } - if (auto *transformedNode = cb(test_); test_ != transformedNode) { + if (auto *transformedNode = cb(test_); test_ != transformedNode && transformedNode != nullptr) { test_->SetTransformedNode(transformationName, transformedNode); test_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/statements/expressionStatement.cpp b/ets2panda/ir/statements/expressionStatement.cpp index f4bb853514..a6ed6f6160 100644 --- a/ets2panda/ir/statements/expressionStatement.cpp +++ b/ets2panda/ir/statements/expressionStatement.cpp @@ -22,7 +22,7 @@ namespace ark::es2panda::ir { void ExpressionStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(expression_); expression_ != transformedNode) { + if (auto *transformedNode = cb(expression_); expression_ != transformedNode && transformedNode != nullptr) { expression_->SetTransformedNode(transformationName, transformedNode); expression_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/statements/forInStatement.cpp b/ets2panda/ir/statements/forInStatement.cpp index 9436f75696..0dbb4f59bf 100644 --- a/ets2panda/ir/statements/forInStatement.cpp +++ b/ets2panda/ir/statements/forInStatement.cpp @@ -27,17 +27,17 @@ namespace ark::es2panda::ir { void ForInStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(left_); left_ != transformedNode) { + if (auto *transformedNode = cb(left_); left_ != transformedNode && transformedNode != nullptr) { left_->SetTransformedNode(transformationName, transformedNode); left_ = transformedNode; } - if (auto *transformedNode = cb(right_); right_ != transformedNode) { + if (auto *transformedNode = cb(right_); right_ != transformedNode && transformedNode != nullptr) { right_->SetTransformedNode(transformationName, transformedNode); right_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(body_); body_ != transformedNode) { + if (auto *transformedNode = cb(body_); body_ != transformedNode && transformedNode != nullptr) { body_->SetTransformedNode(transformationName, transformedNode); body_ = transformedNode->AsStatement(); } diff --git a/ets2panda/ir/statements/forOfStatement.cpp b/ets2panda/ir/statements/forOfStatement.cpp index 953d282268..660fdf4b7b 100644 --- a/ets2panda/ir/statements/forOfStatement.cpp +++ b/ets2panda/ir/statements/forOfStatement.cpp @@ -43,17 +43,17 @@ checker::Type *ForOfStatement::CreateUnionIteratorTypes(checker::ETSChecker *che void ForOfStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(left_); left_ != transformedNode) { + if (auto *transformedNode = cb(left_); left_ != transformedNode && transformedNode != nullptr) { left_->SetTransformedNode(transformationName, transformedNode); left_ = transformedNode; } - if (auto *transformedNode = cb(right_); right_ != transformedNode) { + if (auto *transformedNode = cb(right_); right_ != transformedNode && transformedNode != nullptr) { right_->SetTransformedNode(transformationName, transformedNode); right_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(body_); body_ != transformedNode) { + if (auto *transformedNode = cb(body_); body_ != transformedNode && transformedNode != nullptr) { body_->SetTransformedNode(transformationName, transformedNode); body_ = transformedNode->AsStatement(); } diff --git a/ets2panda/ir/statements/forUpdateStatement.cpp b/ets2panda/ir/statements/forUpdateStatement.cpp index 912dd11f40..e95f7198b9 100644 --- a/ets2panda/ir/statements/forUpdateStatement.cpp +++ b/ets2panda/ir/statements/forUpdateStatement.cpp @@ -28,27 +28,27 @@ namespace ark::es2panda::ir { void ForUpdateStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { if (init_ != nullptr) { - if (auto *transformedNode = cb(init_); init_ != transformedNode) { + if (auto *transformedNode = cb(init_); init_ != transformedNode && transformedNode != nullptr) { init_->SetTransformedNode(transformationName, transformedNode); init_ = transformedNode; } } if (test_ != nullptr) { - if (auto *transformedNode = cb(test_); test_ != transformedNode) { + if (auto *transformedNode = cb(test_); test_ != transformedNode && transformedNode != nullptr) { test_->SetTransformedNode(transformationName, transformedNode); test_ = transformedNode->AsExpression(); } } if (update_ != nullptr) { - if (auto *transformedNode = cb(update_); update_ != transformedNode) { + if (auto *transformedNode = cb(update_); update_ != transformedNode && transformedNode != nullptr) { update_->SetTransformedNode(transformationName, transformedNode); update_ = transformedNode->AsExpression(); } } - if (auto *transformedNode = cb(body_); body_ != transformedNode) { + if (auto *transformedNode = cb(body_); body_ != transformedNode && transformedNode != nullptr) { body_->SetTransformedNode(transformationName, transformedNode); body_ = transformedNode->AsStatement(); } diff --git a/ets2panda/ir/statements/functionDeclaration.cpp b/ets2panda/ir/statements/functionDeclaration.cpp index be0f1341c4..67a0d03e81 100644 --- a/ets2panda/ir/statements/functionDeclaration.cpp +++ b/ets2panda/ir/statements/functionDeclaration.cpp @@ -33,7 +33,8 @@ void FunctionDeclaration::TransformChildren(const NodeTransformer &cb, std::stri { auto const &decorators = Decorators(); for (size_t ix = 0; ix < decorators.size(); ix++) { - if (auto *transformedNode = cb(decorators[ix]); decorators[ix] != transformedNode) { + if (auto *transformedNode = cb(decorators[ix]); + decorators[ix] != transformedNode && transformedNode != nullptr) { decorators[ix]->SetTransformedNode(transformationName, transformedNode); SetValueDecorators(transformedNode->AsDecorator(), ix); } @@ -42,7 +43,7 @@ void FunctionDeclaration::TransformChildren(const NodeTransformer &cb, std::stri TransformAnnotations(cb, transformationName); auto const func = Function(); - if (auto *transformedNode = cb(func); func != transformedNode) { + if (auto *transformedNode = cb(func); func != transformedNode && transformedNode != nullptr) { func->SetTransformedNode(transformationName, transformedNode); SetFunction(transformedNode->AsScriptFunction()); } diff --git a/ets2panda/ir/statements/ifStatement.cpp b/ets2panda/ir/statements/ifStatement.cpp index fb33121bbc..47183b1c6d 100644 --- a/ets2panda/ir/statements/ifStatement.cpp +++ b/ets2panda/ir/statements/ifStatement.cpp @@ -22,18 +22,18 @@ namespace ark::es2panda::ir { void IfStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(test_); test_ != transformedNode) { + if (auto *transformedNode = cb(test_); test_ != transformedNode && transformedNode != nullptr) { test_->SetTransformedNode(transformationName, transformedNode); test_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(consequent_); consequent_ != transformedNode) { + if (auto *transformedNode = cb(consequent_); consequent_ != transformedNode && transformedNode != nullptr) { consequent_->SetTransformedNode(transformationName, transformedNode); consequent_ = transformedNode->AsStatement(); } if (alternate_ != nullptr) { - if (auto *transformedNode = cb(alternate_); alternate_ != transformedNode) { + if (auto *transformedNode = cb(alternate_); alternate_ != transformedNode && transformedNode != nullptr) { alternate_->SetTransformedNode(transformationName, transformedNode); alternate_ = transformedNode->AsStatement(); } diff --git a/ets2panda/ir/statements/labelledStatement.cpp b/ets2panda/ir/statements/labelledStatement.cpp index 0a4f1c2b7f..fe2a24c71b 100644 --- a/ets2panda/ir/statements/labelledStatement.cpp +++ b/ets2panda/ir/statements/labelledStatement.cpp @@ -24,12 +24,12 @@ namespace ark::es2panda::ir { void LabelledStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(ident_); ident_ != transformedNode) { + if (auto *transformedNode = cb(ident_); ident_ != transformedNode && transformedNode != nullptr) { ident_->SetTransformedNode(transformationName, transformedNode); ident_ = transformedNode->AsIdentifier(); } - if (auto *transformedNode = cb(body_); body_ != transformedNode) { + if (auto *transformedNode = cb(body_); body_ != transformedNode && transformedNode != nullptr) { body_->SetTransformedNode(transformationName, transformedNode); body_ = transformedNode->AsStatement(); } diff --git a/ets2panda/ir/statements/returnStatement.cpp b/ets2panda/ir/statements/returnStatement.cpp index a14d552090..490cf9738e 100644 --- a/ets2panda/ir/statements/returnStatement.cpp +++ b/ets2panda/ir/statements/returnStatement.cpp @@ -25,7 +25,7 @@ namespace ark::es2panda::ir { void ReturnStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { if (argument_ != nullptr) { - if (auto *transformedNode = cb(argument_); argument_ != transformedNode) { + if (auto *transformedNode = cb(argument_); argument_ != transformedNode && transformedNode != nullptr) { argument_->SetTransformedNode(transformationName, transformedNode); argument_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/statements/switchCaseStatement.cpp b/ets2panda/ir/statements/switchCaseStatement.cpp index 77df9b94db..4bad674364 100644 --- a/ets2panda/ir/statements/switchCaseStatement.cpp +++ b/ets2panda/ir/statements/switchCaseStatement.cpp @@ -26,14 +26,14 @@ namespace ark::es2panda::ir { void SwitchCaseStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { if (test_ != nullptr) { - if (auto *transformedNode = cb(test_); test_ != transformedNode) { + if (auto *transformedNode = cb(test_); test_ != transformedNode && transformedNode != nullptr) { test_->SetTransformedNode(transformationName, transformedNode); test_ = transformedNode->AsExpression(); } } for (auto *&it : VectorIterationGuard(consequent_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsStatement(); } diff --git a/ets2panda/ir/statements/switchStatement.cpp b/ets2panda/ir/statements/switchStatement.cpp index c9bc019eaa..cfb31d79ef 100644 --- a/ets2panda/ir/statements/switchStatement.cpp +++ b/ets2panda/ir/statements/switchStatement.cpp @@ -24,13 +24,13 @@ namespace ark::es2panda::ir { void SwitchStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(discriminant_); discriminant_ != transformedNode) { + if (auto *transformedNode = cb(discriminant_); discriminant_ != transformedNode && transformedNode != nullptr) { discriminant_->SetTransformedNode(transformationName, transformedNode); discriminant_ = transformedNode->AsExpression(); } for (auto *&it : VectorIterationGuard(cases_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsSwitchCaseStatement(); } diff --git a/ets2panda/ir/statements/throwStatement.cpp b/ets2panda/ir/statements/throwStatement.cpp index 83b2159df5..a468e3c6ef 100644 --- a/ets2panda/ir/statements/throwStatement.cpp +++ b/ets2panda/ir/statements/throwStatement.cpp @@ -22,7 +22,7 @@ namespace ark::es2panda::ir { void ThrowStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(argument_); argument_ != transformedNode) { + if (auto *transformedNode = cb(argument_); argument_ != transformedNode && transformedNode != nullptr) { argument_->SetTransformedNode(transformationName, transformedNode); argument_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/statements/tryStatement.cpp b/ets2panda/ir/statements/tryStatement.cpp index 7281fa5e60..a7dec812bd 100644 --- a/ets2panda/ir/statements/tryStatement.cpp +++ b/ets2panda/ir/statements/tryStatement.cpp @@ -28,20 +28,20 @@ namespace ark::es2panda::ir { void TryStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(block_); block_ != transformedNode) { + if (auto *transformedNode = cb(block_); block_ != transformedNode && transformedNode != nullptr) { block_->SetTransformedNode(transformationName, transformedNode); block_ = transformedNode->AsBlockStatement(); } for (auto *&it : VectorIterationGuard(catchClauses_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsCatchClause(); } } if (finalizer_ != nullptr) { - if (auto *transformedNode = cb(finalizer_); finalizer_ != transformedNode) { + if (auto *transformedNode = cb(finalizer_); finalizer_ != transformedNode && transformedNode != nullptr) { finalizer_->SetTransformedNode(transformationName, transformedNode); finalizer_ = transformedNode->AsBlockStatement(); } diff --git a/ets2panda/ir/statements/variableDeclaration.cpp b/ets2panda/ir/statements/variableDeclaration.cpp index adbe853c54..2dc07787fb 100644 --- a/ets2panda/ir/statements/variableDeclaration.cpp +++ b/ets2panda/ir/statements/variableDeclaration.cpp @@ -91,7 +91,8 @@ void VariableDeclaration::TransformChildren(const NodeTransformer &cb, std::stri { auto const &decorators = Decorators(); for (size_t index = 0; index < decorators.size(); ++index) { - if (auto *transformedNode = cb(decorators[index]); decorators[index] != transformedNode) { + if (auto *transformedNode = cb(decorators[index]); + decorators[index] != transformedNode && transformedNode != nullptr) { decorators[index]->SetTransformedNode(transformationName, transformedNode); SetValueDecorators(transformedNode->AsDecorator(), index); } @@ -99,7 +100,8 @@ void VariableDeclaration::TransformChildren(const NodeTransformer &cb, std::stri auto const &annotations = Annotations(); for (size_t index = 0; index < annotations.size(); ++index) { - if (auto *transformedNode = cb(annotations[index]); annotations[index] != transformedNode) { + if (auto *transformedNode = cb(annotations[index]); + annotations[index] != transformedNode && transformedNode != nullptr) { annotations[index]->SetTransformedNode(transformationName, transformedNode); SetValueAnnotations(transformedNode->AsAnnotationUsage(), index); } @@ -107,7 +109,8 @@ void VariableDeclaration::TransformChildren(const NodeTransformer &cb, std::stri auto const &declarators = Declarators(); for (size_t index = 0; index < declarators.size(); ++index) { - if (auto *transformedNode = cb(declarators[index]); declarators[index] != transformedNode) { + if (auto *transformedNode = cb(declarators[index]); + declarators[index] != transformedNode && transformedNode != nullptr) { declarators[index]->SetTransformedNode(transformationName, transformedNode); SetValueDeclarators(transformedNode->AsVariableDeclarator(), index); } diff --git a/ets2panda/ir/statements/variableDeclarator.cpp b/ets2panda/ir/statements/variableDeclarator.cpp index 78ee2fd4f8..4b165318e8 100644 --- a/ets2panda/ir/statements/variableDeclarator.cpp +++ b/ets2panda/ir/statements/variableDeclarator.cpp @@ -23,13 +23,13 @@ namespace ark::es2panda::ir { void VariableDeclarator::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(id_); id_ != transformedNode) { + if (auto *transformedNode = cb(id_); id_ != transformedNode && transformedNode != nullptr) { id_->SetTransformedNode(transformationName, transformedNode); id_ = transformedNode->AsExpression(); } if (init_ != nullptr) { - if (auto *transformedNode = cb(init_); init_ != transformedNode) { + if (auto *transformedNode = cb(init_); init_ != transformedNode && transformedNode != nullptr) { init_->SetTransformedNode(transformationName, transformedNode); init_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/statements/whileStatement.cpp b/ets2panda/ir/statements/whileStatement.cpp index 5bdc886393..fd1cce4ad9 100644 --- a/ets2panda/ir/statements/whileStatement.cpp +++ b/ets2panda/ir/statements/whileStatement.cpp @@ -28,12 +28,12 @@ namespace ark::es2panda::ir { void WhileStatement::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(test_); test_ != transformedNode) { + if (auto *transformedNode = cb(test_); test_ != transformedNode && transformedNode != nullptr) { test_->SetTransformedNode(transformationName, transformedNode); test_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(body_); body_ != transformedNode) { + if (auto *transformedNode = cb(body_); body_ != transformedNode && transformedNode != nullptr) { body_->SetTransformedNode(transformationName, transformedNode); body_ = transformedNode->AsStatement(); } diff --git a/ets2panda/ir/ts/tsArrayType.cpp b/ets2panda/ir/ts/tsArrayType.cpp index 8ab2361fb9..ff9541c69c 100644 --- a/ets2panda/ir/ts/tsArrayType.cpp +++ b/ets2panda/ir/ts/tsArrayType.cpp @@ -23,7 +23,7 @@ namespace ark::es2panda::ir { void TSArrayType::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(elementType_); elementType_ != transformedNode) { + if (auto *transformedNode = cb(elementType_); elementType_ != transformedNode && transformedNode != nullptr) { elementType_->SetTransformedNode(transformationName, transformedNode); elementType_ = static_cast(transformedNode); } diff --git a/ets2panda/ir/ts/tsAsExpression.cpp b/ets2panda/ir/ts/tsAsExpression.cpp index 8452359ba2..cca306107c 100644 --- a/ets2panda/ir/ts/tsAsExpression.cpp +++ b/ets2panda/ir/ts/tsAsExpression.cpp @@ -37,13 +37,14 @@ void TSAsExpression::SetExpr(Expression *expr) noexcept void TSAsExpression::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(expression_); expression_ != transformedNode) { + if (auto *transformedNode = cb(expression_); expression_ != transformedNode && transformedNode != nullptr) { expression_->SetTransformedNode(transformationName, transformedNode); expression_ = transformedNode->AsExpression(); } if (auto *typeAnnotation = TypeAnnotation(); typeAnnotation != nullptr) { - if (auto *transformedNode = cb(typeAnnotation); typeAnnotation != transformedNode) { + if (auto *transformedNode = cb(typeAnnotation); + typeAnnotation != transformedNode && transformedNode != nullptr) { typeAnnotation->SetTransformedNode(transformationName, transformedNode); SetTsTypeAnnotation(static_cast(transformedNode)); } diff --git a/ets2panda/ir/ts/tsClassImplements.cpp b/ets2panda/ir/ts/tsClassImplements.cpp index dfe2da11df..1832b3ac76 100644 --- a/ets2panda/ir/ts/tsClassImplements.cpp +++ b/ets2panda/ir/ts/tsClassImplements.cpp @@ -26,7 +26,7 @@ namespace ark::es2panda::ir { void TSClassImplements::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(expression_); expression_ != transformedNode) { + if (auto *transformedNode = cb(expression_); expression_ != transformedNode && transformedNode != nullptr) { expression_->SetTransformedNode(transformationName, transformedNode); expression_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ts/tsConditionalType.cpp b/ets2panda/ir/ts/tsConditionalType.cpp index 6a166ea3f0..208d2da59e 100644 --- a/ets2panda/ir/ts/tsConditionalType.cpp +++ b/ets2panda/ir/ts/tsConditionalType.cpp @@ -24,22 +24,22 @@ namespace ark::es2panda::ir { void TSConditionalType::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(checkType_); checkType_ != transformedNode) { + if (auto *transformedNode = cb(checkType_); checkType_ != transformedNode && transformedNode != nullptr) { checkType_->SetTransformedNode(transformationName, transformedNode); checkType_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(extendsType_); extendsType_ != transformedNode) { + if (auto *transformedNode = cb(extendsType_); extendsType_ != transformedNode && transformedNode != nullptr) { extendsType_->SetTransformedNode(transformationName, transformedNode); extendsType_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(trueType_); trueType_ != transformedNode) { + if (auto *transformedNode = cb(trueType_); trueType_ != transformedNode && transformedNode != nullptr) { trueType_->SetTransformedNode(transformationName, transformedNode); trueType_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(falseType_); falseType_ != transformedNode) { + if (auto *transformedNode = cb(falseType_); falseType_ != transformedNode && transformedNode != nullptr) { falseType_->SetTransformedNode(transformationName, transformedNode); falseType_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ts/tsEnumDeclaration.cpp b/ets2panda/ir/ts/tsEnumDeclaration.cpp index c3d9c28f02..92f0a8089f 100644 --- a/ets2panda/ir/ts/tsEnumDeclaration.cpp +++ b/ets2panda/ir/ts/tsEnumDeclaration.cpp @@ -45,21 +45,22 @@ void TSEnumDeclaration::TransformChildren(const NodeTransformer &cb, std::string { auto const &decorators = Decorators(); for (size_t ix = 0; ix < decorators.size(); ix++) { - if (auto *transformedNode = cb(decorators[ix]); decorators[ix] != transformedNode) { + if (auto *transformedNode = cb(decorators[ix]); + decorators[ix] != transformedNode && transformedNode != nullptr) { decorators[ix]->SetTransformedNode(transformationName, transformedNode); SetValueDecorators(transformedNode->AsDecorator(), ix); } } auto const key = Key(); - if (auto *transformedNode = cb(key); key != transformedNode) { + if (auto *transformedNode = cb(key); key != transformedNode && transformedNode != nullptr) { key->SetTransformedNode(transformationName, transformedNode); SetKey(transformedNode->AsIdentifier()); } auto const &members = Members(); for (size_t ix = 0; ix < members.size(); ix++) { - if (auto *transformedNode = cb(members[ix]); members[ix] != transformedNode) { + if (auto *transformedNode = cb(members[ix]); members[ix] != transformedNode && transformedNode != nullptr) { members[ix]->SetTransformedNode(transformationName, transformedNode); SetValueMembers(transformedNode->AsDecorator(), ix); } diff --git a/ets2panda/ir/ts/tsEnumMember.cpp b/ets2panda/ir/ts/tsEnumMember.cpp index f4f126095a..bb2d9f031e 100644 --- a/ets2panda/ir/ts/tsEnumMember.cpp +++ b/ets2panda/ir/ts/tsEnumMember.cpp @@ -24,13 +24,13 @@ namespace ark::es2panda::ir { void TSEnumMember::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(key_); key_ != transformedNode) { + if (auto *transformedNode = cb(key_); key_ != transformedNode && transformedNode != nullptr) { key_->SetTransformedNode(transformationName, transformedNode); key_ = transformedNode->AsExpression(); } if (init_ != nullptr) { - if (auto *transformedNode = cb(init_); init_ != transformedNode) { + if (auto *transformedNode = cb(init_); init_ != transformedNode && transformedNode != nullptr) { init_->SetTransformedNode(transformationName, transformedNode); init_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ts/tsExternalModuleReference.cpp b/ets2panda/ir/ts/tsExternalModuleReference.cpp index 12207c3d4f..2838ad69ac 100644 --- a/ets2panda/ir/ts/tsExternalModuleReference.cpp +++ b/ets2panda/ir/ts/tsExternalModuleReference.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -24,7 +24,7 @@ namespace ark::es2panda::ir { void TSExternalModuleReference::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(expr_); expr_ != transformedNode) { + if (auto *transformedNode = cb(expr_); expr_ != transformedNode && transformedNode != nullptr) { expr_->SetTransformedNode(transformationName, transformedNode); expr_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ts/tsImportEqualsDeclaration.cpp b/ets2panda/ir/ts/tsImportEqualsDeclaration.cpp index efaa388380..4bcb8cb603 100644 --- a/ets2panda/ir/ts/tsImportEqualsDeclaration.cpp +++ b/ets2panda/ir/ts/tsImportEqualsDeclaration.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -26,12 +26,13 @@ namespace ark::es2panda::ir { void TSImportEqualsDeclaration::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(id_); id_ != transformedNode) { + if (auto *transformedNode = cb(id_); id_ != transformedNode && transformedNode != nullptr) { id_->SetTransformedNode(transformationName, transformedNode); id_ = transformedNode->AsIdentifier(); } - if (auto *transformedNode = cb(moduleReference_); moduleReference_ != transformedNode) { + if (auto *transformedNode = cb(moduleReference_); + moduleReference_ != transformedNode && transformedNode != nullptr) { moduleReference_->SetTransformedNode(transformationName, transformedNode); moduleReference_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ts/tsImportType.cpp b/ets2panda/ir/ts/tsImportType.cpp index a0f981b892..d6a9d7c6a5 100644 --- a/ets2panda/ir/ts/tsImportType.cpp +++ b/ets2panda/ir/ts/tsImportType.cpp @@ -26,20 +26,20 @@ namespace ark::es2panda::ir { void TSImportType::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(param_); param_ != transformedNode) { + if (auto *transformedNode = cb(param_); param_ != transformedNode && transformedNode != nullptr) { param_->SetTransformedNode(transformationName, transformedNode); param_ = transformedNode->AsExpression(); } if (typeParams_ != nullptr) { - if (auto *transformedNode = cb(typeParams_); typeParams_ != transformedNode) { + if (auto *transformedNode = cb(typeParams_); typeParams_ != transformedNode && transformedNode != nullptr) { typeParams_->SetTransformedNode(transformationName, transformedNode); typeParams_ = transformedNode->AsTSTypeParameterInstantiation(); } } if (qualifier_ != nullptr) { - if (auto *transformedNode = cb(qualifier_); qualifier_ != transformedNode) { + if (auto *transformedNode = cb(qualifier_); qualifier_ != transformedNode && transformedNode != nullptr) { qualifier_->SetTransformedNode(transformationName, transformedNode); qualifier_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ts/tsIndexedAccessType.cpp b/ets2panda/ir/ts/tsIndexedAccessType.cpp index e1e110231a..f1f00b7942 100644 --- a/ets2panda/ir/ts/tsIndexedAccessType.cpp +++ b/ets2panda/ir/ts/tsIndexedAccessType.cpp @@ -25,12 +25,12 @@ namespace ark::es2panda::ir { void TSIndexedAccessType::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(objectType_); objectType_ != transformedNode) { + if (auto *transformedNode = cb(objectType_); objectType_ != transformedNode && transformedNode != nullptr) { objectType_->SetTransformedNode(transformationName, transformedNode); objectType_ = static_cast(transformedNode); } - if (auto *transformedNode = cb(indexType_); indexType_ != transformedNode) { + if (auto *transformedNode = cb(indexType_); indexType_ != transformedNode && transformedNode != nullptr) { indexType_->SetTransformedNode(transformationName, transformedNode); indexType_ = static_cast(transformedNode); } diff --git a/ets2panda/ir/ts/tsInferType.cpp b/ets2panda/ir/ts/tsInferType.cpp index dd9d1746dc..12e6b7d049 100644 --- a/ets2panda/ir/ts/tsInferType.cpp +++ b/ets2panda/ir/ts/tsInferType.cpp @@ -25,7 +25,7 @@ namespace ark::es2panda::ir { void TSInferType::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(typeParam_); typeParam_ != transformedNode) { + if (auto *transformedNode = cb(typeParam_); typeParam_ != transformedNode && transformedNode != nullptr) { typeParam_->SetTransformedNode(transformationName, transformedNode); typeParam_ = transformedNode->AsTSTypeParameter(); } diff --git a/ets2panda/ir/ts/tsInterfaceBody.cpp b/ets2panda/ir/ts/tsInterfaceBody.cpp index 94c56deddb..26650f2cdb 100644 --- a/ets2panda/ir/ts/tsInterfaceBody.cpp +++ b/ets2panda/ir/ts/tsInterfaceBody.cpp @@ -25,7 +25,7 @@ namespace ark::es2panda::ir { void TSInterfaceBody::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { for (auto *&it : VectorIterationGuard(body_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode; } diff --git a/ets2panda/ir/ts/tsInterfaceDeclaration.cpp b/ets2panda/ir/ts/tsInterfaceDeclaration.cpp index 4455a8b776..c1002c43e4 100644 --- a/ets2panda/ir/ts/tsInterfaceDeclaration.cpp +++ b/ets2panda/ir/ts/tsInterfaceDeclaration.cpp @@ -127,7 +127,8 @@ void TSInterfaceDeclaration::TransformChildren(const NodeTransformer &cb, std::s { auto const &decorators = Decorators(); for (size_t ix = 0; ix < decorators.size(); ix++) { - if (auto *transformedNode = cb(decorators[ix]); decorators[ix] != transformedNode) { + if (auto *transformedNode = cb(decorators[ix]); + decorators[ix] != transformedNode && transformedNode != nullptr) { decorators[ix]->SetTransformedNode(transformationName, transformedNode); SetValueDecorators(transformedNode->AsDecorator(), ix); } @@ -136,14 +137,14 @@ void TSInterfaceDeclaration::TransformChildren(const NodeTransformer &cb, std::s TransformAnnotations(cb, transformationName); auto const id = Id(); - if (auto *transformedNode = cb(id); id != transformedNode) { + if (auto *transformedNode = cb(id); id != transformedNode && transformedNode != nullptr) { id->SetTransformedNode(transformationName, transformedNode); SetId(transformedNode->AsIdentifier()); } auto const typeParams = TypeParams(); if (typeParams != nullptr) { - if (auto *transformedNode = cb(typeParams); typeParams != transformedNode) { + if (auto *transformedNode = cb(typeParams); typeParams != transformedNode && transformedNode != nullptr) { typeParams->SetTransformedNode(transformationName, transformedNode); SetTypeParams(transformedNode->AsTSTypeParameterDeclaration()); } @@ -151,14 +152,14 @@ void TSInterfaceDeclaration::TransformChildren(const NodeTransformer &cb, std::s auto const &extends = Extends(); for (size_t ix = 0; ix < extends.size(); ix++) { - if (auto *transformedNode = cb(extends[ix]); extends[ix] != transformedNode) { + if (auto *transformedNode = cb(extends[ix]); extends[ix] != transformedNode && transformedNode != nullptr) { extends[ix]->SetTransformedNode(transformationName, transformedNode); SetValueExtends(transformedNode->AsTSInterfaceHeritage(), ix); } } auto const &body = Body(); - if (auto *transformedNode = cb(body); body != transformedNode) { + if (auto *transformedNode = cb(body); body != transformedNode && transformedNode != nullptr) { body->SetTransformedNode(transformationName, transformedNode); SetBody(transformedNode->AsTSInterfaceBody()); } diff --git a/ets2panda/ir/ts/tsInterfaceHeritage.cpp b/ets2panda/ir/ts/tsInterfaceHeritage.cpp index c87aff667f..fc987e3f45 100644 --- a/ets2panda/ir/ts/tsInterfaceHeritage.cpp +++ b/ets2panda/ir/ts/tsInterfaceHeritage.cpp @@ -24,7 +24,7 @@ namespace ark::es2panda::ir { void TSInterfaceHeritage::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(expr_); expr_ != transformedNode) { + if (auto *transformedNode = cb(expr_); expr_ != transformedNode && transformedNode != nullptr) { expr_->SetTransformedNode(transformationName, transformedNode); expr_ = static_cast(transformedNode); } diff --git a/ets2panda/ir/ts/tsIntersectionType.cpp b/ets2panda/ir/ts/tsIntersectionType.cpp index 6dc630a18a..f78378a5ae 100644 --- a/ets2panda/ir/ts/tsIntersectionType.cpp +++ b/ets2panda/ir/ts/tsIntersectionType.cpp @@ -26,7 +26,7 @@ namespace ark::es2panda::ir { void TSIntersectionType::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { for (auto *&it : VectorIterationGuard(types_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ts/tsLiteralType.cpp b/ets2panda/ir/ts/tsLiteralType.cpp index a679912bf4..781f8c8888 100644 --- a/ets2panda/ir/ts/tsLiteralType.cpp +++ b/ets2panda/ir/ts/tsLiteralType.cpp @@ -24,7 +24,7 @@ namespace ark::es2panda::ir { void TSLiteralType::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(literal_); literal_ != transformedNode) { + if (auto *transformedNode = cb(literal_); literal_ != transformedNode && transformedNode != nullptr) { literal_->SetTransformedNode(transformationName, transformedNode); literal_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ts/tsMappedType.cpp b/ets2panda/ir/ts/tsMappedType.cpp index 61da853b75..1e80223857 100644 --- a/ets2panda/ir/ts/tsMappedType.cpp +++ b/ets2panda/ir/ts/tsMappedType.cpp @@ -26,13 +26,14 @@ namespace ark::es2panda::ir { void TSMappedType::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(typeParameter_); typeParameter_ != transformedNode) { + if (auto *transformedNode = cb(typeParameter_); typeParameter_ != transformedNode && transformedNode != nullptr) { typeParameter_->SetTransformedNode(transformationName, transformedNode); typeParameter_ = transformedNode->AsTSTypeParameter(); } if (typeAnnotation_ != nullptr) { - if (auto *transformedNode = cb(typeAnnotation_); typeAnnotation_ != transformedNode) { + if (auto *transformedNode = cb(typeAnnotation_); + typeAnnotation_ != transformedNode && transformedNode != nullptr) { typeAnnotation_->SetTransformedNode(transformationName, transformedNode); typeAnnotation_ = static_cast(transformedNode); } diff --git a/ets2panda/ir/ts/tsModuleBlock.cpp b/ets2panda/ir/ts/tsModuleBlock.cpp index db77f5dee4..742318f8b0 100644 --- a/ets2panda/ir/ts/tsModuleBlock.cpp +++ b/ets2panda/ir/ts/tsModuleBlock.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -25,7 +25,7 @@ namespace ark::es2panda::ir { void TSModuleBlock::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { for (auto *&it : VectorIterationGuard(statements_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsStatement(); } diff --git a/ets2panda/ir/ts/tsModuleDeclaration.cpp b/ets2panda/ir/ts/tsModuleDeclaration.cpp index 88d0f01fb6..e307582e69 100644 --- a/ets2panda/ir/ts/tsModuleDeclaration.cpp +++ b/ets2panda/ir/ts/tsModuleDeclaration.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -26,19 +26,19 @@ namespace ark::es2panda::ir { void TSModuleDeclaration::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { for (auto *&it : VectorIterationGuard(decorators_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode->AsDecorator(); } } - if (auto *transformedNode = cb(name_); name_ != transformedNode) { + if (auto *transformedNode = cb(name_); name_ != transformedNode && transformedNode != nullptr) { name_->SetTransformedNode(transformationName, transformedNode); name_ = transformedNode->AsExpression(); } if (body_ != nullptr) { - if (auto *transformedNode = cb(body_); body_ != transformedNode) { + if (auto *transformedNode = cb(body_); body_ != transformedNode && transformedNode != nullptr) { body_->SetTransformedNode(transformationName, transformedNode); body_ = transformedNode->AsStatement(); } diff --git a/ets2panda/ir/ts/tsNamedTupleMember.cpp b/ets2panda/ir/ts/tsNamedTupleMember.cpp index 742f9e6cd4..9111b94f02 100644 --- a/ets2panda/ir/ts/tsNamedTupleMember.cpp +++ b/ets2panda/ir/ts/tsNamedTupleMember.cpp @@ -25,12 +25,12 @@ namespace ark::es2panda::ir { void TSNamedTupleMember::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { - if (auto *transformedNode = cb(label_); label_ != transformedNode) { + if (auto *transformedNode = cb(label_); label_ != transformedNode && transformedNode != nullptr) { label_->SetTransformedNode(transformationName, transformedNode); label_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(elementType_); elementType_ != transformedNode) { + if (auto *transformedNode = cb(elementType_); elementType_ != transformedNode && transformedNode != nullptr) { elementType_->SetTransformedNode(transformationName, transformedNode); elementType_ = static_cast(transformedNode); } diff --git a/ets2panda/ir/ts/tsNonNullExpression.cpp b/ets2panda/ir/ts/tsNonNullExpression.cpp index f789ed7a7b..5001c3a3c2 100644 --- a/ets2panda/ir/ts/tsNonNullExpression.cpp +++ b/ets2panda/ir/ts/tsNonNullExpression.cpp @@ -23,7 +23,7 @@ namespace ark::es2panda::ir { void TSNonNullExpression::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(expr_); expr_ != transformedNode) { + if (auto *transformedNode = cb(expr_); expr_ != transformedNode && transformedNode != nullptr) { expr_->SetTransformedNode(transformationName, transformedNode); expr_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ts/tsParameterProperty.cpp b/ets2panda/ir/ts/tsParameterProperty.cpp index 047484053f..5328a38f2a 100644 --- a/ets2panda/ir/ts/tsParameterProperty.cpp +++ b/ets2panda/ir/ts/tsParameterProperty.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -25,7 +25,7 @@ namespace ark::es2panda::ir { void TSParameterProperty::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(parameter_); parameter_ != transformedNode) { + if (auto *transformedNode = cb(parameter_); parameter_ != transformedNode && transformedNode != nullptr) { parameter_->SetTransformedNode(transformationName, transformedNode); parameter_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ts/tsParenthesizedType.cpp b/ets2panda/ir/ts/tsParenthesizedType.cpp index 4608efb394..24a2a6e415 100644 --- a/ets2panda/ir/ts/tsParenthesizedType.cpp +++ b/ets2panda/ir/ts/tsParenthesizedType.cpp @@ -24,7 +24,7 @@ namespace ark::es2panda::ir { void TSParenthesizedType::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(type_); type_ != transformedNode) { + if (auto *transformedNode = cb(type_); type_ != transformedNode && transformedNode != nullptr) { type_->SetTransformedNode(transformationName, transformedNode); type_ = static_cast(transformedNode); } diff --git a/ets2panda/ir/ts/tsQualifiedName.cpp b/ets2panda/ir/ts/tsQualifiedName.cpp index d71f7db781..52e3cf0cb2 100644 --- a/ets2panda/ir/ts/tsQualifiedName.cpp +++ b/ets2panda/ir/ts/tsQualifiedName.cpp @@ -44,12 +44,12 @@ void TSQualifiedName::Iterate(const NodeTraverser &cb) const void TSQualifiedName::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(left_); left_ != transformedNode) { + if (auto *transformedNode = cb(left_); left_ != transformedNode && transformedNode != nullptr) { left_->SetTransformedNode(transformationName, transformedNode); left_ = transformedNode->AsExpression(); } - if (auto *transformedNode = cb(right_); right_ != transformedNode) { + if (auto *transformedNode = cb(right_); right_ != transformedNode && transformedNode != nullptr) { right_->SetTransformedNode(transformationName, transformedNode); right_ = transformedNode->AsIdentifier(); } diff --git a/ets2panda/ir/ts/tsTupleType.cpp b/ets2panda/ir/ts/tsTupleType.cpp index d98cbd1622..9aaad91959 100644 --- a/ets2panda/ir/ts/tsTupleType.cpp +++ b/ets2panda/ir/ts/tsTupleType.cpp @@ -30,7 +30,7 @@ namespace ark::es2panda::ir { void TSTupleType::TransformChildren(const NodeTransformer &cb, std::string_view const transformationName) { for (auto *&it : VectorIterationGuard(elementTypes_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = static_cast(transformedNode); } diff --git a/ets2panda/ir/ts/tsTypeAliasDeclaration.cpp b/ets2panda/ir/ts/tsTypeAliasDeclaration.cpp index 75532d6015..f142f16b92 100644 --- a/ets2panda/ir/ts/tsTypeAliasDeclaration.cpp +++ b/ets2panda/ir/ts/tsTypeAliasDeclaration.cpp @@ -42,7 +42,8 @@ void TSTypeAliasDeclaration::TransformChildren(const NodeTransformer &cb, std::s { auto const &decorators = Decorators(); for (size_t ix = 0; ix < decorators.size(); ix++) { - if (auto *transformedNode = cb(decorators[ix]); decorators[ix] != transformedNode) { + if (auto *transformedNode = cb(decorators[ix]); + decorators[ix] != transformedNode && transformedNode != nullptr) { decorators[ix]->SetTransformedNode(transformationName, transformedNode); SetValueDecorators(transformedNode->AsDecorator(), ix); } @@ -50,28 +51,30 @@ void TSTypeAliasDeclaration::TransformChildren(const NodeTransformer &cb, std::s auto const &annotations = Annotations(); for (size_t ix = 0; ix < annotations.size(); ix++) { - if (auto *transformedNode = cb(annotations[ix]); annotations[ix] != transformedNode) { + if (auto *transformedNode = cb(annotations[ix]); + annotations[ix] != transformedNode && transformedNode != nullptr) { annotations[ix]->SetTransformedNode(transformationName, transformedNode); SetValueAnnotations(transformedNode->AsAnnotationUsage(), ix); } } auto const id = Id(); - if (auto *transformedNode = cb(id); id != transformedNode) { + if (auto *transformedNode = cb(id); id != transformedNode && transformedNode != nullptr) { id->SetTransformedNode(transformationName, transformedNode); SetId(transformedNode->AsIdentifier()); } auto const typeParams = TypeParams(); if (typeParams != nullptr) { - if (auto *transformedNode = cb(typeParams); typeParams != transformedNode) { + if (auto *transformedNode = cb(typeParams); typeParams != transformedNode && transformedNode != nullptr) { typeParams->SetTransformedNode(transformationName, transformedNode); SetTypeParameters(transformedNode->AsTSTypeParameterDeclaration()); } } if (auto *typeAnnotation = TypeAnnotation(); typeAnnotation != nullptr) { - if (auto *transformedNode = cb(typeAnnotation); typeAnnotation != transformedNode) { + if (auto *transformedNode = cb(typeAnnotation); + typeAnnotation != transformedNode && transformedNode != nullptr) { typeAnnotation->SetTransformedNode(transformationName, transformedNode); SetTsTypeAnnotation(static_cast(transformedNode)); } diff --git a/ets2panda/ir/ts/tsTypeAssertion.cpp b/ets2panda/ir/ts/tsTypeAssertion.cpp index 64ecd80634..9e15cff417 100644 --- a/ets2panda/ir/ts/tsTypeAssertion.cpp +++ b/ets2panda/ir/ts/tsTypeAssertion.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -26,13 +26,14 @@ namespace ark::es2panda::ir { void TSTypeAssertion::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { if (auto *typeAnnotation = TypeAnnotation(); typeAnnotation != nullptr) { - if (auto *transformedNode = cb(typeAnnotation); typeAnnotation != transformedNode) { + if (auto *transformedNode = cb(typeAnnotation); + typeAnnotation != transformedNode && transformedNode != nullptr) { typeAnnotation->SetTransformedNode(transformationName, transformedNode); SetTsTypeAnnotation(static_cast(transformedNode)); } } - if (auto *transformedNode = cb(expression_); expression_ != transformedNode) { + if (auto *transformedNode = cb(expression_); expression_ != transformedNode && transformedNode != nullptr) { expression_->SetTransformedNode(transformationName, transformedNode); expression_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ts/tsTypeLiteral.cpp b/ets2panda/ir/ts/tsTypeLiteral.cpp index d13f7662cd..544d16d380 100644 --- a/ets2panda/ir/ts/tsTypeLiteral.cpp +++ b/ets2panda/ir/ts/tsTypeLiteral.cpp @@ -29,7 +29,7 @@ namespace ark::es2panda::ir { void TSTypeLiteral::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { for (auto *&it : VectorIterationGuard(members_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = transformedNode; } diff --git a/ets2panda/ir/ts/tsTypeOperator.cpp b/ets2panda/ir/ts/tsTypeOperator.cpp index 2fa2ad26ad..6ed34b56cc 100644 --- a/ets2panda/ir/ts/tsTypeOperator.cpp +++ b/ets2panda/ir/ts/tsTypeOperator.cpp @@ -24,7 +24,7 @@ namespace ark::es2panda::ir { void TSTypeOperator::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(type_); type_ != transformedNode) { + if (auto *transformedNode = cb(type_); type_ != transformedNode && transformedNode != nullptr) { type_->SetTransformedNode(transformationName, transformedNode); type_ = static_cast(transformedNode); } diff --git a/ets2panda/ir/ts/tsTypeParameter.cpp b/ets2panda/ir/ts/tsTypeParameter.cpp index 4a8d253809..be06dbbe3b 100644 --- a/ets2panda/ir/ts/tsTypeParameter.cpp +++ b/ets2panda/ir/ts/tsTypeParameter.cpp @@ -44,14 +44,14 @@ void TSTypeParameter::SetName(Identifier *name) void TSTypeParameter::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { auto const name = Name(); - if (auto *transformedNode = cb(name); name != transformedNode) { + if (auto *transformedNode = cb(name); name != transformedNode && transformedNode != nullptr) { name->SetTransformedNode(transformationName, transformedNode); SetName(transformedNode->AsIdentifier()); } auto const constraint = Constraint(); if (constraint != nullptr) { - if (auto *transformedNode = cb(constraint); constraint != transformedNode) { + if (auto *transformedNode = cb(constraint); constraint != transformedNode && transformedNode != nullptr) { constraint->SetTransformedNode(transformationName, transformedNode); SetConstraint(static_cast(transformedNode)); } @@ -59,7 +59,7 @@ void TSTypeParameter::TransformChildren(const NodeTransformer &cb, std::string_v auto const defaultType = DefaultType(); if (defaultType != nullptr) { - if (auto *transformedNode = cb(defaultType); defaultType != transformedNode) { + if (auto *transformedNode = cb(defaultType); defaultType != transformedNode && transformedNode != nullptr) { defaultType->SetTransformedNode(transformationName, transformedNode); SetDefaultType(static_cast(transformedNode)); } @@ -67,7 +67,8 @@ void TSTypeParameter::TransformChildren(const NodeTransformer &cb, std::string_v auto const annotations = Annotations(); for (size_t ix = 0; ix < annotations.size(); ix++) { - if (auto *transformedNode = cb(annotations[ix]); annotations[ix] != transformedNode) { + if (auto *transformedNode = cb(annotations[ix]); + annotations[ix] != transformedNode && transformedNode != nullptr) { annotations[ix]->SetTransformedNode(transformationName, transformedNode); SetValueAnnotations(transformedNode->AsAnnotationUsage(), ix); } diff --git a/ets2panda/ir/ts/tsTypeParameterDeclaration.cpp b/ets2panda/ir/ts/tsTypeParameterDeclaration.cpp index b6d5744998..1940060fe2 100644 --- a/ets2panda/ir/ts/tsTypeParameterDeclaration.cpp +++ b/ets2panda/ir/ts/tsTypeParameterDeclaration.cpp @@ -38,7 +38,7 @@ void TSTypeParameterDeclaration::TransformChildren(const NodeTransformer &cb, st { auto const params = Params(); for (size_t ix = 0; ix < params.size(); ix++) { - if (auto *transformedNode = cb(params[ix]); params[ix] != transformedNode) { + if (auto *transformedNode = cb(params[ix]); params[ix] != transformedNode && transformedNode != nullptr) { params[ix]->SetTransformedNode(transformationName, transformedNode); SetValueParams(transformedNode->AsTSTypeParameter(), ix); } diff --git a/ets2panda/ir/ts/tsTypeParameterInstantiation.cpp b/ets2panda/ir/ts/tsTypeParameterInstantiation.cpp index 08a1826550..4947c84103 100644 --- a/ets2panda/ir/ts/tsTypeParameterInstantiation.cpp +++ b/ets2panda/ir/ts/tsTypeParameterInstantiation.cpp @@ -44,7 +44,7 @@ TSTypeParameterInstantiation *TSTypeParameterInstantiation::Clone(ArenaAllocator void TSTypeParameterInstantiation::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { for (auto *&it : VectorIterationGuard(params_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = static_cast(transformedNode); } diff --git a/ets2panda/ir/ts/tsTypePredicate.cpp b/ets2panda/ir/ts/tsTypePredicate.cpp index 0ab2158429..a190faaf5a 100644 --- a/ets2panda/ir/ts/tsTypePredicate.cpp +++ b/ets2panda/ir/ts/tsTypePredicate.cpp @@ -26,13 +26,14 @@ namespace ark::es2panda::ir { void TSTypePredicate::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(parameterName_); parameterName_ != transformedNode) { + if (auto *transformedNode = cb(parameterName_); parameterName_ != transformedNode && transformedNode != nullptr) { parameterName_->SetTransformedNode(transformationName, transformedNode); parameterName_ = transformedNode->AsExpression(); } if (typeAnnotation_ != nullptr) { - if (auto *transformedNode = cb(typeAnnotation_); typeAnnotation_ != transformedNode) { + if (auto *transformedNode = cb(typeAnnotation_); + typeAnnotation_ != transformedNode && transformedNode != nullptr) { typeAnnotation_->SetTransformedNode(transformationName, transformedNode); typeAnnotation_ = static_cast(transformedNode); } diff --git a/ets2panda/ir/ts/tsTypeQuery.cpp b/ets2panda/ir/ts/tsTypeQuery.cpp index 5fa24495e8..76ce93c9b3 100644 --- a/ets2panda/ir/ts/tsTypeQuery.cpp +++ b/ets2panda/ir/ts/tsTypeQuery.cpp @@ -25,7 +25,7 @@ namespace ark::es2panda::ir { void TSTypeQuery::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { - if (auto *transformedNode = cb(exprName_); exprName_ != transformedNode) { + if (auto *transformedNode = cb(exprName_); exprName_ != transformedNode && transformedNode != nullptr) { exprName_->SetTransformedNode(transformationName, transformedNode); exprName_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ts/tsTypeReference.cpp b/ets2panda/ir/ts/tsTypeReference.cpp index 57b8f7d2ae..0d3b3d71f1 100644 --- a/ets2panda/ir/ts/tsTypeReference.cpp +++ b/ets2panda/ir/ts/tsTypeReference.cpp @@ -34,13 +34,13 @@ namespace ark::es2panda::ir { void TSTypeReference::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { if (typeParams_ != nullptr) { - if (auto *transformedNode = cb(typeParams_); typeParams_ != transformedNode) { + if (auto *transformedNode = cb(typeParams_); typeParams_ != transformedNode && transformedNode != nullptr) { typeParams_->SetTransformedNode(transformationName, transformedNode); typeParams_ = transformedNode->AsTSTypeParameterInstantiation(); } } - if (auto *transformedNode = cb(typeName_); typeName_ != transformedNode) { + if (auto *transformedNode = cb(typeName_); typeName_ != transformedNode && transformedNode != nullptr) { typeName_->SetTransformedNode(transformationName, transformedNode); typeName_ = transformedNode->AsExpression(); } diff --git a/ets2panda/ir/ts/tsUnionType.cpp b/ets2panda/ir/ts/tsUnionType.cpp index aca8a8aa89..b4055722cd 100644 --- a/ets2panda/ir/ts/tsUnionType.cpp +++ b/ets2panda/ir/ts/tsUnionType.cpp @@ -25,7 +25,7 @@ namespace ark::es2panda::ir { void TSUnionType::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) { for (auto *&it : VectorIterationGuard(types_)) { - if (auto *transformedNode = cb(it); it != transformedNode) { + if (auto *transformedNode = cb(it); it != transformedNode && transformedNode != nullptr) { it->SetTransformedNode(transformationName, transformedNode); it = static_cast(transformedNode); } diff --git a/ets2panda/test/ast/compiler/ets/lambda_infer_type/lambda_rest_param.ets b/ets2panda/test/ast/compiler/ets/lambda_infer_type/lambda_rest_param.ets new file mode 100644 index 0000000000..70b2107fba --- /dev/null +++ b/ets2panda/test/ast/compiler/ets/lambda_infer_type/lambda_rest_param.ets @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +let f = (...args) =>{ return args.length; }; +/* @@ label1 */f(1,2,3); + +((a:number, ...args)=> { return args.length; })(1,2,3,4,5) + +/* @@@ label1 Error TypeError: This expression is not callable. */ -- Gitee