diff --git a/ets2panda/checker/ets/typeCheckingHelpers.cpp b/ets2panda/checker/ets/typeCheckingHelpers.cpp index 212045f27b2443ea9b14e3574bf1aee3c8ec69aa..b9dfe3444fe3f4329d2bfc1c77897f71564d9f78 100644 --- a/ets2panda/checker/ets/typeCheckingHelpers.cpp +++ b/ets2panda/checker/ets/typeCheckingHelpers.cpp @@ -1083,7 +1083,6 @@ static auto IsNonArrayLiteral(ir::Expression *init) } if (init->TsType()->IsETSEnumType() && init->TsType()->AsETSEnumType()->NodeIsEnumLiteral(init)) { - init->AddAstNodeFlags(ir::AstNodeFlags::GENERATE_VALUE_OF); return true; } return false; diff --git a/ets2panda/compiler/core/ETSemitter.cpp b/ets2panda/compiler/core/ETSemitter.cpp index eebd5d8c093008ca65edff7d5ef6ced414f7aee4..b7ca8ea3a635378614909d6d564944e5d44bc1ef 100644 --- a/ets2panda/compiler/core/ETSemitter.cpp +++ b/ets2panda/compiler/core/ETSemitter.cpp @@ -663,10 +663,51 @@ void ETSEmitter::ProcessArrayExpression( } } +static void CreateEnumProp(const ir::ClassProperty *prop, pandasm::Field &field) +{ + if (prop->Value() == nullptr) { + return; + } + field.metadata->SetFieldType(field.type); + auto declNode = prop->Value()->AsMemberExpression()->PropVar()->Declaration()->Node(); + auto *init = declNode->AsClassProperty()->OriginEnumMember()->Init(); + if (init->IsNumberLiteral()) { + auto value = init->AsNumberLiteral()->Number().GetInt(); + field.metadata->SetValue(pandasm::ScalarValue::Create(value)); + } else if (init->IsStringLiteral()) { + auto value = init->AsStringLiteral()->Str().Mutf8(); + field.metadata->SetValue(pandasm::ScalarValue::Create(value)); + } else { + ES2PANDA_UNREACHABLE(); + } +} + +static void ProcessEnumExpression(std::vector &literals, const ir::Expression *elem) +{ + auto *memberExpr = elem->IsCallExpression() ? elem->AsCallExpression()->Arguments()[0]->AsMemberExpression() + : elem->AsMemberExpression(); + auto *init = memberExpr->PropVar()->Declaration()->Node()->AsClassProperty()->OriginEnumMember()->Init(); + if (init->IsNumberLiteral()) { + auto enumValue = static_cast(init->AsNumberLiteral()->Number().GetInt()); + literals.emplace_back(pandasm::LiteralArray::Literal {panda_file::LiteralTag::TAGVALUE, + static_cast(panda_file::LiteralTag::INTEGER)}); + literals.emplace_back(pandasm::LiteralArray::Literal {panda_file::LiteralTag::INTEGER, enumValue}); + } else { + auto enumValue = init->AsStringLiteral()->Str().Mutf8(); + literals.emplace_back(pandasm::LiteralArray::Literal {panda_file::LiteralTag::TAGVALUE, + static_cast(panda_file::LiteralTag::STRING)}); + literals.emplace_back(pandasm::LiteralArray::Literal {panda_file::LiteralTag::STRING, enumValue}); + } +} + void ETSEmitter::ProcessArrayElement(const ir::Expression *elem, std::vector &literals, std::string &baseName, LiteralArrayVector &result) { - ES2PANDA_ASSERT(elem->IsLiteral() || elem->IsArrayExpression()); + ES2PANDA_ASSERT(elem->IsLiteral() || elem->IsArrayExpression() || elem->IsMemberExpression()); + if (elem->IsMemberExpression()) { + ProcessEnumExpression(literals, elem); + return; + } auto emplaceLiteral = [&literals](panda_file::LiteralTag tag, auto value) { literals.emplace_back( pandasm::LiteralArray::Literal {panda_file::LiteralTag::TAGVALUE, static_cast(tag)}); @@ -765,6 +806,8 @@ void ETSEmitter::GenCustomAnnotationProp(const ir::ClassProperty *prop, std::str if (external) { field.metadata->SetAttribute(Signatures::EXTERNAL); + } else if (type->IsETSEnumType()) { + CreateEnumProp(prop, field); } else if (type->IsETSPrimitiveType() || type->IsETSStringType()) { EmitDefaultFieldValue(field, prop->Value()); } else if (type->IsETSArrayType() || type->IsETSResizableArrayType()) { @@ -813,6 +856,22 @@ pandasm::AnnotationElement ETSEmitter::ProcessArrayType(const ir::ClassProperty std::string_view {litArrays.back().first}))}; } +static pandasm::AnnotationElement ProcessETSEnumType(std::string &baseName, const ir::Expression *init, + const checker::Type *type) +{ + auto declNode = init->AsMemberExpression()->PropVar()->Declaration()->Node(); + auto *initValue = declNode->AsClassProperty()->OriginEnumMember()->Init(); + if (type->IsETSIntEnumType()) { + auto enumValue = static_cast(initValue->AsNumberLiteral()->Number().GetInt()); + auto intEnumValue = pandasm::ScalarValue::Create(enumValue); + return pandasm::AnnotationElement {baseName, std::make_unique(intEnumValue)}; + } + ES2PANDA_ASSERT(type->IsETSStringEnumType()); + auto enumValue = initValue->AsStringLiteral()->Str().Mutf8(); + auto stringValue = pandasm::ScalarValue::Create(enumValue); + return pandasm::AnnotationElement {baseName, std::make_unique(stringValue)}; +} + pandasm::AnnotationElement ETSEmitter::GenCustomAnnotationElement(const ir::ClassProperty *prop, std::string &baseName) { const auto *init = prop->Value(); @@ -820,6 +879,9 @@ pandasm::AnnotationElement ETSEmitter::GenCustomAnnotationElement(const ir::Clas if (type->IsETSArrayType() || type->IsETSResizableArrayType()) { return ProcessArrayType(prop, baseName, init); } + if (type->IsETSEnumType()) { + return ProcessETSEnumType(baseName, init, type); + } if (init->IsLiteral()) { auto typeKind = checker::ETSChecker::TypeKind(type); auto propName = prop->Id()->Name().Mutf8(); diff --git a/ets2panda/compiler/lowering/ets/unboxLowering.cpp b/ets2panda/compiler/lowering/ets/unboxLowering.cpp index 8361fb2ecdfa8e3e8dc54bc072568335ec78e761..b9e1cfdb00e4694c3b122587cdeb612327742ef4 100644 --- a/ets2panda/compiler/lowering/ets/unboxLowering.cpp +++ b/ets2panda/compiler/lowering/ets/unboxLowering.cpp @@ -1437,7 +1437,8 @@ static void VisitExternalPrograms(UnboxVisitor *visitor, parser::Program *progra auto prop = child->AsClassProperty(); HandleClassProperty(visitor->uctx_, prop); if (prop->Value() != nullptr) { - ES2PANDA_ASSERT(prop->Value()->IsLiteral() || prop->Value()->IsArrayExpression()); + ES2PANDA_ASSERT(prop->Value()->IsLiteral() || prop->Value()->IsArrayExpression() || + (prop->Value()->IsTyped() && prop->Value()->AsTyped()->TsType()->IsETSEnumType())); prop->Value()->Accept(visitor); } visitor->VisitClassProperty(child->AsClassProperty()); diff --git a/ets2panda/compiler/lowering/phase.cpp b/ets2panda/compiler/lowering/phase.cpp index 3c77d41096f36a4188cfbba59f43bc19f4c4eba8..21c9fe77accc77c295e2bbb4144e625b6d98102f 100644 --- a/ets2panda/compiler/lowering/phase.cpp +++ b/ets2panda/compiler/lowering/phase.cpp @@ -86,7 +86,6 @@ static ConstantExpressionLowering g_constantExpressionLowering; static InterfacePropertyDeclarationsPhase g_interfacePropDeclPhase; // NOLINT(fuchsia-statically-constructed-objects) static EnumLoweringPhase g_enumLoweringPhase; static EnumPostCheckLoweringPhase g_enumPostCheckLoweringPhase; -static EnumPropertiesInAnnotationsLoweringPhase g_enumPropertiesInAnnotationsLowering; static RestTupleConstructionPhase g_restTupleConstructionPhase; static SpreadConstructionPhase g_spreadConstructionPhase; static ExtensionAccessorPhase g_extensionAccessorPhase; @@ -171,7 +170,6 @@ std::vector GetETSPhaseList() &g_asyncMethodLowering, &g_declareOverloadLowering, &g_enumPostCheckLoweringPhase, - &g_enumPropertiesInAnnotationsLowering, &g_spreadConstructionPhase, &g_restArgsLowering, &g_arrayLiteralLowering, diff --git a/ets2panda/test/test-lists/ets-runtime/ets-runtime-ignored.txt b/ets2panda/test/test-lists/ets-runtime/ets-runtime-ignored.txt index 63eadc3ad58e4ef0f267dd2adbb0062da5e07b80..ea070aa6e6fecff2352dfef513835d674d078e4b 100644 --- a/ets2panda/test/test-lists/ets-runtime/ets-runtime-ignored.txt +++ b/ets2panda/test/test-lists/ets-runtime/ets-runtime-ignored.txt @@ -109,16 +109,11 @@ nullishTypeCodesamples.ets instanceof.ets # Rebase no-primitives pathch onto master with merger Array refactoring -annotation_tests/AnnotationForLambdaExpression.ets -annotation_tests/EmitAnnotationToBytecode.ets -namespace_tests/namespace_with_annotations.ets lambda_with_rest_param_resizablearray.ets type_from_primitive_type.ets lambda_with_rest_param_fixedarray.ets lambda_with_restparameter_object_fixedarray.ets lambda_with_restparameter_predefinedtypes_fixedarray.ets -annotation_tests/AnnotationForTypesInAnnotation.ets -annotation_tests/annotationUsageSingleFileds07.ets rest_object_literal.ets union_generic_class.ets stringliteral_to_char.ets