diff --git a/es2panda/parser/transformer/transformer.cpp b/es2panda/parser/transformer/transformer.cpp index 56c11da4613806937aafa06d28c691695fa5a111..d1b20892a856f290482b60a92c5a9b7b7fdc1ca1 100644 --- a/es2panda/parser/transformer/transformer.cpp +++ b/es2panda/parser/transformer/transformer.cpp @@ -580,10 +580,18 @@ std::vector Transformer::VisitInstanceProperty(ir::Cl if (it->IsComputed()) { computedProps.push_back(AllocNode(it->Key())); } - auto *member = GetClassMemberName(it->Key(), it->IsComputed(), it); - auto *left = AllocNode(AllocNode(), member, - ir::MemberExpression::MemberExpressionKind::ELEMENT_ACCESS, - true, false); + + ir::MemberExpression *left = nullptr; + auto *member = GetClassMemberName(it->Key(), it->IsComputed(), it, false); + if (member->IsIdentifier() && !it->IsComputed()) { + left = AllocNode(AllocNode(), member, + ir::MemberExpression::MemberExpressionKind::PROPERTY_ACCESS, + false, false); + } else { + left = AllocNode(AllocNode(), member, + ir::MemberExpression::MemberExpressionKind::ELEMENT_ACCESS, + true, false); + } auto assignment = AllocNode(left, it->Value(), lexer::TokenType::PUNCTUATOR_SUBSTITUTION); @@ -683,9 +691,18 @@ std::vector Transformer::VisitStaticProperty(ir::Clas if (right == nullptr) { continue; } - auto *member = GetClassMemberName(classProperty->Key(), classProperty->IsComputed(), classProperty); - auto left = AllocNode(CreateReferenceIdentifier(name), member, - ir::MemberExpression::MemberExpressionKind::ELEMENT_ACCESS, true, false); + + ir::MemberExpression *left = nullptr; + auto *member = GetClassMemberName(classProperty->Key(), classProperty->IsComputed(), classProperty, false); + if (member->IsIdentifier() && !classProperty->IsComputed()) { + left = AllocNode(CreateReferenceIdentifier(name), member, + ir::MemberExpression::MemberExpressionKind::PROPERTY_ACCESS, + false, false); + } else { + left = AllocNode(CreateReferenceIdentifier(name), member, + ir::MemberExpression::MemberExpressionKind::ELEMENT_ACCESS, + true, false); + } auto assignment = AllocNode(left, right, lexer::TokenType::PUNCTUATOR_SUBSTITUTION); res.push_back(AllocNode(assignment)); } @@ -939,14 +956,19 @@ ir::CallExpression *Transformer::CreateGetOwnPropertyDescriptorCall(ir::Expressi return AllocNode(caller, std::move(arguments), nullptr, false); } -ir::Expression *Transformer::GetClassMemberName(ir::Expression *key, bool isComputed, ir::Statement *node) +ir::Expression *Transformer::GetClassMemberName(ir::Expression *key, bool isComputed, + ir::Statement *node, bool inDecorator) { if (isComputed) { auto name = GetComputedPropertyBinding(node); return AllocNode(name); } if (key->IsIdentifier()) { - return AllocNode(key->AsIdentifier()->Name()); + if (inDecorator) { + return AllocNode(key->AsIdentifier()->Name()); + } else { + return AllocNode(key->AsIdentifier()->Name()); + } } else if (key->IsStringLiteral()) { return AllocNode(key->AsStringLiteral()->Str()); } else if (key->IsNumberLiteral()) { diff --git a/es2panda/parser/transformer/transformer.h b/es2panda/parser/transformer/transformer.h index 80dab1af876850ea909bd2504ca6999bb0b41ad0..856ae31ec82e259723a1b5f8aee30a2c7e6f5098 100644 --- a/es2panda/parser/transformer/transformer.h +++ b/es2panda/parser/transformer/transformer.h @@ -146,7 +146,8 @@ private: util::StringView GetNameFromModuleDeclaration(ir::TSModuleDeclaration *node) const; util::StringView GetParamName(ir::AstNode *node, util::StringView name) const; - ir::Expression *GetClassMemberName(ir::Expression *key, bool isComputed, ir::Statement *node); + ir::Expression *GetClassMemberName(ir::Expression *key, bool isComputed, + ir::Statement *node, bool inDecorator = true); binder::Scope *FindExportVariableInTsModuleScope(util::StringView name) const; binder::Variable *FindTSModuleVariable(const ir::Expression *node, binder::Scope *scope) const; util::StringView FindPrivatePropertyBindName(util::StringView name); diff --git a/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-1-transformed-expected.txt b/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-1-transformed-expected.txt index 867daffd1e106c4d00d6a2c710c32b86a14bc975..f4a1ec63e4b85b5631bb300b7e1b45ee6ec52bd6 100644 --- a/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-1-transformed-expected.txt +++ b/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-1-transformed-expected.txt @@ -193,8 +193,8 @@ } }, "property": { - "type": "StringLiteral", - "value": "a", + "type": "Identifier", + "name": "a", "loc": { "start": { "line": 1, @@ -206,7 +206,7 @@ } } }, - "computed": true, + "computed": false, "optional": false, "loc": { "start": { diff --git a/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-2-transformed-expected.txt b/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-2-transformed-expected.txt index 94d0ab435af056a13dc4ed168d6c9b31e6b0cc4a..afd286b70d499334de9a4ce487be81beef6089bc 100644 --- a/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-2-transformed-expected.txt +++ b/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-2-transformed-expected.txt @@ -208,8 +208,8 @@ } }, "property": { - "type": "StringLiteral", - "value": "a", + "type": "Identifier", + "name": "a", "loc": { "start": { "line": 1, @@ -221,7 +221,7 @@ } } }, - "computed": true, + "computed": false, "optional": false, "loc": { "start": {