diff --git a/es2panda/binder/binder.cpp b/es2panda/binder/binder.cpp index f7dd8b5d568c34e585e8d7b820d76083cd50e2c1..02e171f54ffb082cf84fc4c1e5b3651db2702adf 100644 --- a/es2panda/binder/binder.cpp +++ b/es2panda/binder/binder.cpp @@ -752,7 +752,7 @@ void Binder::AddDeclarationName(const util::StringView &name, DeclType type) return; } variableNames_.insert(name); - + if (type == DeclType::ENUM) { return; } diff --git a/es2panda/ir/base/classProperty.h b/es2panda/ir/base/classProperty.h index b2cc33c8d73884245ed9eb938f7caaf0b65d2cf1..0f033db9e5db165599a745f30890d2f493319f24 100644 --- a/es2panda/ir/base/classProperty.h +++ b/es2panda/ir/base/classProperty.h @@ -71,6 +71,11 @@ public: return value_; } + void RemoveValue() + { + value_ = nullptr; + } + const Expression *TypeAnnotation() const { return typeAnnotation_; diff --git a/es2panda/parser/transformer/transformer.cpp b/es2panda/parser/transformer/transformer.cpp index fbf2812a2eb7e23a67665a8543476e98a099bcff..50c14f11f2d7d0bda77108af0e72d174d98bc0be 100644 --- a/es2panda/parser/transformer/transformer.cpp +++ b/es2panda/parser/transformer/transformer.cpp @@ -290,6 +290,7 @@ ir::UpdateNodes Transformer::VisitTSNode(ir::AstNode *childNode) node = VisitTSNodes(node)->AsClassDeclaration(); auto res = VisitClassDeclaration(node); SetOriginalNode(res, childNode); + RemoveOriginNodeValueForClassPerporty(node->Definition()); return res; } case ir::AstNodeType::CLASS_EXPRESSION: { @@ -298,6 +299,7 @@ ir::UpdateNodes Transformer::VisitTSNode(ir::AstNode *childNode) node = VisitTSNodes(node)->AsClassExpression(); auto res = VisitClassExpression(node); SetOriginalNode(res, childNode); + RemoveOriginNodeValueForClassPerporty(node->Definition()); return res; } case ir::AstNodeType::CLASS_DEFINITION: { @@ -1875,4 +1877,16 @@ void Transformer::CheckTransformedAstNode(const ir::AstNode *parent, ir::AstNode CheckTransformedAstNodes(childNode, passed); } +void Transformer::RemoveOriginNodeValueForClassPerporty(const ir::ClassDefinition *node) +{ + // In the transformer, after classPerporty is moved to Constructor, the original node will not be deleted. + // When classPerporty value is a function, two mandatory parameters will be added in the binder of this function. + // The original classPerporty value is deleted here, and the key is reserved for type extraction. + for (auto *it : node->Body()) { + if (it->IsClassProperty()) { + it->AsClassProperty()->RemoveValue(); + } + } +} + } // namespace panda::es2panda::parser diff --git a/es2panda/parser/transformer/transformer.h b/es2panda/parser/transformer/transformer.h index f7a55878f2cfdd548f6499f22e950fe08c13e8df..15fe3abf3e44c72a3bf7439bc7c296041f1491bf 100644 --- a/es2panda/parser/transformer/transformer.h +++ b/es2panda/parser/transformer/transformer.h @@ -191,6 +191,8 @@ private: void CheckTransformedAstNodes(const ir::AstNode *parent, bool *passed) const; void CheckTransformedAstNode(const ir::AstNode *parent, ir::AstNode *childNode, bool *passed) const; + void RemoveOriginNodeValueForClassPerporty(const ir::ClassDefinition *node); + template ir::UpdateNodes VisitExportClassDeclaration(T *node); diff --git a/es2panda/test/compiler/ts/cases/conformance/classes/test-ts-classes-19-expected.txt b/es2panda/test/compiler/ts/cases/conformance/classes/test-ts-classes-19-expected.txt new file mode 100644 index 0000000000000000000000000000000000000000..ce013625030ba8dba906f756967f9e9ca394464a --- /dev/null +++ b/es2panda/test/compiler/ts/cases/conformance/classes/test-ts-classes-19-expected.txt @@ -0,0 +1 @@ +hello diff --git a/es2panda/test/compiler/ts/cases/conformance/classes/test-ts-classes-19.ts b/es2panda/test/compiler/ts/cases/conformance/classes/test-ts-classes-19.ts new file mode 100644 index 0000000000000000000000000000000000000000..b8597f1fdc2399d07c8b32cab2669289c3f74c08 --- /dev/null +++ b/es2panda/test/compiler/ts/cases/conformance/classes/test-ts-classes-19.ts @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2023 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. + */ + + +class A { + static a = { + func:function (param) { + print(param); + } + } +} + +A.a.func("hello"); 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 a7cf5138fd2f8e67830c6659e1a2b15510ecae62..e0545061bbf15425ef9ce862b6c8c10345af7407 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 @@ -104,20 +104,6 @@ } } }, - "value": { - "type": "NumberLiteral", - "value": 1, - "loc": { - "start": { - "line": 17, - "column": 32 - }, - "end": { - "line": 17, - "column": 33 - } - } - }, "static": true, "readonly": false, "declare": false, 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 74a6bd40cea30f01d8731e243efeb20f68be18c2..5e316d4a7ca8bea4da5375789ef8f3bd820e8e17 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 @@ -117,20 +117,6 @@ } } }, - "value": { - "type": "NumberLiteral", - "value": 1, - "loc": { - "start": { - "line": 17, - "column": 26 - }, - "end": { - "line": 17, - "column": 27 - } - } - }, "static": true, "readonly": false, "declare": false,