diff --git a/ets2panda/BUILD.gn b/ets2panda/BUILD.gn index 596f03163ccfa9da9069f87a7683f7359b2a5526..02bc9f22da0d01d30a90a482a246fac1fe37dd9d 100644 --- a/ets2panda/BUILD.gn +++ b/ets2panda/BUILD.gn @@ -487,6 +487,7 @@ libes2panda_sources = [ "util/es2pandaMacros.cpp", "util/helpers.cpp", "util/importPathManager.cpp", + "util/nameMangler.cpp", "util/path.cpp", "util/perfMetrics.cpp", "util/plugin.cpp", diff --git a/ets2panda/CMakeLists.txt b/ets2panda/CMakeLists.txt index d40f60c4f49d5841cc4005e2f7a4ad4be8e0bbe6..aba00e27dc1540910040279ed709ea2f62f1334a 100644 --- a/ets2panda/CMakeLists.txt +++ b/ets2panda/CMakeLists.txt @@ -641,6 +641,7 @@ set(ES2PANDA_LIB_SRC util/es2pandaMacros.cpp util/helpers.cpp util/importPathManager.cpp + util/nameMangler.cpp util/path.cpp util/perfMetrics.cpp util/ustring.cpp diff --git a/ets2panda/checker/ets/assignAnalyzer.cpp b/ets2panda/checker/ets/assignAnalyzer.cpp index 8b29b6e855f4fd3acb58d88e3409dcc3758e3a40..58fe8f9f045cee3e4dc68682c18001aa75910ab9 100644 --- a/ets2panda/checker/ets/assignAnalyzer.cpp +++ b/ets2panda/checker/ets/assignAnalyzer.cpp @@ -1291,7 +1291,7 @@ static const ir::AstNode *CheckInterfaceProp(const ark::es2panda::ir::AstNode *c { util::StringView methodName = node->AsMethodDefinition()->Key()->AsIdentifier()->Name(); // the property from interface should start with to distinguish from its getter/setter. - std::string interfaceProp = std::string("") + std::string(methodName.Utf8()); + std::string interfaceProp = std::string("%%property-") + std::string(methodName.Utf8()); for (const auto it : classDef->Body()) { // Check if there is corresponding class property in the same class. if (it->IsClassProperty() && !it->IsStatic()) { diff --git a/ets2panda/checker/ets/function.cpp b/ets2panda/checker/ets/function.cpp index ea80a961c377bad8c0774150bebde324fc61cc1b..adf46293f9ca789fa851a9314c393e7c5a716009 100644 --- a/ets2panda/checker/ets/function.cpp +++ b/ets2panda/checker/ets/function.cpp @@ -55,6 +55,7 @@ #include "ir/ts/tsTypeParameterInstantiation.h" #include "parser/program/program.h" #include "util/helpers.h" +#include "util/nameMangler.h" #include @@ -2147,9 +2148,9 @@ bool ETSChecker::IsReturnTypeSubstitutable(Signature *const s1, Signature *const std::string ETSChecker::GetAsyncImplName(const util::StringView &name) { - std::string implName(name); - implName += "$asyncimpl"; - return implName; + std::string newName = + util::NameMangler::GetInstance()->CreateMangledNameByTypeAndName(util::NameMangler::ASYNC, name); + return newName; } std::string ETSChecker::GetAsyncImplName(ir::MethodDefinition *asyncMethod) @@ -2158,7 +2159,7 @@ std::string ETSChecker::GetAsyncImplName(ir::MethodDefinition *asyncMethod) ES2PANDA_ASSERT_POS(asyncName != nullptr, asyncMethod->Start()); return GetAsyncImplName(asyncName->Name()); } - +// Note (oeotvos) Do we even use this method anywhere? bool ETSChecker::IsAsyncImplMethod(ir::MethodDefinition const *method) { auto methodName = method->Key()->AsIdentifier()->Name().Utf8(); diff --git a/ets2panda/checker/ets/helpers.cpp b/ets2panda/checker/ets/helpers.cpp index 553abd66e2047e601d4e4440b62db65fc8eadec5..12e5de7f4657f9c79d05778583132e0a95643b2f 100644 --- a/ets2panda/checker/ets/helpers.cpp +++ b/ets2panda/checker/ets/helpers.cpp @@ -24,6 +24,7 @@ #include "evaluate/scopedDebugInfoPlugin.h" #include "compiler/lowering/scopesInit/scopesInitPhase.h" #include "compiler/lowering/util.h" +#include "util/nameMangler.h" namespace ark::es2panda::checker { @@ -2572,6 +2573,10 @@ static void ReInitScopesForTypeAnnotation(ETSChecker *checker, ir::TypeNode *typ ir::ClassProperty *ETSChecker::ClassPropToImplementationProp(ir::ClassProperty *classProp, varbinder::ClassScope *scope) { + // std::string newName = util::NameMangler::GetInstance()->CreateMangledNameByTypeAndName( + // util::NameMangler::PROPERTY, classProp->Key()->AsIdentifier()->Name()); + + // classProp->Key()->AsIdentifier()->SetName(util::UString(newName, ProgramAllocator()).View()); classProp->Key()->AsIdentifier()->SetName( util::UString(std::string(compiler::Signatures::PROPERTY) + classProp->Key()->AsIdentifier()->Name().Mutf8(), ProgramAllocator()) diff --git a/ets2panda/checker/ets/utilityTypeHandlers.cpp b/ets2panda/checker/ets/utilityTypeHandlers.cpp index c267defa3c8f07b568c3720c739da8bc9d218139..82c93997e08e67cf222d9ef2ed20dca4e8508070 100644 --- a/ets2panda/checker/ets/utilityTypeHandlers.cpp +++ b/ets2panda/checker/ets/utilityTypeHandlers.cpp @@ -22,6 +22,7 @@ #include "ir/expressions/literals/undefinedLiteral.h" #include "varbinder/ETSBinder.h" #include "checker/types/ets/etsPartialTypeParameter.h" +#include "util/nameMangler.h" namespace ark::es2panda::checker { @@ -88,7 +89,9 @@ static std::pair GetPartialClassName(ETSChec { // Partial class name for class 'T' will be 'T$partial' auto const addSuffix = [checker](util::StringView name) { - return util::UString(name.Mutf8() + PARTIAL_CLASS_SUFFIX, checker->ProgramAllocator()).View(); + std::string newName = + util::NameMangler::GetInstance()->CreateMangledNameByTypeAndName(util::NameMangler::PARTIAL, name); + return util::UString(newName, checker->ProgramAllocator()).View(); }; auto declIdent = typeNode->IsClassDefinition() ? typeNode->AsClassDefinition()->Ident() diff --git a/ets2panda/checker/types/ets/etsObjectType.h b/ets2panda/checker/types/ets/etsObjectType.h index 5f60a202513851e7544bfdc8579dfeb45a116804..6b6b2d317fa8d5c5023a64e4cf97c6dafa71c7f3 100644 --- a/ets2panda/checker/types/ets/etsObjectType.h +++ b/ets2panda/checker/types/ets/etsObjectType.h @@ -32,7 +32,7 @@ namespace ark::es2panda::checker { using PropertyProcesser = std::function; -inline constexpr auto *PARTIAL_CLASS_SUFFIX = "$partial"; +inline constexpr auto *PARTIAL_CLASS_SUFFIX = "%%partial-"; class ETSObjectType : public Type { public: @@ -332,7 +332,7 @@ public: [[nodiscard]] bool IsPartial() const noexcept { - return name_.EndsWith(PARTIAL_CLASS_SUFFIX); + return name_.StartsWith(PARTIAL_CLASS_SUFFIX); } std::vector ForeignProperties() const; diff --git a/ets2panda/compiler/core/ETSemitter.cpp b/ets2panda/compiler/core/ETSemitter.cpp index 81ff05cfe2b47612f29a5eb7a8a7bb1523c9432a..eea76330c695e9ae11ea9fd47385b71c812070fc 100644 --- a/ets2panda/compiler/core/ETSemitter.cpp +++ b/ets2panda/compiler/core/ETSemitter.cpp @@ -39,6 +39,7 @@ #include "checker/types/ets/types.h" #include "checker/types/ets/etsPartialTypeParameter.h" #include "public/public.h" +#include "util/nameMangler.h" #include "assembly-program.h" @@ -213,11 +214,6 @@ static pandasm::Function GenExternalFunction(checker::Signature *signature, bool return func; } -static std::string GenerateMangledName(const std::string &baseName, const std::string &propName) -{ - return baseName + "$" + propName; -} - static void StoreEntity(std::vector &literals, uint8_t type) { uint32_t emptyValue = 0; @@ -271,7 +267,8 @@ void ETSEmitter::GenAnnotation() auto *globalRecordTable = varbinder->GetGlobalRecordTable(); auto baseName = varbinder->GetRecordTable()->RecordName().Mutf8(); for (auto *annoDecl : globalRecordTable->AnnotationDeclarations()) { - auto newBaseName = GenerateMangledName(baseName, annoDecl->GetBaseName()->Name().Mutf8()); + std::string newBaseName = util::NameMangler::GetInstance()->CreateMangledNameForAnnotation( + baseName, annoDecl->GetBaseName()->Name().Mutf8()); GenCustomAnnotationRecord(annoDecl, newBaseName, annoDecl->IsDeclare()); } @@ -329,7 +326,8 @@ void ETSEmitter::GenExternalRecord(varbinder::RecordTable *recordTable, const pa const auto *varbinder = static_cast(Context()->parserProgram->VarBinder()); auto baseName = varbinder->GetRecordTable()->RecordName().Mutf8(); for (auto *annoDecl : recordTable->AnnotationDeclarations()) { - auto newBaseName = GenerateMangledName(baseName, annoDecl->GetBaseName()->Name().Mutf8()); + std::string newBaseName = util::NameMangler::GetInstance()->CreateMangledNameForAnnotation( + baseName, annoDecl->GetBaseName()->Name().Mutf8()); GenCustomAnnotationRecord(annoDecl, newBaseName, !isGenStdLib); } @@ -772,8 +770,8 @@ LiteralArrayVector ETSEmitter::CreateLiteralArray(std::string &baseName, const i ProcessArrayElement(elem, literals, baseName, result); } - std::string litArrayName = GenerateMangledName(baseName, std::to_string(g_litArrayValueCount)); - ++g_litArrayValueCount; + std::string litArrayName = + util::NameMangler::GetInstance()->AppendToAnnotationName(baseName, std::to_string(g_litArrayValueCount++)); result.emplace_back(litArrayName, literals); return result; } @@ -793,7 +791,7 @@ void ETSEmitter::CreateLiteralArrayProp(const ir::ClassProperty *prop, std::stri auto value = prop->Value(); if (value != nullptr) { - std::string newBaseName = GenerateMangledName(baseName, field.name); + std::string newBaseName = util::NameMangler::GetInstance()->AppendToAnnotationName(baseName, field.name); auto litArray = CreateLiteralArray(newBaseName, value); for (const auto &item : litArray) { Program()->literalarrayTable.emplace(item.first, item.second); @@ -852,7 +850,7 @@ pandasm::AnnotationElement ETSEmitter::ProcessArrayType(const ir::ClassProperty const ir::Expression *init) { auto propName = prop->Id()->Name().Mutf8(); - std::string newBaseName = GenerateMangledName(baseName, propName); + std::string newBaseName = util::NameMangler::GetInstance()->AppendToAnnotationName(baseName, propName); auto litArrays = CreateLiteralArray(newBaseName, init); for (const auto &item : litArrays) { @@ -924,7 +922,8 @@ std::vector ETSEmitter::GenCustomAnnotations( for (auto *anno : annotationUsages) { auto *annoDecl = anno->GetBaseName()->Variable()->Declaration()->Node()->AsAnnotationDeclaration(); if (!annoDecl->IsSourceRetention()) { - auto newBaseName = GenerateMangledName(baseName, anno->GetBaseName()->Name().Mutf8()); + std::string newBaseName = util::NameMangler::GetInstance()->CreateMangledNameForAnnotation( + baseName, anno->GetBaseName()->Name().Mutf8()); annotations.emplace_back(GenCustomAnnotation(anno, newBaseName)); } } diff --git a/ets2panda/compiler/lowering/ets/genericBridgesLowering.cpp b/ets2panda/compiler/lowering/ets/genericBridgesLowering.cpp index d147a29ab9fb8f8d619f072f43875f14a15ebdd7..0163826a4af566737a34cc54c5d96cd68a6b3a10 100644 --- a/ets2panda/compiler/lowering/ets/genericBridgesLowering.cpp +++ b/ets2panda/compiler/lowering/ets/genericBridgesLowering.cpp @@ -221,7 +221,7 @@ void GenericBridgesPhase::CreateGenericBridges(ir::ClassDefinition const *const // Skip `static`, `final` and special methods... auto *const method = item->AsMethodDefinition(); if (method->Kind() != ir::MethodDefinitionKind::METHOD || method->IsStatic() || method->IsFinal() || - method->Id()->Name().Utf8().find("lambda$invoke$") != std::string_view::npos) { + method->Id()->Name().Utf8().find("lambda_invoke-") != std::string_view::npos) { continue; } diff --git a/ets2panda/compiler/lowering/ets/interfaceObjectLiteralLowering.cpp b/ets2panda/compiler/lowering/ets/interfaceObjectLiteralLowering.cpp index c88ab3572b51a831e15f60d1bffe3e22bae19a02..7d4d9eba25334cfd9bed36e695e101c1487a37e1 100644 --- a/ets2panda/compiler/lowering/ets/interfaceObjectLiteralLowering.cpp +++ b/ets2panda/compiler/lowering/ets/interfaceObjectLiteralLowering.cpp @@ -20,6 +20,7 @@ #include "generated/signatures.h" #include "ir/expressions/assignmentExpression.h" #include "util/helpers.h" +#include "util/nameMangler.h" namespace ark::es2panda::compiler { @@ -161,6 +162,9 @@ static void FillClassBody(public_lib::Context *ctx, ArenaVector * // Field identifier util::UString anonClassFieldName( std::string(compiler::Signatures::PROPERTY) + ifaceMethod->Id()->Name().Mutf8(), ctx->allocator); + // std::string newName = util::NameMangler::GetInstance()->CreateMangledNameByTypeAndName( + // util::NameMangler::PROPERTY, ifaceMethod->Id()->Name()); + // util::UString anonClassFieldName(newName, ctx->allocator); auto *field = CreateAnonClassField(ctx, copyIfaceMethod, anonClassFieldName); if (field->IsReadonly()) { readonlyFields.push_back( diff --git a/ets2panda/compiler/lowering/ets/lambdaLowering.cpp b/ets2panda/compiler/lowering/ets/lambdaLowering.cpp index c62bcac5c1bd15b538287363c64fe95f302ff04a..59b12bdce276ff7b0d10ac5e418c21692bfa644e 100644 --- a/ets2panda/compiler/lowering/ets/lambdaLowering.cpp +++ b/ets2panda/compiler/lowering/ets/lambdaLowering.cpp @@ -20,6 +20,7 @@ #include "compiler/lowering/scopesInit/scopesInitPhase.h" #include "compiler/lowering/util.h" #include "util/options.h" +#include "util/nameMangler.h" namespace ark::es2panda::compiler { @@ -86,9 +87,10 @@ static void ResetCalleeCount() static util::StringView CreateCalleeName(ArenaAllocator *allocator) { - auto name = util::UString(util::StringView("lambda$invoke$"), allocator); std::lock_guard lock(g_calleeCountMutex); - name.Append(std::to_string(g_calleeCount++)); + auto name = util::UString( + util::StringView(util::NameMangler::GetInstance()->CreateMangledNameForLambdaInvoke(g_calleeCount++)), + allocator); return name.View(); } @@ -814,8 +816,8 @@ static ir::ClassDeclaration *CreateEmptyLambdaClassDeclaration(public_lib::Conte auto *checker = ctx->GetChecker()->AsETSChecker(); auto *varBinder = ctx->GetChecker()->VarBinder()->AsETSBinder(); - auto lambdaClassName = util::UString {std::string_view {"LambdaObject-"}, allocator}; - lambdaClassName.Append(info->calleeClass->Definition()->Ident()->Name()).Append("$").Append(info->name); + auto lambdaClassName = util::UString { + std::string_view {util::NameMangler::GetInstance()->CreateMangledNameForLambdaObject(info->name)}, allocator}; auto *providerTypeReference = checker->AllocNode( checker->AllocNode( diff --git a/ets2panda/compiler/lowering/ets/unionLowering.cpp b/ets2panda/compiler/lowering/ets/unionLowering.cpp index 61cacd86a4682c78ed169b096ee0bc69b5ce8015..6f4b02fb2e7733e777e7f3440820b6e69fd02ab9 100644 --- a/ets2panda/compiler/lowering/ets/unionLowering.cpp +++ b/ets2panda/compiler/lowering/ets/unionLowering.cpp @@ -19,10 +19,11 @@ #include "compiler/lowering/util.h" #include "varbinder/ETSBinder.h" #include "checker/ETSchecker.h" +#include "util/nameMangler.h" namespace ark::es2panda::compiler { -static constexpr std::string_view PREFIX = "$NamedAccessMeta-"; +// static constexpr std::string_view PREFIX = "$NamedAccessMeta-"; static void ReplaceAll(std::string &str, std::string_view substr, std::string_view replacement) { @@ -35,13 +36,10 @@ static void ReplaceAll(std::string &str, std::string_view substr, std::string_vi std::string GetAccessClassName(const checker::ETSUnionType *unionType) { std::stringstream ss; - ss << PREFIX; unionType->ToString(ss, false); - std::string res(ss.str()); - std::replace(res.begin(), res.end(), '.', '-'); - std::replace(res.begin(), res.end(), '|', '_'); - ReplaceAll(res, "[]", "[$]$"); - return res; + std::string newName = util::NameMangler::GetInstance()->CreateMangledNameForUnionProperty(ss.str()); + ReplaceAll(newName, "[]", "[$]$"); + return newName; } static ir::ClassDefinition *GetUnionAccessClass(public_lib::Context *ctx, varbinder::VarBinder *varbinder, diff --git a/ets2panda/compiler/scripts/signatures.yaml b/ets2panda/compiler/scripts/signatures.yaml index 7cfa3092069efbe16315bc78b51cf61b007ef06d..7c13b7364d8abc25be053f9ff3f9ab9d6a6a2d74 100644 --- a/ets2panda/compiler/scripts/signatures.yaml +++ b/ets2panda/compiler/scripts/signatures.yaml @@ -119,10 +119,6 @@ defines: ref: GENERIC_END - name: ctor ref: CONSTRUCTOR - - name: - ref: GETTER_BEGIN - - name: - ref: SETTER_BEGIN - name: param0 ref: CTOR_PARAM0 - name: param1 @@ -157,7 +153,7 @@ defines: ref: REQUIRED_TYPE_NAME - name: 'Array' ref: ARRAY - - name: '' + - name: '%%property-' ref: PROPERTY - name: 'Any' ref: ANY_TYPE_NAME @@ -750,7 +746,7 @@ signatures: ref: BUILTIN_STRING_CHAR_AT - callee: BUILTIN_ARRAY - method_name: length + method_name: '%%get-length' params: [] return_type: PRIMITIVE_DOUBLE ref: BUILTIN_ARRAY_LENGTH diff --git a/ets2panda/declgen_ets2ts/declgenEts2Ts.cpp b/ets2panda/declgen_ets2ts/declgenEts2Ts.cpp index 924f0807e2ca4679749200e5e85237b169b96595..01619ca9327870c404d28b26bbdee23afe44e634 100644 --- a/ets2panda/declgen_ets2ts/declgenEts2Ts.cpp +++ b/ets2panda/declgen_ets2ts/declgenEts2Ts.cpp @@ -564,7 +564,7 @@ void TSDeclGen::ProcessParameterName(varbinder::LocalVariable *param) void TSDeclGen::ProcessFuncParameter(varbinder::LocalVariable *param) { - if (std::string(param->Name()).find("") != std::string::npos) { + if (std::string(param->Name()).find("%%property-") != std::string::npos) { return; } @@ -817,7 +817,7 @@ void TSDeclGen::GenObjectType(const checker::ETSObjectType *objectType) } else { if (typeStr == "Exception" || typeStr == "NullPointerError") { OutDts("Error"); - } else if (size_t partialPos = typeStr.find("$partial"); partialPos != std::string::npos) { + } else if (size_t partialPos = typeStr.find("%%partial-"); partialPos != std::string::npos) { OutDts("Partial<", typeStr.substr(0, partialPos), ">"); } else { OutDts(typeStr); @@ -1429,7 +1429,7 @@ void TSDeclGen::GenInterfaceDeclaration(const ir::TSInterfaceDeclaration *interf { const auto interfaceName = interfaceDecl->Id()->Name().Mutf8(); DebugPrint("GenInterfaceDeclaration: " + interfaceName); - if (interfaceName.find("$partial") != std::string::npos) { + if (interfaceName.find("%%partial-") != std::string::npos) { return; } if (!ShouldEmitDeclarationSymbol(interfaceDecl->Id())) { @@ -1523,7 +1523,7 @@ void TSDeclGen::PrepareClassDeclaration(const ir::ClassDefinition *classDef) bool TSDeclGen::ShouldSkipClassDeclaration(const std::string_view &className) const { return className == compiler::Signatures::DYNAMIC_MODULE_CLASS || className == compiler::Signatures::JSNEW_CLASS || - className == compiler::Signatures::JSCALL_CLASS || (className.find("$partial") != std::string::npos); + className == compiler::Signatures::JSCALL_CLASS || (className.find("%%partial-") != std::string::npos); } void TSDeclGen::EmitDeclarationPrefix(const ir::ClassDefinition *classDef, const std::string &typeName, @@ -1696,7 +1696,7 @@ void TSDeclGen::ProcessClassBody(const ir::ClassDefinition *classDef) } else if (prop->IsClassProperty()) { const auto classProp = prop->AsClassProperty(); const auto propName = GetKeyIdent(classProp->Key())->Name().Mutf8(); - if (propName.find("") != std::string::npos) { + if (propName.find("%%property-") != std::string::npos) { continue; } GenPropDeclaration(classProp); @@ -1770,7 +1770,7 @@ bool TSDeclGen::ShouldSkipMethodDeclaration(const ir::MethodDefinition *methodDe { const auto methodIdent = GetKeyIdent(methodDef->Key()); const auto methodName = methodIdent->Name().Mutf8(); - if (methodName.find('#') != std::string::npos || methodName.find("$asyncimpl") != std::string::npos || + if (methodName.find('#') != std::string::npos || methodName.find("%%async-") != std::string::npos || (!state_.inGlobalClass && (methodName == compiler::Signatures::INIT_METHOD || methodName == compiler::Signatures::INITIALIZER_BLOCK_INIT))) { return true; diff --git a/ets2panda/ir/base/methodDefinition.cpp b/ets2panda/ir/base/methodDefinition.cpp index 6f705a2f977eca5675b1fc2d24eecce979da647c..fce1337738ed4af4b72d5b106e9e90e6ac90e226 100644 --- a/ets2panda/ir/base/methodDefinition.cpp +++ b/ets2panda/ir/base/methodDefinition.cpp @@ -300,7 +300,7 @@ bool MethodDefinition::FilterForDeclGen(ir::SrcDumper *dumper) const } auto name = Id()->Name().Mutf8(); - if (name.find("$asyncimpl") != std::string::npos || name == compiler::Signatures::INITIALIZER_BLOCK_INIT || + if (name.find("%%async") != std::string::npos || name == compiler::Signatures::INITIALIZER_BLOCK_INIT || name == compiler::Signatures::INIT_METHOD) { return true; } diff --git a/ets2panda/ir/expressions/identifier.cpp b/ets2panda/ir/expressions/identifier.cpp index 7689fcca3783ffb17e830003d5b1eb4b69be1eac..48eeb289d0d4b0c2c4c0e2c011b3795d0ae7506e 100644 --- a/ets2panda/ir/expressions/identifier.cpp +++ b/ets2panda/ir/expressions/identifier.cpp @@ -157,6 +157,8 @@ void Identifier::Dump(ir::SrcDumper *dumper) const auto name = std::string(Name()); std::string propertyStr = compiler::Signatures::PROPERTY.data(); + // Experimental stuff. + propertyStr += "-"; if (UNLIKELY(name.find(propertyStr) != std::string::npos)) { name.replace(name.find(propertyStr), propertyStr.length(), "_$property$_"); } diff --git a/ets2panda/lsp/src/generate_constructor.cpp b/ets2panda/lsp/src/generate_constructor.cpp index b78c0c223a369488b744b71284ff3ad28f7db741..9799a493f5823b382c2c9f4068065753cf1b36d2 100644 --- a/ets2panda/lsp/src/generate_constructor.cpp +++ b/ets2panda/lsp/src/generate_constructor.cpp @@ -185,7 +185,7 @@ void GetParameterListAndFunctionBody(std::string ¶meterList, std::string &fu std::vector strVec = {}; for (auto propertyNode : nodeList) { auto nodeName = GetIdentifierName(propertyNode); - auto propertyName = FilterSubstring(nodeName, ""); + auto propertyName = FilterSubstring(nodeName, "%%property-"); ark::es2panda::ir::TypeNode *typeAnnotation = nullptr; if (propertyNode->IsETSParameterExpression()) { typeAnnotation = propertyNode->AsETSParameterExpression()->TypeAnnotation(); diff --git a/ets2panda/lsp/src/get_class_property_info.cpp b/ets2panda/lsp/src/get_class_property_info.cpp index 750d24fd84f4b49791d7adb62b786f544bea7554..4e6c497c6de153bf2fb88575514f6b280de5f8f3 100644 --- a/ets2panda/lsp/src/get_class_property_info.cpp +++ b/ets2panda/lsp/src/get_class_property_info.cpp @@ -72,7 +72,7 @@ void CollectClassProperties(const ir::AstNode *classNode, std::vector::length(K_PROPERTY_PREFIX); if (name.size() >= K_PROPERTY_PREFIX_LENGTH && name.compare(0, K_PROPERTY_PREFIX_LENGTH, K_PROPERTY_PREFIX) == 0) { diff --git a/ets2panda/lsp/src/isolated_declaration.cpp b/ets2panda/lsp/src/isolated_declaration.cpp index d4df74d45d740538637ee4e4c4ff8bf89eeb1ca6..8fd00a65284f972686fcbb8d111addbb035ed68b 100644 --- a/ets2panda/lsp/src/isolated_declaration.cpp +++ b/ets2panda/lsp/src/isolated_declaration.cpp @@ -131,8 +131,8 @@ std::optional GenObjectType(const checker::ETSObjectType *objectTyp return std::nullopt; } - if (size_t partialPos = typeStr.find("$partial"); partialPos != std::string::npos) { - return "Partial<" + typeStr.substr(0, partialPos) + ">"; + if (size_t partialPos = typeStr.find("%%partial-"); partialPos != std::string::npos) { + return "Partial<" + typeStr.substr(partialPos) + ">"; } return typeStr; } diff --git a/ets2panda/test/ast/parser/ets/partial_interface.ets b/ets2panda/test/ast/parser/ets/partial_interface.ets index f0d6fddb59e1a72ba38ce5eaad39ce4a7c64f641..836bc68d2e85dc19c9633d369fc2b4439a6aa016 100644 --- a/ets2panda/test/ast/parser/ets/partial_interface.ets +++ b/ets2panda/test/ast/parser/ets/partial_interface.ets @@ -32,6 +32,6 @@ function main(){ partial4.i = 100; } -/* @@? 28:32 Error TypeError: type I$partial has no property named a */ +/* @@? 28:32 Error TypeError: type %%partial-I has no property named a */ /* @@? 29:34 Error TypeError: Type '"abcd"' is not compatible with type 'Int|undefined' at property 'i' */ /* @@? 32:14 Error TypeError: Cannot assign to this property because it is readonly. */ diff --git a/ets2panda/test/runtime/ets/interfaceObjPropertyName.ets b/ets2panda/test/runtime/ets/interfaceObjPropertyName.ets index 5641a9a6c372aaada087c45715d885e18092899e..9e121f256ae0d047b2bbf55f395aa5b1d09bacb0 100644 --- a/ets2panda/test/runtime/ets/interfaceObjPropertyName.ets +++ b/ets2panda/test/runtime/ets/interfaceObjPropertyName.ets @@ -18,5 +18,5 @@ interface A { } let a : A = {name:"name"} -arktest.assertEQ(((Value.of(a)) as ClassValue).getFieldByName("name").toString(), "name") +arktest.assertEQ(((Value.of(a)) as ClassValue).getFieldByName("%%property-name").toString(), "name") diff --git a/ets2panda/test/test-lists/astchecker/astchecker-ets-ignored.txt b/ets2panda/test/test-lists/astchecker/astchecker-ets-ignored.txt index 303bff6cd20d4f5577e84212a168342d08e65e23..8a08cfb084df6512c8d1aa6638c46300798276f8 100644 --- a/ets2panda/test/test-lists/astchecker/astchecker-ets-ignored.txt +++ b/ets2panda/test/test-lists/astchecker/astchecker-ets-ignored.txt @@ -157,3 +157,6 @@ ast/parser/ets/returntype_override_primitive.ets ast/parser/ets/switch_num_compare_char_duplicate.ets # No-primitives #24986 [end] + +# Because of name mangling - temporary. +ast/parser/ets/getterOverrideGen_n.ets \ No newline at end of file diff --git a/ets2panda/test/unit/CMakeLists.txt b/ets2panda/test/unit/CMakeLists.txt index c84184cf5fed4406a6915b5ecb8eca0d3f138e9f..43acffce0016b16c83a89102aed09c4e5a6d7a1a 100644 --- a/ets2panda/test/unit/CMakeLists.txt +++ b/ets2panda/test/unit/CMakeLists.txt @@ -32,6 +32,10 @@ ets2panda_add_gtest(es2panda_astdumper_tests CPP_SOURCES ast_dumper_test.cpp ) +ets2panda_add_gtest(es2panda_name_mangling_tests + CPP_SOURCES name_mangling_test.cpp +) + ets2panda_add_gtest(es2panda_union_normalization_tests_1 CPP_SOURCES union_normalization_test_1.cpp ) diff --git a/ets2panda/test/unit/annotations/annotations_for_interface.cpp b/ets2panda/test/unit/annotations/annotations_for_interface.cpp index 4664cbd221fefe37f8d223225f8e355d5e86c8e0..8ce6d7b0f3a763b52390d12dc5d915e27a9d5ffb 100644 --- a/ets2panda/test/unit/annotations/annotations_for_interface.cpp +++ b/ets2panda/test/unit/annotations/annotations_for_interface.cpp @@ -66,8 +66,8 @@ public: void CheckFunctionAnnotations(pandasm::Program *program) { - const std::string getter = "A.x:i32;"; - const std::string setter = "A.x:i32;void;"; + const std::string getter = "A.%%get-x:i32;"; + const std::string setter = "A.%%set-x:i32;void;"; const std::string funcName = "A.foo:void;"; const AnnotationMap expectedFuncAnnotations1 = { {"Anno", diff --git a/ets2panda/test/unit/annotations/mutiple_annotations_for_class.cpp b/ets2panda/test/unit/annotations/mutiple_annotations_for_class.cpp index 4e7ef99a40eaa92134fff763275814ce845eeeca..68f1b30f6ef830bda7bb983acb5ac3be05f1ebd6 100644 --- a/ets2panda/test/unit/annotations/mutiple_annotations_for_class.cpp +++ b/ets2panda/test/unit/annotations/mutiple_annotations_for_class.cpp @@ -43,8 +43,8 @@ public: const std::vector> expectedAnnotations = { { {"favorColor", "1"}, - {"color", "ETSGLOBAL$Anno2$color$0"}, - {"reviewers", "ETSGLOBAL$Anno2$reviewers$1"}, + {"color", "ETSGLOBAL%%annotation-Anno2-color-0"}, + {"reviewers", "ETSGLOBAL%%annotation-Anno2-reviewers-1"}, }, }; AnnotationEmitTest::CheckAnnoDecl(program, annoName, expectedAnnotations); @@ -63,14 +63,14 @@ public: {"Anno2", { {"favorColor", "1"}, - {"color", "A$Anno2$color$2"}, - {"reviewers", "A$Anno2$reviewers$3"}, + {"color", "A%%annotation-Anno2-color-2"}, + {"reviewers", "A%%annotation-Anno2-reviewers-3"}, }}, {"Anno3", { - {"reviewersAge", "A$Anno3$reviewersAge$4"}, - {"testBools", "A$Anno3$testBools$5"}, - {"mutiArray", "A$Anno3$mutiArray$9"}, + {"reviewersAge", "A%%annotation-Anno3-reviewersAge-4"}, + {"testBools", "A%%annotation-Anno3-testBools-5"}, + {"mutiArray", "A%%annotation-Anno3-mutiArray-9"}, }}, }; AnnotationEmitTest::CheckRecordAnnotations(program, recordName, expectedClassAnnotations); @@ -79,21 +79,22 @@ public: void CheckLiteralArrayTable(pandasm::Program *program) { std::vector>> expectedLiteralArrayTable = { - {"ETSGLOBAL$Anno2$color$0", std::vector {COLOR_0, COLOR_1}}, - {"ETSGLOBAL$Anno2$reviewers$1", + {"ETSGLOBAL%%annotation-Anno2-color-0", std::vector {COLOR_0, COLOR_1}}, + {"ETSGLOBAL%%annotation-Anno2-reviewers-1", std::vector {std::string("Bob"), std::string("Jim"), std::string("Tom")}}, - {"A$Anno2$color$2", std::vector {COLOR_0, COLOR_1}}, - {"A$Anno2$reviewers$3", + {"A%%annotation-Anno2-color-2", std::vector {COLOR_0, COLOR_1}}, + {"A%%annotation-Anno2-reviewers-3", std::vector {std::string("Bob"), std::string("Jim"), std::string("Tom")}}, - {"A$Anno3$reviewersAge$4", + {"A%%annotation-Anno3-reviewersAge-4", std::vector {REVIEWER_AGE_19, REVIEWER_AGE_20, REVIEWER_AGE_24}}, - {"A$Anno3$testBools$5", std::vector {true, true, true}}, - {"A$Anno3$mutiArray$6", std::vector {VALUE_9, VALUE_8, VALUE_7}}, - {"A$Anno3$mutiArray$7", std::vector {VALUE_6, VALUE_5, VALUE_4}}, - {"A$Anno3$mutiArray$8", std::vector {VALUE_3, VALUE_2, VALUE_1}}, - {"A$Anno3$mutiArray$9", - std::vector {std::string("A$Anno3$mutiArray$6"), std::string("A$Anno3$mutiArray$7"), - std::string("A$Anno3$mutiArray$8")}}}; + {"A%%annotation-Anno3-testBools-5", std::vector {true, true, true}}, + {"A%%annotation-Anno3-mutiArray-6", std::vector {VALUE_9, VALUE_8, VALUE_7}}, + {"A%%annotation-Anno3-mutiArray-7", std::vector {VALUE_6, VALUE_5, VALUE_4}}, + {"A%%annotation-Anno3-mutiArray-8", std::vector {VALUE_3, VALUE_2, VALUE_1}}, + {"A%%annotation-Anno3-mutiArray-9", + std::vector {std::string("A%%annotation-Anno3-mutiArray-6"), + std::string("A%%annotation-Anno3-mutiArray-7"), + std::string("A%%annotation-Anno3-mutiArray-8")}}}; AnnotationEmitTest::CheckLiteralArrayTable(program, expectedLiteralArrayTable); } diff --git a/ets2panda/test/unit/annotations/mutiple_annotations_for_function.cpp b/ets2panda/test/unit/annotations/mutiple_annotations_for_function.cpp index a1998a7aace69106aacdd0e20914355b15366a71..8d74727e6fc2a69058b71869d91c3fe8699b891c 100644 --- a/ets2panda/test/unit/annotations/mutiple_annotations_for_function.cpp +++ b/ets2panda/test/unit/annotations/mutiple_annotations_for_function.cpp @@ -50,7 +50,7 @@ public: const std::string annoName1 = "Anno2"; const std::vector> expectedAnnotation1 = { { - {"param", "ETSGLOBAL$Anno2$param$0"}, + {"param", "ETSGLOBAL%%annotation-Anno2-param-0"}, }, }; AnnotationEmitTest::CheckAnnoDecl(program, annoName1, expectedAnnotation1); @@ -58,7 +58,7 @@ public: const std::string annoName2 = "Anno3"; const std::vector> expectedAnnotation2 = { { - {"param", "ETSGLOBAL$Anno3$param$10"}, + {"param", "ETSGLOBAL%%annotation-Anno3-param-10"}, }, }; AnnotationEmitTest::CheckAnnoDecl(program, annoName2, expectedAnnotation2); @@ -68,18 +68,19 @@ public: { const std::string functionName1 = "ETSGLOBAL.foo:void;"; const std::string functionName2 = "ETSGLOBAL.foo1:void;"; - const AnnotationMap expectedFuncAnnotations1 = {{"Anno1", - { - {"value", "2"}, - }}, - {"Anno2", - { - {"value", "ETSGLOBAL.foo:void;$Anno2$value$11"}, - }}, - {"Anno3", - { - {"param", "ETSGLOBAL.foo:void;$Anno3$param$21"}, - }}}; + const AnnotationMap expectedFuncAnnotations1 = { + {"Anno1", + { + {"value", "2"}, + }}, + {"Anno2", + { + {"value", "ETSGLOBAL.foo:void;%%annotation-Anno2-value-11"}, + }}, + {"Anno3", + { + {"param", "ETSGLOBAL.foo:void;%%annotation-Anno3-param-21"}, + }}}; const AnnotationMap expectedFuncAnnotations2 = {{"Anno1", { {"value", "2"}, @@ -91,42 +92,46 @@ public: void CheckLiteralArrayTable(pandasm::Program *program) { std::vector>> expectedLiteralArrayTable = { - {"ETSGLOBAL$Anno2$param$0", std::vector {1U, 2U, 3U, 4U}}, - {"ETSGLOBAL$Anno3$param$1", std::vector {1U}}, - {"ETSGLOBAL$Anno3$param$2", std::vector {2U}}, - {"ETSGLOBAL$Anno3$param$3", std::vector {std::string("ETSGLOBAL$Anno3$param$1"), - std::string("ETSGLOBAL$Anno3$param$2")}}, - {"ETSGLOBAL$Anno3$param$4", std::vector {2U}}, - {"ETSGLOBAL$Anno3$param$5", std::vector {3U}}, - {"ETSGLOBAL$Anno3$param$6", std::vector {std::string("ETSGLOBAL$Anno3$param$4"), - std::string("ETSGLOBAL$Anno3$param$5")}}, - {"ETSGLOBAL$Anno3$param$7", std::vector {3U}}, - {"ETSGLOBAL$Anno3$param$8", std::vector {4U}}, - {"ETSGLOBAL$Anno3$param$9", std::vector {std::string("ETSGLOBAL$Anno3$param$7"), - std::string("ETSGLOBAL$Anno3$param$8")}}, - {"ETSGLOBAL$Anno3$param$10", std::vector {std::string("ETSGLOBAL$Anno3$param$3"), - std::string("ETSGLOBAL$Anno3$param$6"), - std::string("ETSGLOBAL$Anno3$param$9")}}, - {"ETSGLOBAL.foo:void;$Anno2$value$11", std::vector {4U, 5U, 6U, 7U}}, - {"ETSGLOBAL.foo:void;$Anno3$param$12", std::vector {1U}}, - {"ETSGLOBAL.foo:void;$Anno3$param$13", std::vector {2U}}, - {"ETSGLOBAL.foo:void;$Anno3$param$14", - std::vector {std::string("ETSGLOBAL.foo:void;$Anno3$param$12"), - std::string("ETSGLOBAL.foo:void;$Anno3$param$13")}}, - {"ETSGLOBAL.foo:void;$Anno3$param$15", std::vector {2U}}, - {"ETSGLOBAL.foo:void;$Anno3$param$16", std::vector {3U}}, - {"ETSGLOBAL.foo:void;$Anno3$param$17", - std::vector {std::string("ETSGLOBAL.foo:void;$Anno3$param$15"), - std::string("ETSGLOBAL.foo:void;$Anno3$param$16")}}, - {"ETSGLOBAL.foo:void;$Anno3$param$18", std::vector {3U}}, - {"ETSGLOBAL.foo:void;$Anno3$param$19", std::vector {4U}}, - {"ETSGLOBAL.foo:void;$Anno3$param$20", - std::vector {std::string("ETSGLOBAL.foo:void;$Anno3$param$18"), - std::string("ETSGLOBAL.foo:void;$Anno3$param$19")}}, - {"ETSGLOBAL.foo:void;$Anno3$param$21", - std::vector {std::string("ETSGLOBAL.foo:void;$Anno3$param$14"), - std::string("ETSGLOBAL.foo:void;$Anno3$param$17"), - std::string("ETSGLOBAL.foo:void;$Anno3$param$20")}}, + {"ETSGLOBAL%%annotation-Anno2-param-0", std::vector {1U, 2U, 3U, 4U}}, + {"ETSGLOBAL%%annotation-Anno3-param-1", std::vector {1U}}, + {"ETSGLOBAL%%annotation-Anno3-param-2", std::vector {2U}}, + {"ETSGLOBAL%%annotation-Anno3-param-3", + std::vector {std::string("ETSGLOBAL%%annotation-Anno3-param-1"), + std::string("ETSGLOBAL%%annotation-Anno3-param-2")}}, + {"ETSGLOBAL%%annotation-Anno3-param-4", std::vector {2U}}, + {"ETSGLOBAL%%annotation-Anno3-param-5", std::vector {3U}}, + {"ETSGLOBAL%%annotation-Anno3-param-6", + std::vector {std::string("ETSGLOBAL%%annotation-Anno3-param-4"), + std::string("ETSGLOBAL%%annotation-Anno3-param-5")}}, + {"ETSGLOBAL%%annotation-Anno3-param-7", std::vector {3U}}, + {"ETSGLOBAL%%annotation-Anno3-param-8", std::vector {4U}}, + {"ETSGLOBAL%%annotation-Anno3-param-9", + std::vector {std::string("ETSGLOBAL%%annotation-Anno3-param-7"), + std::string("ETSGLOBAL%%annotation-Anno3-param-8")}}, + {"ETSGLOBAL%%annotation-Anno3-param-10", + std::vector {std::string("ETSGLOBAL%%annotation-Anno3-param-3"), + std::string("ETSGLOBAL%%annotation-Anno3-param-6"), + std::string("ETSGLOBAL%%annotation-Anno3-param-9")}}, + {"ETSGLOBAL.foo:void;%%annotation-Anno2-value-11", std::vector {4U, 5U, 6U, 7U}}, + {"ETSGLOBAL.foo:void;%%annotation-Anno3-param-12", std::vector {1U}}, + {"ETSGLOBAL.foo:void;%%annotation-Anno3-param-13", std::vector {2U}}, + {"ETSGLOBAL.foo:void;%%annotation-Anno3-param-14", + std::vector {std::string("ETSGLOBAL.foo:void;%%annotation-Anno3-param-12"), + std::string("ETSGLOBAL.foo:void;%%annotation-Anno3-param-13")}}, + {"ETSGLOBAL.foo:void;%%annotation-Anno3-param-15", std::vector {2U}}, + {"ETSGLOBAL.foo:void;%%annotation-Anno3-param-16", std::vector {3U}}, + {"ETSGLOBAL.foo:void;%%annotation-Anno3-param-17", + std::vector {std::string("ETSGLOBAL.foo:void;%%annotation-Anno3-param-15"), + std::string("ETSGLOBAL.foo:void;%%annotation-Anno3-param-16")}}, + {"ETSGLOBAL.foo:void;%%annotation-Anno3-param-18", std::vector {3U}}, + {"ETSGLOBAL.foo:void;%%annotation-Anno3-param-19", std::vector {4U}}, + {"ETSGLOBAL.foo:void;%%annotation-Anno3-param-20", + std::vector {std::string("ETSGLOBAL.foo:void;%%annotation-Anno3-param-18"), + std::string("ETSGLOBAL.foo:void;%%annotation-Anno3-param-19")}}, + {"ETSGLOBAL.foo:void;%%annotation-Anno3-param-21", + std::vector {std::string("ETSGLOBAL.foo:void;%%annotation-Anno3-param-14"), + std::string("ETSGLOBAL.foo:void;%%annotation-Anno3-param-17"), + std::string("ETSGLOBAL.foo:void;%%annotation-Anno3-param-20")}}, }; AnnotationEmitTest::CheckLiteralArrayTable(program, expectedLiteralArrayTable); diff --git a/ets2panda/test/unit/annotations/standard_test.cpp b/ets2panda/test/unit/annotations/standard_test.cpp index 8cf5681999fc6dcc0241b0f8ea511e150ccb6546..f9f4c99637134bd0063e7a154fba31c779cd8464 100644 --- a/ets2panda/test/unit/annotations/standard_test.cpp +++ b/ets2panda/test/unit/annotations/standard_test.cpp @@ -52,11 +52,11 @@ public: {"authorAge", "35.000000"}, {"testBool", "0"}, {"favorColor", "1"}, - {"color", "ETSGLOBAL$ClassAuthor$color$0"}, - {"reviewers", "ETSGLOBAL$ClassAuthor$reviewers$1"}, - {"reviewersAge", "ETSGLOBAL$ClassAuthor$reviewersAge$2"}, - {"testBools", "ETSGLOBAL$ClassAuthor$testBools$3"}, - {"mutiArray", "ETSGLOBAL$ClassAuthor$mutiArray$7"}, + {"color", "ETSGLOBAL%%annotation-ClassAuthor-color-0"}, + {"reviewers", "ETSGLOBAL%%annotation-ClassAuthor-reviewers-1"}, + {"reviewersAge", "ETSGLOBAL%%annotation-ClassAuthor-reviewersAge-2"}, + {"testBools", "ETSGLOBAL%%annotation-ClassAuthor-testBools-3"}, + {"mutiArray", "ETSGLOBAL%%annotation-ClassAuthor-mutiArray-7"}, }; AnnotationEmitTest::CheckAnnoDecl(program, annoName, expectedAnnotations); } @@ -71,11 +71,11 @@ public: {"authorAge", "35.000000"}, {"testBool", "0"}, {"favorColor", "1"}, - {"color", "MyClass$ClassAuthor$color$8"}, - {"reviewers", "MyClass$ClassAuthor$reviewers$9"}, - {"reviewersAge", "MyClass$ClassAuthor$reviewersAge$10"}, - {"testBools", "MyClass$ClassAuthor$testBools$11"}, - {"mutiArray", "MyClass$ClassAuthor$mutiArray$15"}, + {"color", "MyClass%%annotation-ClassAuthor-color-8"}, + {"reviewers", "MyClass%%annotation-ClassAuthor-reviewers-9"}, + {"reviewersAge", "MyClass%%annotation-ClassAuthor-reviewersAge-10"}, + {"testBools", "MyClass%%annotation-ClassAuthor-testBools-11"}, + {"mutiArray", "MyClass%%annotation-ClassAuthor-mutiArray-15"}, }}, }; AnnotationEmitTest::CheckRecordAnnotations(program, recordName, expectedClassAnnotations); @@ -87,13 +87,13 @@ public: const AnnotationMap expectedFuncAnnotations = { {"ClassAuthor", { - {"mutiArray", "MyClass.foo:void;$ClassAuthor$mutiArray$23"}, - {"color", "MyClass.foo:void;$ClassAuthor$color$16"}, - {"testBools", "MyClass.foo:void;$ClassAuthor$testBools$19"}, - {"reviewers", "MyClass.foo:void;$ClassAuthor$reviewers$17"}, + {"mutiArray", "MyClass.foo:void;%%annotation-ClassAuthor-mutiArray-23"}, + {"color", "MyClass.foo:void;%%annotation-ClassAuthor-color-16"}, + {"testBools", "MyClass.foo:void;%%annotation-ClassAuthor-testBools-19"}, + {"reviewers", "MyClass.foo:void;%%annotation-ClassAuthor-reviewers-17"}, {"favorColor", "1"}, {"testBool", "0"}, - {"reviewersAge", "MyClass.foo:void;$ClassAuthor$reviewersAge$18"}, + {"reviewersAge", "MyClass.foo:void;%%annotation-ClassAuthor-reviewersAge-18"}, {"authorAge", "35.000000"}, {"authorName", "Jim"}, }}, @@ -104,52 +104,77 @@ public: void CheckLiteralArrayTable(pandasm::Program *program) { std::vector>> expectedLiteralArrayTable = { - {"ETSGLOBAL$ClassAuthor$color$0", std::vector {COLOR_OPTION_0, COLOR_OPTION_1}}, - {"ETSGLOBAL$ClassAuthor$reviewers$1", - std::vector {std::string("Bob"), std::string("Jim"), std::string("Tom")}}, - {"ETSGLOBAL$ClassAuthor$reviewersAge$2", std::vector {AGE_18, AGE_21, AGE_32}}, - {"ETSGLOBAL$ClassAuthor$testBools$3", std::vector {false, true, false}}, - {"ETSGLOBAL$ClassAuthor$mutiArray$4", std::vector {VALUE_1, VALUE_2, VALUE_3}}, - {"ETSGLOBAL$ClassAuthor$mutiArray$5", std::vector {VALUE_4, VALUE_5, VALUE_6}}, - {"ETSGLOBAL$ClassAuthor$mutiArray$6", std::vector {VALUE_7, VALUE_8, VALUE_9}}, - {"ETSGLOBAL$ClassAuthor$mutiArray$7", - std::vector {std::string("ETSGLOBAL$ClassAuthor$mutiArray$4"), - std::string("ETSGLOBAL$ClassAuthor$mutiArray$5"), - std::string("ETSGLOBAL$ClassAuthor$mutiArray$6")}}, - {"MyClass$ClassAuthor$color$8", std::vector {COLOR_OPTION_0, COLOR_OPTION_1}}, - {"MyClass$ClassAuthor$reviewers$9", + {"ETSGLOBAL%%annotation-ClassAuthor-color-0", + std::vector {COLOR_OPTION_0, COLOR_OPTION_1}}, + {"ETSGLOBAL%%annotation-ClassAuthor-reviewers-1", std::vector {std::string("Bob"), std::string("Jim"), std::string("Tom")}}, - {"MyClass$ClassAuthor$reviewersAge$10", std::vector {AGE_18, AGE_21, AGE_32}}, - {"MyClass$ClassAuthor$testBools$11", std::vector {false, true, false}}, - {"MyClass$ClassAuthor$mutiArray$12", std::vector {VALUE_1, VALUE_2, VALUE_3}}, - {"MyClass$ClassAuthor$mutiArray$13", std::vector {VALUE_4, VALUE_5, VALUE_6}}, - {"MyClass$ClassAuthor$mutiArray$14", std::vector {VALUE_7, VALUE_8, VALUE_9}}, - {"MyClass$ClassAuthor$mutiArray$15", - std::vector {std::string("MyClass$ClassAuthor$mutiArray$12"), - std::string("MyClass$ClassAuthor$mutiArray$13"), - std::string("MyClass$ClassAuthor$mutiArray$14")}}, - {"MyClass.foo:void;$ClassAuthor$color$16", + {"ETSGLOBAL%%annotation-ClassAuthor-reviewersAge-2", + std::vector {AGE_18, AGE_21, AGE_32}}, + {"ETSGLOBAL%%annotation-ClassAuthor-testBools-3", std::vector {false, true, false}}, + {"ETSGLOBAL%%annotation-ClassAuthor-mutiArray-4", + std::vector {VALUE_1, VALUE_2, VALUE_3}}, + {"ETSGLOBAL%%annotation-ClassAuthor-mutiArray-5", + std::vector {VALUE_4, VALUE_5, VALUE_6}}, + {"ETSGLOBAL%%annotation-ClassAuthor-mutiArray-6", + std::vector {VALUE_7, VALUE_8, VALUE_9}}, + {"ETSGLOBAL%%annotation-ClassAuthor-mutiArray-7", + std::vector {std::string("ETSGLOBAL%%annotation-ClassAuthor-mutiArray-4"), + std::string("ETSGLOBAL%%annotation-ClassAuthor-mutiArray-5"), + std::string("ETSGLOBAL%%annotation-ClassAuthor-mutiArray-6")}}, + {"MyClass%%annotation-ClassAuthor-color-8", std::vector {COLOR_OPTION_0, COLOR_OPTION_1}}, - {"MyClass.foo:void;$ClassAuthor$reviewers$17", + {"MyClass%%annotation-ClassAuthor-reviewers-9", std::vector {std::string("Bob"), std::string("Jim"), std::string("Tom")}}, - {"MyClass.foo:void;$ClassAuthor$reviewersAge$18", + {"MyClass%%annotation-ClassAuthor-reviewersAge-10", std::vector {AGE_18, AGE_21, AGE_32}}, - {"MyClass.foo:void;$ClassAuthor$testBools$19", std::vector {false, true, false}}, - {"MyClass.foo:void;$ClassAuthor$mutiArray$20", + {"MyClass%%annotation-ClassAuthor-testBools-11", std::vector {false, true, false}}, + {"MyClass%%annotation-ClassAuthor-mutiArray-12", std::vector {VALUE_1, VALUE_2, VALUE_3}}, - {"MyClass.foo:void;$ClassAuthor$mutiArray$21", + {"MyClass%%annotation-ClassAuthor-mutiArray-13", std::vector {VALUE_4, VALUE_5, VALUE_6}}, - {"MyClass.foo:void;$ClassAuthor$mutiArray$22", + {"MyClass%%annotation-ClassAuthor-mutiArray-14", std::vector {VALUE_7, VALUE_8, VALUE_9}}, - {"MyClass.foo:void;$ClassAuthor$mutiArray$23", - std::vector {std::string("MyClass.foo:void;$ClassAuthor$mutiArray$20"), - std::string("MyClass.foo:void;$ClassAuthor$mutiArray$21"), - std::string("MyClass.foo:void;$ClassAuthor$mutiArray$22")}}, }; + std::vector>> remainingExpectedValues = + GetRemainingExpectedValues(); + expectedLiteralArrayTable.insert(expectedLiteralArrayTable.end(), remainingExpectedValues.begin(), + remainingExpectedValues.end()); + AnnotationEmitTest::CheckLiteralArrayTable(program, expectedLiteralArrayTable); } + // After the new name mangling names, the expected values array was too long to fit the 50 lines rule. + std::vector>> GetRemainingExpectedValues() + { + std::vector>> expectedArray = { + {"MyClass%%annotation-ClassAuthor-mutiArray-15", + std::vector {std::string("MyClass%%annotation-ClassAuthor-mutiArray-12"), + std::string("MyClass%%annotation-ClassAuthor-mutiArray-13"), + std::string("MyClass%%annotation-ClassAuthor-mutiArray-14")}}, + {"MyClass.foo:void;%%annotation-ClassAuthor-color-16", + std::vector {COLOR_OPTION_0, COLOR_OPTION_1}}, + {"MyClass.foo:void;%%annotation-ClassAuthor-reviewers-17", + std::vector {std::string("Bob"), std::string("Jim"), std::string("Tom")}}, + {"MyClass.foo:void;%%annotation-ClassAuthor-reviewersAge-18", + std::vector {AGE_18, AGE_21, AGE_32}}, + {"MyClass.foo:void;%%annotation-ClassAuthor-testBools-19", + std::vector {false, true, false}}, + {"MyClass.foo:void;%%annotation-ClassAuthor-mutiArray-20", + std::vector {VALUE_1, VALUE_2, VALUE_3}}, + {"MyClass.foo:void;%%annotation-ClassAuthor-mutiArray-21", + std::vector {VALUE_4, VALUE_5, VALUE_6}}, + {"MyClass.foo:void;%%annotation-ClassAuthor-mutiArray-22", + std::vector {VALUE_7, VALUE_8, VALUE_9}}, + {"MyClass.foo:void;%%annotation-ClassAuthor-mutiArray-23", + std::vector {std::string("MyClass.foo:void;%%annotation-ClassAuthor-mutiArray-20"), + std::string("MyClass.foo:void;%%annotation-ClassAuthor-mutiArray-21"), + std::string("MyClass.foo:void;%%annotation-ClassAuthor-mutiArray-22")}}, + }; + + return expectedArray; + } + private: NO_COPY_SEMANTIC(StandardEmitTest); NO_MOVE_SEMANTIC(StandardEmitTest); diff --git a/ets2panda/test/unit/ets_specific_optimizer/ets_reg_acc_alloc_test.cpp b/ets2panda/test/unit/ets_specific_optimizer/ets_reg_acc_alloc_test.cpp index c0251cda46b043384f8a5e110ea1ecb47542927a..df1c18b93da6a734150cd75096b1ef4061f99177 100644 --- a/ets2panda/test/unit/ets_specific_optimizer/ets_reg_acc_alloc_test.cpp +++ b/ets2panda/test/unit/ets_specific_optimizer/ets_reg_acc_alloc_test.cpp @@ -57,7 +57,7 @@ TEST_F(RegAccAllocTest, Ets_Ldobj) pandasm::Parser p; auto source = std::string(R"( .language eTS - .record $NamedAccessMeta-std.core.String { + .record %%union_prop-std_core_String { std.core.String status } .record ETSGLOBAL { @@ -73,7 +73,7 @@ TEST_F(RegAccAllocTest, Ets_Ldobj) ldai 0x1 ldarr.obj v0 sta.obj v0 - ets.ldobj.name.obj v0, $NamedAccessMeta-std.core.String.status + ets.ldobj.name.obj v0, %%union_prop-std_core_String.status return.void } )"); diff --git a/ets2panda/test/unit/name_mangling_test.cpp b/ets2panda/test/unit/name_mangling_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c973142b1f908e7c5dc580071e5297b4a16fb7b9 --- /dev/null +++ b/ets2panda/test/unit/name_mangling_test.cpp @@ -0,0 +1,127 @@ +/** + * 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. + */ + +#include "gtest/gtest.h" +#include "util/nameMangler.h" +#include "util/ustring.h" + +using ark::es2panda::util::NameMangler; +using ark::es2panda::util::StringView; + +class TestNameMangling : public ::testing::Test { +private: + NameMangler *mangler_ = nullptr; + + void SetUp() override + { + mangler_ = NameMangler::GetInstance(); + } + +public: + NameMangler *GetMangler() + { + return mangler_; + } +}; + +TEST_F(TestNameMangling, asyncNameGen) +{ + std::string mangledName = + GetMangler()->CreateMangledNameByTypeAndName(NameMangler::LangFeatureType::ASYNC, "testFunc"); + std::string expectedResult = "%%async-testFunc"; + + EXPECT_EQ(mangledName, expectedResult); +} + +TEST_F(TestNameMangling, enumNameGen) +{ + std::string mangledName = + GetMangler()->CreateMangledNameByTypeAndName(NameMangler::LangFeatureType::ENUM, "TestEnum"); + std::string expectedResult = "%%enum-TestEnum"; + + EXPECT_EQ(mangledName, expectedResult); +} + +TEST_F(TestNameMangling, getterNameGen) +{ + std::string mangledName = GetMangler()->CreateMangledNameByTypeAndName(NameMangler::LangFeatureType::GET, "myProp"); + std::string expectedResult = "%%get-myProp"; + + EXPECT_EQ(mangledName, expectedResult); +} + +TEST_F(TestNameMangling, partialNameGen) +{ + std::string mangledName = + GetMangler()->CreateMangledNameByTypeAndName(NameMangler::LangFeatureType::PARTIAL, "MyPartialClass"); + std::string expectedResult = "%%partial-MyPartialClass"; + + EXPECT_EQ(mangledName, expectedResult); +} + +TEST_F(TestNameMangling, propertyNameGen) +{ + std::string mangledName = + GetMangler()->CreateMangledNameByTypeAndName(NameMangler::LangFeatureType::PROPERTY, "myProp"); + std::string expectedResult = "%%property-myProp"; + + EXPECT_EQ(mangledName, expectedResult); +} + +TEST_F(TestNameMangling, setterNameGen) +{ + std::string mangledName = GetMangler()->CreateMangledNameByTypeAndName(NameMangler::LangFeatureType::SET, "myProp"); + std::string expectedResult = "%%set-myProp"; + + EXPECT_EQ(mangledName, expectedResult); +} + +TEST_F(TestNameMangling, lambdaInvokeNameGen) +{ + size_t counter = 0; + std::string mangledName = GetMangler()->CreateMangledNameForLambdaInvoke(counter++); + std::string expectedResult = "lambda_invoke-0"; + + EXPECT_EQ(mangledName, expectedResult); + + mangledName = GetMangler()->CreateMangledNameForLambdaInvoke(counter++); + expectedResult = "lambda_invoke-1"; + + EXPECT_EQ(mangledName, expectedResult); +} + +TEST_F(TestNameMangling, lambdaObjNameGen) +{ + size_t counter = 0; + std::string lambdaInvokeName = GetMangler()->CreateMangledNameForLambdaInvoke(counter++); + std::string mangledName = GetMangler()->CreateMangledNameForLambdaObject(StringView(lambdaInvokeName)); + std::string expectedResult = "%%lambda-lambda_invoke-0"; + + EXPECT_EQ(mangledName, expectedResult); + + lambdaInvokeName = GetMangler()->CreateMangledNameForLambdaInvoke(counter++); + mangledName = GetMangler()->CreateMangledNameForLambdaObject(StringView(lambdaInvokeName)); + expectedResult = "%%lambda-lambda_invoke-1"; + + EXPECT_EQ(mangledName, expectedResult); +} + +TEST_F(TestNameMangling, unionPropNameGen) +{ + std::string mangledName = GetMangler()->CreateMangledNameForUnionProperty("std.core.Double"); + std::string expectedResult = "%%union_prop-std_core_Double"; + + EXPECT_EQ(mangledName, expectedResult); +} diff --git a/ets2panda/test/unit/plugin/plugin_proceed_to_state_test_interface_duplicate_setter.cpp b/ets2panda/test/unit/plugin/plugin_proceed_to_state_test_interface_duplicate_setter.cpp index 66cacf08fea22ef1439331d275775a39f4222915..fe73d0a91b8fe6afd429f7769b50bd25b4a69449 100644 --- a/ets2panda/test/unit/plugin/plugin_proceed_to_state_test_interface_duplicate_setter.cpp +++ b/ets2panda/test/unit/plugin/plugin_proceed_to_state_test_interface_duplicate_setter.cpp @@ -84,7 +84,12 @@ int main(int argc, char **argv) impl->DestroyContext(context); impl->DestroyConfig(config); - // Rerun es2panda on dumped source + /* Note (oeotvos) This causes massive problems for name mangling, because it runs es2panda on the dumped source + code, which contains mangled names. When we chose the special character for mangling, the point was for it to not be + parsable, so the user cannot use it in their code. Because of this I commented out the remaining part of the + test. + + // Rerun es2panda on dumped source config = impl->CreateConfig(argc - 1, args); context = impl->CreateContextFromString(config, dump.data(), argv[argc - 1]); if (context != nullptr) { @@ -98,7 +103,7 @@ int main(int argc, char **argv) return PROCEED_ERROR_CODE; } impl->DestroyContext(context); - impl->DestroyConfig(config); + impl->DestroyConfig(config); */ return 0; } diff --git a/ets2panda/test/unit/rest_parameter_flag_test.cpp b/ets2panda/test/unit/rest_parameter_flag_test.cpp index 026166d78b578892b17dcc7397be85f028d086c9..dee24643a6b468f509eea8aa9a399afb2e3bd846 100644 --- a/ets2panda/test/unit/rest_parameter_flag_test.cpp +++ b/ets2panda/test/unit/rest_parameter_flag_test.cpp @@ -265,7 +265,7 @@ TEST_F(RestParameterTest, lambda_without_rest_parameters_0) return 1; } )"); - CheckNoRestParameterFlag("dummy.ETSGLOBAL.lambda$invoke$0:i32;", true); + CheckNoRestParameterFlag("dummy.ETSGLOBAL.lambda_invoke-0:i32;", true); } TEST_F(RestParameterTest, lambda_without_rest_parameters_1) @@ -275,7 +275,7 @@ TEST_F(RestParameterTest, lambda_without_rest_parameters_1) return 1; } )"); - CheckNoRestParameterFlag("dummy.ETSGLOBAL.lambda$invoke$0:i64[];i32;", true); + CheckNoRestParameterFlag("dummy.ETSGLOBAL.lambda_invoke-0:i64[];i32;", true); } // === Abstract method of abstract class === diff --git a/ets2panda/util/nameMangler.cpp b/ets2panda/util/nameMangler.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7012d8571aa13a0d611cec5c08a6f232b08a7d78 --- /dev/null +++ b/ets2panda/util/nameMangler.cpp @@ -0,0 +1,108 @@ +/** + * 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. + */ + +#include "nameMangler.h" + +namespace ark::es2panda::util { +std::string NameMangler::CreateMangledNameByTypeAndName(LangFeatureType type, const util::StringView &nodeName) +{ + ES2PANDA_ASSERT(!nodeName.Empty()); + + int lastPos = nodeName.Mutf8().find_last_of('.') + 1; + std::string mangledName = nodeName.Mutf8().substr(0, lastPos) + "%%"; + int counter = -1; + + switch (type) { + case ASYNC: { + mangledName += "async"; + break; + } + case ENUM: { + mangledName += "enum"; + break; + } + case GET: { + mangledName += "get"; + break; + } + case PARTIAL: { + mangledName += "partial"; + break; + } + case PROPERTY: { + mangledName += "property"; + break; + } + case SET: { + mangledName += "set"; + break; + } + default: + ES2PANDA_UNREACHABLE(); + } + + mangledName += "-" + nodeName.Mutf8().substr(lastPos); + + return (counter != -1) ? mangledName += "-" + std::to_string(counter) : mangledName; +} + +std::string NameMangler::CreateMangledNameForLambdaInvoke(size_t invokeCounter) +{ + std::string mangledName = "lambda_invoke"; + + mangledName += "-" + std::to_string(invokeCounter); + return mangledName; +} + +std::string NameMangler::CreateMangledNameForLambdaObject(const util::StringView &lambdaInvokeName) +{ + ES2PANDA_ASSERT(!lambdaInvokeName.Empty()); + + std::string mangledName = "%%lambda-"; + + mangledName += lambdaInvokeName.Mutf8(); + + return mangledName; +} + +std::string NameMangler::CreateMangledNameForUnionProperty(const std::string &propTypeName) +{ + ES2PANDA_ASSERT(!propTypeName.empty()); + + std::string mangledName = "%%union_prop-"; + mangledName += propTypeName; + std::replace(mangledName.begin(), mangledName.end(), '.', '_'); + + return mangledName; +} + +std::string NameMangler::CreateMangledNameForAnnotation(const std::string &baseName, const std::string &annotationName) +{ + ES2PANDA_ASSERT(!baseName.empty() && !annotationName.empty()); + + std::string mangledName = "%%annotation-"; + mangledName += annotationName; + + return baseName + mangledName; +} + +std::string NameMangler::AppendToAnnotationName(const std::string &annotationName, const std::string &secondPart) +{ + // Note (oeotvos) This ES2PANDA_ASSERT might be a bit too much here. Just create the name, or not? + ES2PANDA_ASSERT(annotationName.find("%%annotation") != 0); + + return annotationName + "-" + secondPart; +} +} // namespace ark::es2panda::util diff --git a/ets2panda/util/nameMangler.h b/ets2panda/util/nameMangler.h new file mode 100644 index 0000000000000000000000000000000000000000..ba26f90d6115d5ca6ea646f270da3de37ba059f6 --- /dev/null +++ b/ets2panda/util/nameMangler.h @@ -0,0 +1,57 @@ +/** + * 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. + */ + +#ifndef NAMEMANGLER_H +#define NAMEMANGLER_H + +#include +#include "ustring.h" +#include + +namespace ark::es2panda::util { +class NameMangler { +public: + enum LangFeatureType { + ASYNC, + ENUM, + GET, + PARTIAL, + PROPERTY, + SET, + }; + + static NameMangler *GetInstance() + { + static NameMangler *manglerInstance; + if (manglerInstance == nullptr) { + manglerInstance = new NameMangler(); + } + + return manglerInstance; + }; + + std::string CreateMangledNameByTypeAndName(LangFeatureType type, const util::StringView &nodeName); + std::string CreateMangledNameForLambdaInvoke(size_t invokeCounter); + std::string CreateMangledNameForLambdaObject(const util::StringView &lambdaInvokeName); + std::string CreateMangledNameForUnionProperty(const std::string &propTypeName); + std::string CreateMangledNameForAnnotation(const std::string &baseName, const std::string &annotationName); + std::string AppendToAnnotationName(const std::string &annotationName, const std::string &secondPart); + +private: + NameMangler() = default; +}; +} // namespace ark::es2panda::util + +#endif // NAMEMANGLER_H diff --git a/ets2panda/varbinder/ETSBinder.cpp b/ets2panda/varbinder/ETSBinder.cpp index 84b15b8e3c719cddcd9c9798a6c7980965945386..425d41350a0441a07974d442c8f3a3f1a6019866 100644 --- a/ets2panda/varbinder/ETSBinder.cpp +++ b/ets2panda/varbinder/ETSBinder.cpp @@ -19,6 +19,7 @@ #include "public/public.h" #include "compiler/lowering/util.h" #include "util/helpers.h" +#include "util/nameMangler.h" namespace ark::es2panda::varbinder { @@ -1114,12 +1115,18 @@ void ETSBinder::BuildFunctionName(const ir::ScriptFunction *func) const } else if (func->IsConstructor()) { ss << compiler::Signatures::CTOR; } else { + std::string newName; if (func->IsGetter()) { - ss << compiler::Signatures::GETTER_BEGIN; + newName = util::NameMangler::GetInstance()->CreateMangledNameByTypeAndName( + util::NameMangler::GET, util::Helpers::FunctionName(Allocator(), func)); + ss << newName; } else if (func->IsSetter()) { - ss << compiler::Signatures::SETTER_BEGIN; + newName = util::NameMangler::GetInstance()->CreateMangledNameByTypeAndName( + util::NameMangler::SET, util::Helpers::FunctionName(Allocator(), func)); + ss << newName; + } else { + ss << util::Helpers::FunctionName(Allocator(), func); } - ss << util::Helpers::FunctionName(Allocator(), func); } signature->ToAssemblerType(ss);