From e6c2e79440b4cc0ad538cca0b7d64a4ea550216f Mon Sep 17 00:00:00 2001 From: huyunhui1 Date: Fri, 10 Nov 2023 10:15:31 +0800 Subject: [PATCH 1/2] Support class public fields in es2abc Issue: https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/I8CE0X Signed-off-by: huyunhui1 Change-Id: If3c1d46676aef0bd7e3c4273d6bf70c790ac93ff --- es2panda/binder/binder.cpp | 33 +- es2panda/binder/scope.cpp | 32 ++ es2panda/binder/scope.h | 2 + es2panda/compiler/core/function.cpp | 75 +-- es2panda/compiler/core/pandagen.cpp | 37 ++ es2panda/compiler/core/pandagen.h | 6 + es2panda/ir/astNode.h | 1 + es2panda/ir/base/classDefinition.cpp | 65 ++- es2panda/ir/base/classDefinition.h | 47 +- es2panda/ir/base/classProperty.h | 6 + es2panda/ir/base/scriptFunction.h | 7 +- es2panda/ir/expressions/callExpression.cpp | 15 + es2panda/parser/parserImpl.cpp | 57 ++- es2panda/parser/parserImpl.h | 6 +- test262/es2022_tests.txt | 529 ++++++++++++++++++++- 15 files changed, 848 insertions(+), 70 deletions(-) diff --git a/es2panda/binder/binder.cpp b/es2panda/binder/binder.cpp index c88a843a35..8c829d604c 100644 --- a/es2panda/binder/binder.cpp +++ b/es2panda/binder/binder.cpp @@ -21,6 +21,7 @@ #include "ir/astNode.h" #include "ir/base/catchClause.h" #include "ir/base/classDefinition.h" +#include "ir/base/classProperty.h" #include "ir/base/methodDefinition.h" #include "ir/base/property.h" #include "ir/base/scriptFunction.h" @@ -561,6 +562,11 @@ void Binder::BuildClassDefinition(ir::ClassDefinition *classDef) ResolveReference(classDef, iter); } + // Ts limitation for new class compilation + if (Program()->Extension() == ScriptExtension::JS) { + classDef->BuildClassEnvironment(); + } + if (classDef->Ident()) { ScopeFindResult res = scope_->Find(classDef->Ident()->Name()); @@ -572,10 +578,14 @@ void Binder::BuildClassDefinition(ir::ClassDefinition *classDef) ResolveReference(classDef, classDef->Ctor()); - if (classDef->NeedStaticInitializer() && Program()->Extension() == ScriptExtension::JS) { + if (classDef->NeedStaticInitializer()) { ResolveReference(classDef, classDef->StaticInitializer()); } + if (classDef->NeedInstanceInitializer()) { + ResolveReference(classDef, classDef->InstanceInitializer()); + } + for (auto *stmt : classDef->Body()) { ResolveReference(classDef, stmt); } @@ -714,10 +724,23 @@ void Binder::ResolveReference(const ir::AstNode *parent, ir::AstNode *childNode) break; } case ir::AstNodeType::CLASS_PROPERTY: { - const ir::ScriptFunction *ctor = util::Helpers::GetContainingConstructor(childNode->AsClassProperty()); - auto scopeCtx = LexicalScope::Enter(this, ctor->Scope()); - - ResolveReferences(childNode); + // Ts limitation for new class compilation + if (Program()->Extension() == ScriptExtension::TS) { + const ir::ScriptFunction *ctor = util::Helpers::GetContainingConstructor(childNode->AsClassProperty()); + auto scopeCtx = LexicalScope::Enter(this, ctor->Scope()); + ResolveReferences(childNode); + break; + } + auto *prop = childNode->AsClassProperty(); + ResolveReference(prop, prop->Key()); + if (prop->Value() != nullptr) { + ASSERT(parent->IsClassDefinition()); + const auto *classDef = parent->AsClassDefinition(); + const ir::MethodDefinition *method = prop->IsStatic() ? classDef->StaticInitializer() : + classDef->InstanceInitializer(); + auto scopeCtx = LexicalScope::Enter(this, method->Function()->Scope()); + ResolveReference(prop, prop->Value()); + } break; } case ir::AstNodeType::BLOCK_STATEMENT: { diff --git a/es2panda/binder/scope.cpp b/es2panda/binder/scope.cpp index 3d39e23a87..808c98638d 100644 --- a/es2panda/binder/scope.cpp +++ b/es2panda/binder/scope.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -118,6 +119,12 @@ ScopeFindResult Scope::Find(const util::StringView &name, ResolveBindingOptions while (iter != nullptr) { Variable *v = iter->FindLocal(name, options); + if (iter->Node() && iter->Node()->IsClassDefinition()) { + if (iter->Node()->AsClassDefinition()->NeedEnv()) { + lexLevel++; + } + } + if (v != nullptr) { return {name, const_cast(iter), level, lexLevel, v, concurrentFunc}; } @@ -148,6 +155,31 @@ ScopeFindResult Scope::Find(const util::StringView &name, ResolveBindingOptions return {name, nullptr, 0, 0, nullptr, concurrentFunc}; } +std::pair Scope::Find(const ir::Expression *expr, bool onlyLevel) const +{ + uint32_t lexLevel = 0; + const auto *iter = this; + + while (iter != nullptr) { + if (iter->Node() && iter->Node()->IsClassDefinition()) { + if (onlyLevel) { + return {lexLevel, 0}; + } + const auto *classDef = iter->Node()->AsClassDefinition(); + return {lexLevel, classDef->GetSlot(expr)}; + } + + if (iter->IsVariableScope()) { + if (iter->AsVariableScope()->NeedLexEnv()) { + lexLevel++; + } + } + iter = iter->Parent(); + } + + UNREACHABLE(); +} + Decl *Scope::FindDecl(const util::StringView &name) const { for (auto *it : decls_) { diff --git a/es2panda/binder/scope.h b/es2panda/binder/scope.h index 7d2fb9ead4..120d8b8371 100644 --- a/es2panda/binder/scope.h +++ b/es2panda/binder/scope.h @@ -327,6 +327,8 @@ public: ScopeFindResult Find(const util::StringView &name, ResolveBindingOptions options = ResolveBindingOptions::BINDINGS) const; + std::pair Find(const ir::Expression *expr, bool onlyLevel = false) const; + Decl *FindDecl(const util::StringView &name) const; bool HasVarDecl(const util::StringView &name) const; diff --git a/es2panda/compiler/core/function.cpp b/es2panda/compiler/core/function.cpp index 6f1ebc996d..cc5c386395 100644 --- a/es2panda/compiler/core/function.cpp +++ b/es2panda/compiler/core/function.cpp @@ -122,9 +122,18 @@ static void CompileFunctionParameterDeclaration(PandaGen *pg, const ir::ScriptFu } } -// TODO(huyunhui): reimplement the compilation of class field -static void CompileField(PandaGen *pg, const ir::ClassProperty *prop, VReg thisReg) +static void CompileField(PandaGen *pg, const ir::ClassProperty *prop, VReg thisReg, int32_t level) { + Operand op; + if (prop->IsComputed() && prop->NeedCompileKey()) { + auto slot = prop->Parent()->AsClassDefinition()->GetSlot(prop->Key()); + pg->LoadLexicalVar(prop->Key(), level, slot); + op = pg->AllocReg(); + pg->StoreAccumulator(prop->Key(), std::get(op)); + } else { + op = pg->ToPropertyKey(prop->Key(), prop->IsComputed()); + } + if (!prop->Value()) { pg->LoadConst(prop, Constant::JS_UNDEFINED); } else { @@ -132,34 +141,10 @@ static void CompileField(PandaGen *pg, const ir::ClassProperty *prop, VReg thisR prop->Value()->Compile(pg); } - if (!prop->Key()->IsIdentifier()) { - PandaGen::Unimplemented(); - } - - pg->StoreObjByName(prop, thisReg, prop->Key()->AsIdentifier()->Name()); -} - -static void CompileInstanceFields(PandaGen *pg, const ir::ScriptFunction *decl) -{ - const auto &statements = decl->Parent()->Parent()->Parent()->AsClassDefinition()->Body(); - - RegScope rs(pg); - auto thisReg = pg->AllocReg(); - pg->GetThis(decl); - pg->StoreAccumulator(decl, thisReg); - - for (auto const &stmt : statements) { - if (stmt->IsClassProperty()) { - const auto *prop = stmt->AsClassProperty(); - if (prop->IsStatic()) { - continue; - } - CompileField(pg, prop, thisReg); - } - } + pg->DefineClassField(prop, thisReg, op); } -static void CompileStaticInitializer(PandaGen *pg, const ir::ScriptFunction *decl) +static void CompileClassInitializer(PandaGen *pg, const ir::ScriptFunction *decl, bool isStatic) { const auto &statements = decl->Parent()->Parent()->Parent()->AsClassDefinition()->Body(); @@ -167,6 +152,7 @@ static void CompileStaticInitializer(PandaGen *pg, const ir::ScriptFunction *dec auto thisReg = pg->AllocReg(); pg->GetThis(decl); pg->StoreAccumulator(decl, thisReg); + auto [level, slot] = pg->Scope()->Find(nullptr, true); for (auto const &stmt : statements) { if (stmt->IsMethodDefinition()) { @@ -175,12 +161,16 @@ static void CompileStaticInitializer(PandaGen *pg, const ir::ScriptFunction *dec if (stmt->IsClassProperty()) { const auto *prop = stmt->AsClassProperty(); - if (prop->IsStatic()) { - CompileField(pg, prop, thisReg); + if (prop->IsStatic() == isStatic) { + CompileField(pg, prop, thisReg, level); } continue; } + if (!isStatic) { + continue; + } + ASSERT(stmt->IsClassStaticBlock()); const auto *staticBlock = stmt->AsClassStaticBlock(); staticBlock->Compile(pg); @@ -191,13 +181,28 @@ static void CompileFunction(PandaGen *pg) { const auto *decl = pg->RootNode()->AsScriptFunction(); - // TODO(szilagyia): move after super call - if (decl->IsConstructor() && pg->Binder()->Program()->Extension() != ScriptExtension::TS) { - CompileInstanceFields(pg, decl); + if (decl->IsConstructor()) { + const auto *classDef = util::Helpers::GetClassDefiniton(decl); + if (classDef->Super() == nullptr && classDef->NeedInstanceInitializer()) { + RegScope rs(pg); + auto callee = pg->AllocReg(); + auto thisReg = pg->AllocReg(); + + pg->GetThis(decl); + pg->StoreAccumulator(decl, thisReg); + + auto [level, slot] = pg->Scope()->Find(classDef->InstanceInitializer()->Key()); + pg->LoadLexicalVar(decl, level, slot); + pg->StoreAccumulator(decl, callee); + + pg->CallThis(decl, callee, 1); + } } - if (decl->IsStaticInitializer()) { - CompileStaticInitializer(pg, decl); + if (decl->IsStaticInitializer() || decl->IsInstanceInitializer()) { + CompileClassInitializer(pg, decl, decl->IsStaticInitializer()); + pg->ImplicitReturn(decl); + return; } auto *funcParamScope = pg->TopScope()->ParamScope(); diff --git a/es2panda/compiler/core/pandagen.cpp b/es2panda/compiler/core/pandagen.cpp index c138f1c323..8ebd498b6b 100644 --- a/es2panda/compiler/core/pandagen.cpp +++ b/es2panda/compiler/core/pandagen.cpp @@ -442,6 +442,22 @@ void PandaGen::StoreObjProperty(const ir::AstNode *node, VReg obj, const Operand StoreObjByName(node, obj, std::get(prop)); } +void PandaGen::DefineClassField(const ir::AstNode *node, VReg obj, const Operand &prop) +{ + if (std::holds_alternative(prop)) { + DefineFieldByValue(node, obj, std::get(prop)); + return; + } + + if (std::holds_alternative(prop)) { + DefineFieldByIndex(node, obj, std::get(prop)); + return; + } + + ASSERT(std::holds_alternative(prop)); + DefineFieldByName(node, obj, std::get(prop)); +} + void PandaGen::StoreOwnProperty(const ir::AstNode *node, VReg obj, const Operand &prop, bool nameSetting) { if (std::holds_alternative(prop)) { @@ -539,6 +555,12 @@ void PandaGen::StoreObjByName(const ir::AstNode *node, VReg obj, const util::Str strings_.insert(prop); } +void PandaGen::DefineFieldByName(const ir::AstNode *node, VReg obj, const util::StringView &prop) +{ + ra_.Emit(node, prop, obj); + strings_.insert(prop); +} + void PandaGen::LoadObjByIndex(const ir::AstNode *node, VReg obj, int64_t index) { LoadAccumulator(node, obj); // object is load to acc @@ -570,6 +592,16 @@ void PandaGen::StoreObjByIndex(const ir::AstNode *node, VReg obj, int64_t index) ra_.Emit(node, obj, index); } +void PandaGen::DefineFieldByValue(const ir::AstNode *node, VReg obj, VReg prop) +{ + ra_.Emit(node, prop, obj); +} + +void PandaGen::DefineFieldByIndex(const ir::AstNode *node, VReg obj, int64_t index) +{ + ra_.Emit(node, index, obj); +} + void PandaGen::StOwnByName(const ir::AstNode *node, VReg obj, const util::StringView &prop, bool nameSetting) { nameSetting ? ra_.Emit(node, 0, prop, obj) : @@ -2057,6 +2089,11 @@ VReg PandaGen::LoadPropertyKey(const ir::Expression *prop, bool isComputed) return propReg; } +void PandaGen::ToComputedPropertyKey(const ir::AstNode *node) +{ + ra_.Emit(node); +} + void PandaGen::StLetOrClassToGlobalRecord(const ir::AstNode *node, const util::StringView &name) { ra_.Emit(node, 0, name); diff --git a/es2panda/compiler/core/pandagen.h b/es2panda/compiler/core/pandagen.h index a11ae280c6..11c2c38c5f 100644 --- a/es2panda/compiler/core/pandagen.h +++ b/es2panda/compiler/core/pandagen.h @@ -295,6 +295,7 @@ public: void LoadObjByName(const ir::AstNode *node, VReg obj, const util::StringView &prop); void StoreObjProperty(const ir::AstNode *node, VReg obj, const Operand &prop); + void DefineClassField(const ir::AstNode *node, VReg obj, const Operand &prop); void StoreOwnProperty(const ir::AstNode *node, VReg obj, const Operand &prop, bool nameSetting = false); void DeleteObjProperty(const ir::AstNode *node, VReg obj, const Operand &prop); void LoadAccumulator(const ir::AstNode *node, VReg reg); @@ -465,6 +466,10 @@ public: void StoreObjByIndex(const ir::AstNode *node, VReg obj, int64_t index); void StoreObjByValue(const ir::AstNode *node, VReg obj, VReg prop); + void DefineFieldByName(const ir::AstNode *node, VReg obj, const util::StringView &prop); + void DefineFieldByIndex(const ir::AstNode *node, VReg obj, int64_t index); + void DefineFieldByValue(const ir::AstNode *node, VReg obj, VReg prop); + void StOwnByName(const ir::AstNode *node, VReg obj, const util::StringView &prop, bool nameSetting = false); void StOwnByValue(const ir::AstNode *node, VReg obj, VReg prop, bool nameSetting = false); void StOwnByIndex(const ir::AstNode *node, VReg obj, int64_t index); @@ -472,6 +477,7 @@ public: Operand ToNamedPropertyKey(const ir::Expression *prop, bool isComputed); Operand ToPropertyKey(const ir::Expression *prop, bool isComputed); VReg LoadPropertyKey(const ir::Expression *prop, bool isComputed); + void ToComputedPropertyKey(const ir::AstNode *node); void ReArrangeIc(); diff --git a/es2panda/ir/astNode.h b/es2panda/ir/astNode.h index 8c842fe588..16f58beaac 100644 --- a/es2panda/ir/astNode.h +++ b/es2panda/ir/astNode.h @@ -93,6 +93,7 @@ enum class ScriptFunctionFlags { CONCURRENT = 1 << 7, SHOW_SOURCE = 1 << 8, STATIC_INITIALIZER = 1 << 9, + INSTANCE_INITIALIZER = 1 << 10, }; DEFINE_BITOPS(ScriptFunctionFlags) diff --git a/es2panda/ir/base/classDefinition.cpp b/es2panda/ir/base/classDefinition.cpp index a795143ac5..abd82f266d 100644 --- a/es2panda/ir/base/classDefinition.cpp +++ b/es2panda/ir/base/classDefinition.cpp @@ -296,6 +296,10 @@ void ClassDefinition::CompileMissingProperties(compiler::PandaGen *pg, const uti } } + if (NeedInstanceInitializer()) { + InstanceInitialize(pg, protoReg); + } + pg->LoadAccumulator(this, classReg); } @@ -314,6 +318,27 @@ void ClassDefinition::StaticInitialize(compiler::PandaGen *pg, compiler::VReg cl pg->LoadAccumulator(this, classReg); } +void ClassDefinition::InstanceInitialize(compiler::PandaGen *pg, compiler::VReg protoReg) const +{ + pg->StoreAccumulator(this, protoReg); + instanceInitializer_->Value()->Compile(pg); + pg->StoreLexicalVar(instanceInitializer_, 0, GetSlot(instanceInitializer_->Key())); +} + +void ClassDefinition::CompileComputedKeys(compiler::PandaGen *pg) const +{ + for (const auto &stmt : body_) { + if (stmt->IsClassProperty()) { + const ir::ClassProperty *prop = stmt->AsClassProperty(); + if (prop->IsComputed() && prop->NeedCompileKey()) { + prop->Key()->Compile(pg); + pg->ToComputedPropertyKey(prop->Key()); + pg->StoreLexicalVar(prop->Key(), 0, GetSlot(prop->Key())); + } + } + } +} + void ClassDefinition::Compile(compiler::PandaGen *pg) const { if (declare_) { @@ -325,6 +350,11 @@ void ClassDefinition::Compile(compiler::PandaGen *pg) const compiler::LocalRegScope lrs(pg, scope_); + if (NeedEnv()) { + pg->NewLexEnv(this, slot_); + CompileComputedKeys(pg); + } + compiler::VReg baseReg = CompileHeritageClause(pg); util::StringView ctorId = ctor_->Function()->Scope()->InternalName(); util::BitSet compiled(body_.size()); @@ -337,9 +367,13 @@ void ClassDefinition::Compile(compiler::PandaGen *pg) const CompileMissingProperties(pg, compiled, classReg); - if (NeedStaticInitializer() && pg->Binder()->Program()->Extension() == ScriptExtension::JS) { + if (NeedStaticInitializer()) { StaticInitialize(pg, classReg); } + + if (NeedEnv()) { + pg->PopLexEnv(this); + } } checker::Type *ClassDefinition::Check(checker::Checker *checker) const @@ -383,4 +417,33 @@ void ClassDefinition::UpdateSelf(const NodeUpdater &cb, binder::Binder *binder) } } +void ClassDefinition::BuildClassEnvironment() +{ + for (const auto *stmt : body_) { + if (stmt->IsMethodDefinition()) { + continue; + } + + if (stmt->IsClassStaticBlock()) { + needStaticInitializer_ = true; + continue; + } + + ASSERT(stmt->IsClassProperty()); + const auto *prop = stmt->AsClassProperty(); + if (prop->IsComputed() && prop->NeedCompileKey()) { + computedNames_.insert({prop->Key(), slot_++}); + } + if (prop->IsStatic()) { + needStaticInitializer_ = true; + } else { + needInstanceInitializer_ = true; + } + } + + if (NeedInstanceInitializer()) { + computedNames_.insert({instanceInitializer_->Key(), slot_++}); + } +} + } // namespace panda::es2panda::ir diff --git a/es2panda/ir/base/classDefinition.h b/es2panda/ir/base/classDefinition.h index 819245bfcf..79c053702f 100644 --- a/es2panda/ir/base/classDefinition.h +++ b/es2panda/ir/base/classDefinition.h @@ -18,6 +18,7 @@ #include #include +#include #include namespace panda::es2panda::compiler { @@ -47,9 +48,9 @@ public: explicit ClassDefinition(binder::LocalScope *scope, Identifier *ident, TSTypeParameterDeclaration *typeParams, TSTypeParameterInstantiation *superTypeParams, ArenaVector &&implements, MethodDefinition *ctor, - MethodDefinition *staticInitializer, Expression *superClass, - ArenaVector &&body, ArenaVector &&indexSignatures, - bool declare, bool abstract) + MethodDefinition *staticInitializer, MethodDefinition *instanceInitializer, + Expression *superClass, ArenaVector &&body, + ArenaVector &&indexSignatures, bool declare, bool abstract) : AstNode(AstNodeType::CLASS_DEFINITION), scope_(scope), ident_(ident), @@ -58,6 +59,7 @@ public: implements_(std::move(implements)), ctor_(ctor), staticInitializer_(staticInitializer), + instanceInitializer_(instanceInitializer), superClass_(superClass), body_(std::move(body)), indexSignatures_(std::move(indexSignatures)), @@ -65,12 +67,6 @@ public: abstract_(abstract), exportDefault_(false) { - for (const auto *stmt : body_) { - if (stmt->IsClassStaticBlock() || (stmt->IsClassProperty() && stmt->AsClassProperty()->IsStatic())) { - needStaticInitializer_ = true; - break; - } - } } binder::LocalScope *Scope() const @@ -169,9 +165,9 @@ public: return staticInitializer_; } - bool NeedStaticInitializer() const + MethodDefinition *InstanceInitializer() const { - return needStaticInitializer_; + return instanceInitializer_; } const TSTypeParameterInstantiation *SuperTypeParams() const @@ -184,10 +180,33 @@ public: return superTypeParams_; } + bool NeedStaticInitializer() const + { + return needStaticInitializer_; + } + + bool NeedInstanceInitializer() const + { + return needInstanceInitializer_; + } + + bool NeedEnv() const + { + return slot_ != 0; + } + + uint32_t GetSlot(const Expression *node) const + { + ASSERT(computedNames_.find(node) != computedNames_.end()); + return computedNames_.find(node)->second; + } + const FunctionExpression *Ctor() const; util::StringView GetName() const; + void BuildClassEnvironment(); + void Iterate(const NodeTraverser &cb) const override; void Dump(ir::AstDumper *dumper) const override; void Compile(compiler::PandaGen *pg) const override; @@ -200,6 +219,8 @@ private: int32_t CreateClassStaticProperties(compiler::PandaGen *pg, util::BitSet &compiled) const; void CompileMissingProperties(compiler::PandaGen *pg, const util::BitSet &compiled, compiler::VReg classReg) const; void StaticInitialize(compiler::PandaGen *pg, compiler::VReg classReg) const; + void InstanceInitialize(compiler::PandaGen *pg, compiler::VReg classReg) const; + void CompileComputedKeys(compiler::PandaGen *pg) const; binder::LocalScope *scope_; Identifier *ident_; @@ -208,13 +229,17 @@ private: ArenaVector implements_; MethodDefinition *ctor_; MethodDefinition *staticInitializer_; + MethodDefinition *instanceInitializer_; Expression *superClass_; ArenaVector body_; ArenaVector indexSignatures_; + std::unordered_map computedNames_; + uint32_t slot_ {0}; bool declare_; bool abstract_; bool exportDefault_; bool needStaticInitializer_ {false}; + bool needInstanceInitializer_ {false}; }; } // namespace panda::es2panda::ir diff --git a/es2panda/ir/base/classProperty.h b/es2panda/ir/base/classProperty.h index b4397e8460..3a9f4a3cdc 100644 --- a/es2panda/ir/base/classProperty.h +++ b/es2panda/ir/base/classProperty.h @@ -17,6 +17,7 @@ #define ES2PANDA_PARSER_INCLUDE_AST_CLASS_PROPERTY_H #include +#include namespace panda::es2panda::compiler { class PandaGen; @@ -116,6 +117,11 @@ public: return definite_; } + bool NeedCompileKey() const + { + return !key_->IsLiteral(); + } + void Iterate(const NodeTraverser &cb) const override; void Dump(ir::AstDumper *dumper) const override; void Compile([[maybe_unused]] compiler::PandaGen *pg) const override; diff --git a/es2panda/ir/base/scriptFunction.h b/es2panda/ir/base/scriptFunction.h index dcb7a94ac5..98805de3a1 100644 --- a/es2panda/ir/base/scriptFunction.h +++ b/es2panda/ir/base/scriptFunction.h @@ -155,9 +155,14 @@ public: return (flags_ & ir::ScriptFunctionFlags::STATIC_INITIALIZER) != 0; } + bool IsInstanceInitializer() const + { + return (flags_ & ir::ScriptFunctionFlags::INSTANCE_INITIALIZER) != 0; + } + bool IsMethod() const { - return (flags_ & ir::ScriptFunctionFlags::METHOD) != 0 || IsStaticInitializer(); + return (flags_ & ir::ScriptFunctionFlags::METHOD) != 0 || IsInstanceInitializer() || IsStaticInitializer(); } bool FunctionBodyIsExpression() const diff --git a/es2panda/ir/expressions/callExpression.cpp b/es2panda/ir/expressions/callExpression.cpp index 2230541625..e09d1f989a 100644 --- a/es2panda/ir/expressions/callExpression.cpp +++ b/es2panda/ir/expressions/callExpression.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -120,6 +121,20 @@ void CallExpression::Compile(compiler::PandaGen *pg) const pg->LoadAccumulator(this, newThis); pg->SetThis(this); + + const auto *classDef = util::Helpers::GetClassDefiniton(util::Helpers::GetContainingConstructor(this)); + if (classDef->NeedInstanceInitializer()) { + auto callee = pg->AllocReg(); + auto thisReg = pg->AllocReg(); + + auto [level, slot] = pg->Scope()->Find(classDef->InstanceInitializer()->Key()); + pg->LoadLexicalVar(this, level, slot); + pg->StoreAccumulator(this, callee); + + pg->MoveVreg(this, thisReg, newThis); + + pg->CallThis(this, callee, 1); + } return; } diff --git a/es2panda/parser/parserImpl.cpp b/es2panda/parser/parserImpl.cpp index 391f087cde..3c83183803 100644 --- a/es2panda/parser/parserImpl.cpp +++ b/es2panda/parser/parserImpl.cpp @@ -2011,9 +2011,8 @@ ir::ModifierFlags ParserImpl::ParseModifiers() while (IsModifierKind(lexer_->GetToken())) { char32_t nextCp = lexer_->Lookahead(); - if (!((Extension() == ScriptExtension::JS && nextCp != LEX_CHAR_LEFT_PAREN) || - (Extension() == ScriptExtension::TS && nextCp != LEX_CHAR_EQUALS && nextCp != LEX_CHAR_SEMICOLON && - nextCp != LEX_CHAR_COMMA && nextCp != LEX_CHAR_LEFT_PAREN))) { + if (nextCp == LEX_CHAR_LEFT_PAREN || nextCp == LEX_CHAR_EQUALS || nextCp == LEX_CHAR_SEMICOLON || + (Extension() == ScriptExtension::TS && nextCp == LEX_CHAR_COMMA)) { break; } @@ -2276,6 +2275,7 @@ ir::Expression *ParserImpl::ParseClassKey(ClassElmentDescriptor *desc, bool isDe } case lexer::TokenType::LITERAL_STRING: { ThrowIfPrivateIdent(desc, "Private identifier name can not be string"); + ValidateClassKey(desc, isDeclare); propName = AllocNode(lexer_->GetToken().String()); propName->SetRange(lexer_->GetToken().Loc()); @@ -2505,7 +2505,8 @@ ir::ClassStaticBlock *ParserImpl::ParseStaticBlock(ClassElmentDescriptor *desc) ir::Statement *ParserImpl::ParseClassProperty(ClassElmentDescriptor *desc, const ArenaVector &properties, ir::Expression *propName, ir::Expression *typeAnnotation, ArenaVector &&decorators, - bool isDeclare) + bool isDeclare, + std::pair scopes) { lexer::SourcePosition propEnd = propName->End(); ir::Statement *property = nullptr; @@ -2516,12 +2517,17 @@ ir::Statement *ParserImpl::ParseClassProperty(ClassElmentDescriptor *desc, return property; } + if (!desc->isComputed) { + CheckFieldKey(propName); + } + ir::Expression *value = nullptr; if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SUBSTITUTION) { if (Extension() == ScriptExtension::TS && (desc->modifiers & ir::ModifierFlags::ABSTRACT)) { ThrowSyntaxError("Property cannot have an initializer because it is marked abstract."); } + context_.Status() |= (ParserStatus::ALLOW_SUPER | ParserStatus::DISALLOW_ARGUMENTS); lexer_->NextToken(); // eat equals if (isDeclare) { @@ -2529,9 +2535,10 @@ ir::Statement *ParserImpl::ParseClassProperty(ClassElmentDescriptor *desc, } // TODO(songqi):static classProperty's value can use super keyword in TypeScript4.4. // Currently only Parser is supported, Compiler support requires Transformer. - context_.Status() |= ParserStatus::ALLOW_SUPER; + auto *scope = ((desc->modifiers & ir::ModifierFlags::STATIC) != 0) ? scopes.first : scopes.second; + auto scopeCtx = binder::LexicalScope::Enter(Binder(), scope); value = ParseExpression(); - context_.Status() &= ~ParserStatus::ALLOW_SUPER; + context_.Status() &= ~(ParserStatus::ALLOW_SUPER | ParserStatus::DISALLOW_ARGUMENTS); propEnd = value->End(); } @@ -2591,6 +2598,20 @@ void ParserImpl::CheckClassPrivateIdentifier(ClassElmentDescriptor *desc) lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); } +void ParserImpl::CheckFieldKey(ir::Expression *propName) +{ + if (propName->IsNumberLiteral()) { + return; + } + + ASSERT(propName->IsIdentifier() || propName->IsStringLiteral()); + const util::StringView &stringView = propName->IsIdentifier() ? propName->AsIdentifier()->Name() : + propName->AsStringLiteral()->Str(); + if (stringView.Is("constructor")) { + ThrowSyntaxError("Classes may not have field named 'constructor'"); + } +} + ir::Expression *ParserImpl::ParseClassKeyAnnotation() { if (Extension() == ScriptExtension::TS && lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COLON) { @@ -2643,7 +2664,7 @@ ArenaVector ParserImpl::ParseDecorators() ir::Statement *ParserImpl::ParseClassElement(const ArenaVector &properties, ArenaVector *indexSignatures, bool hasSuperClass, bool isDeclare, bool isAbstractClass, bool isExtendsFromNull, - binder::Scope *scope) + std::pair scopes) { ClassElmentDescriptor desc; @@ -2676,7 +2697,7 @@ ir::Statement *ParserImpl::ParseClassElement(const ArenaVector if (!decorators.empty()) { ThrowSyntaxError("Decorators are not valid here.", decorators.front()->Start()); } - auto scopeCtx = binder::LexicalScope::Enter(Binder(), scope->AsFunctionScope()); + auto scopeCtx = binder::LexicalScope::Enter(Binder(), scopes.first); return ParseStaticBlock(&desc); } @@ -2743,7 +2764,7 @@ ir::Statement *ParserImpl::ParseClassElement(const ArenaVector } else { ValidateClassMethodStart(&desc, typeAnnotation); property = ParseClassProperty(&desc, properties, propName, typeAnnotation, std::move(decorators), - isDeclare || (desc.modifiers & ir::ModifierFlags::DECLARE)); + isDeclare || (desc.modifiers & ir::ModifierFlags::DECLARE), scopes); } if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_SEMI_COLON && @@ -2818,6 +2839,10 @@ ir::MethodDefinition *ParserImpl::CreateImplicitMethod(ir::Expression *superClas key = AllocNode("static_initializer"); break; } + case ir::ScriptFunctionFlags::INSTANCE_INITIALIZER: { + key = AllocNode("instance_initializer"); + break; + } default: { UNREACHABLE(); } @@ -3028,11 +3053,15 @@ ir::ClassDefinition *ParserImpl::ParseClassDefinition(bool isDeclaration, bool i ir::MethodDefinition *ctor = nullptr; ir::MethodDefinition *staticInitializer = CreateImplicitMethod(superClass, hasSuperClass, ir::ScriptFunctionFlags::STATIC_INITIALIZER, isDeclare); + ir::MethodDefinition *instanceInitializer = CreateImplicitMethod(superClass, hasSuperClass, + ir::ScriptFunctionFlags::INSTANCE_INITIALIZER, isDeclare); ArenaVector properties(Allocator()->Adapter()); ArenaVector indexSignatures(Allocator()->Adapter()); bool hasConstructorFuncBody = false; bool isCtorContinuousDefined = true; - auto *scope = staticInitializer->Function()->Scope(); + + auto *static_scope = staticInitializer->Function()->Scope(); + auto *instance_scope = instanceInitializer->Function()->Scope(); while (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_BRACE) { if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SEMI_COLON) { @@ -3040,8 +3069,8 @@ ir::ClassDefinition *ParserImpl::ParseClassDefinition(bool isDeclaration, bool i continue; } - ir::Statement *property = ParseClassElement(properties, &indexSignatures, hasSuperClass, - isDeclare, isAbstract, isExtendsFromNull, scope); + ir::Statement *property = ParseClassElement(properties, &indexSignatures, hasSuperClass, isDeclare, isAbstract, + isExtendsFromNull, std::make_pair(static_scope, instance_scope)); if (property->IsEmptyStatement()) { continue; @@ -3071,20 +3100,20 @@ ir::ClassDefinition *ParserImpl::ParseClassDefinition(bool isDeclaration, bool i ctor->SetRange({startLoc, classBodyEndLoc}); hasConstructorFuncBody = !isDeclare; } - lexer_->NextToken(); ValidateClassConstructor(ctor, properties, isDeclare, hasConstructorFuncBody, hasSuperClass, isExtendsFromNull); auto *classDefinition = AllocNode( classCtx.GetScope(), identNode, typeParamDecl, superTypeParams, std::move(implements), ctor, staticInitializer, - superClass, std::move(properties), std::move(indexSignatures), isDeclare, isAbstract); + instanceInitializer, superClass, std::move(properties), std::move(indexSignatures), isDeclare, isAbstract); classDefinition->SetRange({classBodyStartLoc, classBodyEndLoc}); if (decl != nullptr) { decl->BindNode(classDefinition); } + classCtx.GetScope()->BindNode(classDefinition); return classDefinition; } diff --git a/es2panda/parser/parserImpl.h b/es2panda/parser/parserImpl.h index f076ded5b7..0613a13012 100644 --- a/es2panda/parser/parserImpl.h +++ b/es2panda/parser/parserImpl.h @@ -303,17 +303,19 @@ private: ir::ClassStaticBlock *ParseStaticBlock(ClassElmentDescriptor *desc); ir::Statement *ParseClassProperty(ClassElmentDescriptor *desc, const ArenaVector &properties, ir::Expression *propName, ir::Expression *typeAnnotation, - ArenaVector &&decorators, bool isDeclare); + ArenaVector &&decorators, bool isDeclare, + std::pair scopes); void ParseClassKeyModifiers(ClassElmentDescriptor *desc); void CheckClassGeneratorMethod(ClassElmentDescriptor *desc); void CheckClassPrivateIdentifier(ClassElmentDescriptor *desc); + void CheckFieldKey(ir::Expression *propName); ir::Expression *ParseClassKeyAnnotation(); ir::Decorator *ParseDecorator(); ArenaVector ParseDecorators(); ir::Statement *ParseClassElement(const ArenaVector &properties, ArenaVector *indexSignatures, bool hasSuperClass, bool isDeclare, bool isAbstractClass, bool isExtendsFromNull, - binder::Scope *scope); + std::pair scopes); ir::MethodDefinition *CreateImplicitMethod(ir::Expression *superClass, bool hasSuperClass, ir::ScriptFunctionFlags funcFlag, bool isDeclare = false); ir::MethodDefinition *CheckClassMethodOverload(ir::Statement *property, ir::MethodDefinition **ctor, bool isDeclare, diff --git a/test262/es2022_tests.txt b/test262/es2022_tests.txt index e0131662d8..bc299c6773 100644 --- a/test262/es2022_tests.txt +++ b/test262/es2022_tests.txt @@ -182,4 +182,531 @@ language/statements/variable/dstr/ary-ptrn-elem-id-static-init-await-valid.js language/statements/variable/dstr/obj-ptrn-elem-id-static-init-await-invalid.js language/statements/variable/dstr/obj-ptrn-elem-id-static-init-await-valid.js language/statements/variable/static-init-await-binding-invalid.js -language/statements/variable/static-init-await-binding-valid.js \ No newline at end of file +language/statements/variable/static-init-await-binding-valid.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-assignment-expression-assignment.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-additive-expression-add.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-expression-coalesce.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-identifier.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-additive-expression-subtract.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-condition-expression-true.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-numeric-literal.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-null.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-additive-expression-subtract.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-function-declaration.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-assignment-expression-bitwise-or.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-multiplicative-expression-mult.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-integer-separators.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-multiplicative-expression-div.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-expression-coalesce.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-multiplicative-expression-mult.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-integer-e-notational-literal.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-expression-logical-or.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-assignment-expression-coalesce.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-math.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-condition-expression-false.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-function-declaration.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-assignment-expression-bitwise-or.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-numeric-literal.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-assignment-expression-coalesce.js +language/expressions/class/elements/after-same-line-method-rs-field-identifier.js +language/expressions/class/elements/static-as-valid-instance-field-assigned.js +language/expressions/class/elements/regular-definitions-rs-field-identifier-initializer.js +language/expressions/class/elements/after-same-line-static-async-gen-computed-names.js +language/expressions/class/elements/init-err-evaluation.js +language/expressions/class/elements/same-line-async-gen-rs-field-identifier-initializer.js +language/expressions/class/elements/literal-name-init-err-contains-arguments.js +language/expressions/class/elements/regular-definitions-literal-names.js +language/expressions/class/elements/new-sc-line-gen-literal-names-asi.js +language/expressions/class/elements/new-sc-line-method-computed-symbol-names.js +language/expressions/class/elements/new-sc-line-method-string-literal-names.js +language/expressions/class/elements/multiple-stacked-definitions-rs-field-identifier-initializer.js +language/expressions/class/elements/new-sc-line-method-literal-names.js +language/expressions/class/elements/regular-definitions-rs-field-identifier.js +language/expressions/class/elements/redeclaration.js +language/expressions/class/elements/after-same-line-method-computed-names.js +language/expressions/class/elements/same-line-async-gen-literal-names-asi.js +language/expressions/class/elements/after-same-line-static-async-gen-literal-names.js +language/expressions/class/elements/equality-init-err-contains-super.js +language/expressions/class/elements/static-literal-init-err-contains-arguments.js +language/expressions/class/elements/same-line-async-method-literal-names-asi.js +language/expressions/class/elements/fields-string-name-static-propname-constructor.js +language/expressions/class/elements/static-comp-name-init-err-contains-super.js +language/expressions/class/elements/after-same-line-static-async-gen-rs-field-identifier.js +language/expressions/class/elements/after-same-line-method-literal-names-asi.js +language/expressions/class/elements/regular-definitions-string-literal-names.js +language/expressions/class/elements/after-same-line-static-method-literal-names.js +language/expressions/class/elements/comp-name-init-err-contains-super.js +language/expressions/class/elements/arrow-fnc-init-err-contains-super.js +language/expressions/class/elements/same-line-method-computed-symbol-names.js +language/expressions/class/elements/same-line-gen-rs-field-identifier-initializer.js +language/expressions/class/elements/init-value-incremental.js +language/expressions/class/elements/same-line-gen-literal-names-asi.js +language/expressions/class/elements/after-same-line-method-string-literal-names.js +language/expressions/class/elements/same-line-method-computed-names.js +language/expressions/class/elements/new-no-sc-line-method-computed-names.js +language/expressions/class/elements/ternary-init-err-contains-super.js +language/expressions/class/elements/new-sc-line-gen-rs-field-identifier-initializer.js +language/expressions/class/elements/after-same-line-static-gen-computed-names.js +language/expressions/class/elements/after-same-line-static-gen-rs-field-identifier-initializer.js +language/expressions/class/elements/after-same-line-method-computed-symbol-names.js +language/expressions/class/elements/new-sc-line-gen-literal-names.js +language/expressions/class/elements/multiple-stacked-definitions-rs-field-identifier.js +language/expressions/class/elements/same-line-async-method-computed-symbol-names.js +language/expressions/class/elements/nested-comp-name-init-err-contains-arguments.js +language/expressions/class/elements/nested-static-comp-name-init-err-contains-super.js +language/expressions/class/elements/field-declaration.js +language/expressions/class/elements/same-line-async-gen-computed-names.js +language/expressions/class/elements/fields-literal-name-propname-constructor.js +language/expressions/class/elements/wrapped-in-sc-computed-symbol-names.js +language/expressions/class/elements/after-same-line-static-method-literal-names-asi.js +language/expressions/class/elements/after-same-line-static-gen-rs-field-identifier.js +language/expressions/class/elements/static-as-valid-instance-field.js +language/expressions/class/elements/new-sc-line-method-rs-field-identifier-initializer.js +language/expressions/class/elements/new-sc-line-gen-computed-names.js +language/expressions/class/elements/nested-literal-name-init-err-contains-super.js +language/expressions/class/elements/typeof-init-err-contains-arguments.js +language/expressions/class/elements/fields-literal-name-static-propname-constructor.js +language/expressions/class/elements/regular-definitions-computed-names.js +language/expressions/class/elements/super-access-from-arrow-func-on-field.js +language/expressions/class/elements/ctor-called-after-fields-init.js +language/expressions/class/elements/same-line-method-literal-names-asi.js +language/expressions/class/elements/comp-name-init-err-contains-arguments.js +language/expressions/class/elements/new-no-sc-line-method-rs-field-identifier-initializer.js +language/expressions/class/elements/regular-definitions-computed-symbol-names.js +language/expressions/class/elements/same-line-gen-rs-field-identifier.js +language/expressions/class/elements/after-same-line-static-method-rs-field-identifier-initializer.js +language/expressions/class/elements/same-line-gen-computed-names.js +language/expressions/class/elements/new-sc-line-gen-string-literal-names.js +language/expressions/class/elements/same-line-async-gen-rs-field-identifier.js +language/expressions/class/elements/after-same-line-static-async-method-string-literal-names.js +language/expressions/class/elements/after-same-line-gen-literal-names.js +language/expressions/class/elements/fields-asi-2.js +language/expressions/class/elements/new-sc-line-method-computed-names.js +language/expressions/class/elements/regular-definitions-literal-names-asi.js +language/expressions/class/elements/same-line-gen-computed-symbol-names.js +language/expressions/class/elements/same-line-async-gen-computed-symbol-names.js +language/expressions/class/elements/fields-asi-1.js +language/expressions/class/elements/multiple-stacked-definitions-computed-symbol-names.js +language/expressions/class/elements/wrapped-in-sc-computed-names.js +language/expressions/class/elements/string-literal-name-init-err-contains-super.js +language/expressions/class/elements/after-same-line-static-gen-computed-symbol-names.js +language/expressions/class/elements/same-line-async-method-string-literal-names.js +language/expressions/class/elements/fields-string-name-static-propname-prototype.js +language/expressions/class/elements/nested-ternary-init-err-contains-arguments.js +language/expressions/class/elements/same-line-async-method-rs-field-identifier.js +language/expressions/class/elements/string-literal-name-init-err-contains-arguments.js +language/expressions/class/elements/arrow-fnc-init-err-contains-arguments.js +language/expressions/class/elements/same-line-async-method-computed-names.js +language/expressions/class/elements/new-sc-line-gen-computed-symbol-names.js +language/expressions/class/elements/after-same-line-static-method-string-literal-names.js +language/expressions/class/elements/static-comp-name-init-err-contains-arguments.js +language/expressions/class/elements/fields-asi-3.js +language/expressions/class/elements/after-same-line-gen-computed-names.js +language/expressions/class/elements/nested-typeof-init-err-contains-super.js +language/expressions/class/elements/after-same-line-static-async-method-computed-symbol-names.js +language/expressions/class/elements/multiple-stacked-definitions-string-literal-names.js +language/expressions/class/elements/nested-static-string-literal-name-init-err-contains-arguments.js +language/expressions/class/elements/after-same-line-gen-literal-names-asi.js +language/expressions/class/elements/multiple-stacked-definitions-literal-names.js +language/expressions/class/elements/equality-init-err-contains-arguments.js +language/expressions/class/elements/new-no-sc-line-method-literal-names-asi.js +language/expressions/class/elements/after-same-line-static-async-gen-computed-symbol-names.js +language/expressions/class/elements/evaluation-error/computed-name-referenceerror.js +language/expressions/class/elements/nested-string-literal-name-init-err-contains-super.js +language/expressions/class/elements/wrapped-in-sc-rs-field-identifier.js +language/expressions/class/elements/after-same-line-static-method-rs-field-identifier.js +language/expressions/class/elements/nested-static-string-literal-name-init-err-contains-super.js +language/expressions/class/elements/after-same-line-gen-string-literal-names.js +language/expressions/class/elements/same-line-async-method-literal-names.js +language/expressions/class/elements/nested-arrow-fnc-init-err-contains-super.js +language/expressions/class/elements/after-same-line-static-gen-literal-names.js +language/expressions/class/elements/after-same-line-static-async-gen-literal-names-asi.js +language/expressions/class/elements/fields-asi-same-line-1.js +language/expressions/class/elements/nested-ternary-init-err-contains-super.js +language/expressions/class/elements/ternary-init-err-contains-arguments.js +language/expressions/class/elements/fields-asi-5.js +language/expressions/class/elements/new-no-sc-line-method-literal-names.js +language/expressions/class/elements/nested-static-literal-init-err-contains-arguments.js +language/expressions/class/elements/intercalated-static-non-static-computed-fields.js +language/expressions/class/elements/typeof-init-err-contains-super.js +language/expressions/class/elements/after-same-line-static-gen-literal-names-asi.js +language/expressions/class/elements/same-line-async-gen-string-literal-names.js +language/expressions/class/elements/syntax/early-errors/grammar-field-identifier-invalid-zwj-error.js +language/expressions/class/elements/syntax/early-errors/grammar-fields-same-line-error.js +language/expressions/class/elements/syntax/early-errors/grammar-field-identifier-invalid-ues-error.js +language/expressions/class/elements/syntax/early-errors/grammar-field-identifier-invalid-zwnj-error.js +language/expressions/class/elements/syntax/valid/grammar-field-classelementname-initializer-alt.js +language/expressions/class/elements/syntax/valid/grammar-field-identifier-alt.js +language/expressions/class/elements/syntax/valid/grammar-fields-multi-line.js +language/expressions/class/elements/syntax/valid/grammar-field-identifier.js +language/expressions/class/elements/syntax/valid/grammar-field-classelementname-initializer.js +language/expressions/class/elements/new-sc-line-method-rs-field-identifier.js +language/expressions/class/elements/static-string-literal-name-init-err-contains-super.js +language/expressions/class/elements/new-no-sc-line-method-rs-field-identifier.js +language/expressions/class/elements/after-same-line-static-method-computed-symbol-names.js +language/expressions/class/elements/after-same-line-static-async-method-computed-names.js +language/expressions/class/elements/fields-asi-same-line-2.js +language/expressions/class/elements/init-value-defined-after-class.js +language/expressions/class/elements/fields-asi-4.js +language/expressions/class/elements/after-same-line-gen-rs-field-identifier.js +language/expressions/class/elements/static-string-literal-name-init-err-contains-arguments.js +language/expressions/class/elements/nested-arrow-fnc-init-err-contains-arguments.js +language/expressions/class/elements/fields-literal-name-static-propname-prototype.js +language/expressions/class/elements/new-sc-line-method-literal-names-asi.js +language/expressions/class/elements/new-sc-line-gen-rs-field-identifier.js +language/expressions/class/elements/after-same-line-static-async-method-literal-names-asi.js +language/expressions/class/elements/same-line-method-rs-field-identifier-initializer.js +language/expressions/class/elements/wrapped-in-sc-string-literal-names.js +language/expressions/class/elements/after-same-line-static-async-gen-rs-field-identifier-initializer.js +language/expressions/class/elements/new-no-sc-line-method-computed-symbol-names.js +language/expressions/class/elements/nested-static-literal-init-err-contains-super.js +language/expressions/class/elements/same-line-method-rs-field-identifier.js +language/expressions/class/elements/literal-name-init-err-contains-super.js +language/expressions/class/elements/after-same-line-static-gen-string-literal-names.js +language/expressions/class/elements/after-same-line-static-async-method-literal-names.js +language/expressions/class/elements/multiple-stacked-definitions-computed-names.js +language/expressions/class/elements/nested-string-literal-name-init-err-contains-arguments.js +language/expressions/class/elements/after-same-line-gen-rs-field-identifier-initializer.js +language/expressions/class/elements/fields-run-once-on-double-super.js +language/expressions/class/elements/after-same-line-static-method-computed-names.js +language/expressions/class/elements/same-line-method-string-literal-names.js +language/expressions/class/elements/after-same-line-static-async-method-rs-field-identifier.js +language/expressions/class/elements/wrapped-in-sc-rs-field-identifier-initializer.js +language/expressions/class/elements/after-same-line-static-async-gen-string-literal-names.js +language/expressions/class/elements/after-same-line-method-literal-names.js +language/expressions/class/elements/nested-literal-name-init-err-contains-arguments.js +language/expressions/class/elements/same-line-gen-literal-names.js +language/expressions/class/elements/multiple-stacked-definitions-literal-names-asi.js +language/expressions/class/elements/wrapped-in-sc-literal-names-asi.js +language/expressions/class/elements/redeclaration-symbol.js +language/expressions/class/elements/same-line-method-literal-names.js +language/expressions/class/elements/after-same-line-method-rs-field-identifier-initializer.js +language/expressions/class/elements/same-line-async-method-rs-field-identifier-initializer.js +language/expressions/class/elements/nested-comp-name-init-err-contains-super.js +language/expressions/class/elements/same-line-gen-string-literal-names.js +language/expressions/class/elements/nested-equality-init-err-contains-arguments.js +language/expressions/class/elements/static-literal-init-err-contains-super.js +language/expressions/class/elements/after-same-line-gen-computed-symbol-names.js +language/expressions/class/elements/nested-static-comp-name-init-err-contains-arguments.js +language/expressions/class/elements/nested-equality-init-err-contains-super.js +language/expressions/class/elements/fields-string-name-propname-constructor.js +language/expressions/class/elements/nested-typeof-init-err-contains-arguments.js +language/expressions/class/elements/same-line-async-gen-literal-names.js +language/expressions/class/elements/wrapped-in-sc-literal-names.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-exponetiation-expression.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-identifier.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-condition-expression-false.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-string-literal.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-decimal-literal.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-decimal-literal.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-additive-expression-add.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-string-literal.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-expression-logical-or.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-exponetiation-expression.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-decimal-e-notational-literal.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-yield-expression.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-assignment-expression-logical-and.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-null.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-decimal-e-notational-literal.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-expression-logical-and.js +language/expressions/class/constructor-this-tdz-during-initializers.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-yield-expression.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-integer-separators.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-math.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-multiplicative-expression-div.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-integer-e-notational-literal.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-assignment-expression-logical-and.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-expression-logical-and.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-assignment-expression-assignment.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-assignment-expression-logical-or.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-assignment-expression-logical-or.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-condition-expression-true.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-math.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-additive-expression-add.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-expression-logical-or.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-yield-expression.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-assignment-expression-logical-or.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-assignment-expression-bitwise-or.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-assignment-expression-coalesce.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-numeric-literal.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-identifier.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-yield-expression.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-assignment-expression-logical-and.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-decimal-literal.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-null.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-function-declaration.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-decimal-e-notational-literal.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-integer-e-notational-literal.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-decimal-literal.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-string-literal.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-integer-separators.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-assignment-expression-assignment.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-null.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-expression-logical-and.js +language/statements/class/elements/after-same-line-method-rs-field-identifier.js +language/statements/class/elements/static-as-valid-instance-field-assigned.js +language/statements/class/elements/regular-definitions-rs-field-identifier-initializer.js +language/statements/class/elements/after-same-line-static-async-gen-computed-names.js +language/statements/class/elements/init-err-evaluation.js +language/statements/class/elements/same-line-async-gen-rs-field-identifier-initializer.js +language/statements/class/elements/literal-name-init-err-contains-arguments.js +language/statements/class/elements/regular-definitions-literal-names.js +language/statements/class/elements/new-sc-line-gen-literal-names-asi.js +language/statements/class/elements/new-sc-line-method-computed-symbol-names.js +language/statements/class/elements/new-sc-line-method-string-literal-names.js +language/statements/class/elements/multiple-stacked-definitions-rs-field-identifier-initializer.js +language/statements/class/elements/new-sc-line-method-literal-names.js +language/statements/class/elements/regular-definitions-rs-field-identifier.js +language/statements/class/elements/redeclaration.js +language/statements/class/elements/after-same-line-method-computed-names.js +language/statements/class/elements/same-line-async-gen-literal-names-asi.js +language/statements/class/elements/after-same-line-static-async-gen-literal-names.js +language/statements/class/elements/equality-init-err-contains-super.js +language/statements/class/elements/static-literal-init-err-contains-arguments.js +language/statements/class/elements/same-line-async-method-literal-names-asi.js +language/statements/class/elements/static-comp-name-init-err-contains-super.js +language/statements/class/elements/after-same-line-static-async-gen-rs-field-identifier.js +language/statements/class/elements/after-same-line-method-literal-names-asi.js +language/statements/class/elements/regular-definitions-string-literal-names.js +language/statements/class/elements/after-same-line-static-method-literal-names.js +language/statements/class/elements/comp-name-init-err-contains-super.js +language/statements/class/elements/arrow-fnc-init-err-contains-super.js +language/statements/class/elements/same-line-method-computed-symbol-names.js +language/statements/class/elements/same-line-gen-rs-field-identifier-initializer.js +language/statements/class/elements/init-value-incremental.js +language/statements/class/elements/super-fielddefinition-initializer-abrupt-completion.js +language/statements/class/elements/same-line-gen-literal-names-asi.js +language/statements/class/elements/after-same-line-method-string-literal-names.js +language/statements/class/elements/same-line-method-computed-names.js +language/statements/class/elements/new-no-sc-line-method-computed-names.js +language/statements/class/elements/ternary-init-err-contains-super.js +language/statements/class/elements/new-sc-line-gen-rs-field-identifier-initializer.js +language/statements/class/elements/after-same-line-static-gen-computed-names.js +language/statements/class/elements/after-same-line-static-gen-rs-field-identifier-initializer.js +language/statements/class/elements/computed-property-abrupt-completition.js +language/statements/class/elements/after-same-line-method-computed-symbol-names.js +language/statements/class/elements/new-sc-line-gen-literal-names.js +language/statements/class/elements/multiple-stacked-definitions-rs-field-identifier.js +language/statements/class/elements/same-line-async-method-computed-symbol-names.js +language/statements/class/elements/nested-comp-name-init-err-contains-arguments.js +language/statements/class/elements/nested-static-comp-name-init-err-contains-super.js +language/statements/class/elements/field-declaration.js +language/statements/class/elements/same-line-async-gen-computed-names.js +language/statements/class/elements/fields-literal-name-propname-constructor.js +language/statements/class/elements/new-no-sc-line-method-string-literal-names.js +language/statements/class/elements/wrapped-in-sc-computed-symbol-names.js +language/statements/class/elements/after-same-line-static-method-literal-names-asi.js +language/statements/class/elements/after-same-line-static-gen-rs-field-identifier.js +language/statements/class/elements/static-as-valid-instance-field.js +language/statements/class/elements/new-sc-line-method-rs-field-identifier-initializer.js +language/statements/class/elements/new-sc-line-gen-computed-names.js +language/statements/class/elements/nested-literal-name-init-err-contains-super.js +language/statements/class/elements/typeof-init-err-contains-arguments.js +language/statements/class/elements/regular-definitions-computed-names.js +language/statements/class/elements/super-access-from-arrow-func-on-field.js +language/statements/class/elements/ctor-called-after-fields-init.js +language/statements/class/elements/same-line-method-literal-names-asi.js +language/statements/class/elements/comp-name-init-err-contains-arguments.js +language/statements/class/elements/new-no-sc-line-method-rs-field-identifier-initializer.js +language/statements/class/elements/regular-definitions-computed-symbol-names.js +language/statements/class/elements/same-line-gen-rs-field-identifier.js +language/statements/class/elements/after-same-line-static-method-rs-field-identifier-initializer.js +language/statements/class/elements/same-line-gen-computed-names.js +language/statements/class/elements/new-sc-line-gen-string-literal-names.js +language/statements/class/elements/same-line-async-gen-rs-field-identifier.js +language/statements/class/elements/after-same-line-static-async-method-string-literal-names.js +language/statements/class/elements/after-same-line-gen-literal-names.js +language/statements/class/elements/fields-asi-2.js +language/statements/class/elements/new-sc-line-method-computed-names.js +language/statements/class/elements/regular-definitions-literal-names-asi.js +language/statements/class/elements/same-line-gen-computed-symbol-names.js +language/statements/class/elements/same-line-async-gen-computed-symbol-names.js +language/statements/class/elements/fields-asi-1.js +language/statements/class/elements/multiple-stacked-definitions-computed-symbol-names.js +language/statements/class/elements/wrapped-in-sc-computed-names.js +language/statements/class/elements/string-literal-name-init-err-contains-super.js +language/statements/class/elements/after-same-line-static-gen-computed-symbol-names.js +language/statements/class/elements/same-line-async-method-string-literal-names.js +language/statements/class/elements/fielddefinition-initializer-abrupt-completion.js +language/statements/class/elements/nested-ternary-init-err-contains-arguments.js +language/statements/class/elements/class-field-is-observable-by-proxy.js +language/statements/class/elements/same-line-async-method-rs-field-identifier.js +language/statements/class/elements/string-literal-name-init-err-contains-arguments.js +language/statements/class/elements/arrow-fnc-init-err-contains-arguments.js +language/statements/class/elements/same-line-async-method-computed-names.js +language/statements/class/elements/new-sc-line-gen-computed-symbol-names.js +language/statements/class/elements/after-same-line-static-method-string-literal-names.js +language/statements/class/elements/static-comp-name-init-err-contains-arguments.js +language/statements/class/elements/fields-asi-3.js +language/statements/class/elements/after-same-line-gen-computed-names.js +language/statements/class/elements/nested-typeof-init-err-contains-super.js +language/statements/class/elements/after-same-line-static-async-method-computed-symbol-names.js +language/statements/class/elements/multiple-stacked-definitions-string-literal-names.js +language/statements/class/elements/nested-static-string-literal-name-init-err-contains-arguments.js +language/statements/class/elements/after-same-line-gen-literal-names-asi.js +language/statements/class/elements/multiple-stacked-definitions-literal-names.js +language/statements/class/elements/equality-init-err-contains-arguments.js +language/statements/class/elements/fields-hash-constructor-is-a-valid-name.js +language/statements/class/elements/new-no-sc-line-method-literal-names-asi.js +language/statements/class/elements/after-same-line-static-async-gen-computed-symbol-names.js +language/statements/class/elements/evaluation-error/computed-name-referenceerror.js +language/statements/class/elements/nested-string-literal-name-init-err-contains-super.js +language/statements/class/elements/wrapped-in-sc-rs-field-identifier.js +language/statements/class/elements/after-same-line-static-method-rs-field-identifier.js +language/statements/class/elements/nested-static-string-literal-name-init-err-contains-super.js +language/statements/class/elements/after-same-line-gen-string-literal-names.js +language/statements/class/elements/same-line-async-method-literal-names.js +language/statements/class/elements/nested-arrow-fnc-init-err-contains-super.js +language/statements/class/elements/after-same-line-static-gen-literal-names.js +language/statements/class/elements/after-same-line-static-async-gen-literal-names-asi.js +language/statements/class/elements/fields-asi-same-line-1.js +language/statements/class/elements/nested-ternary-init-err-contains-super.js +language/statements/class/elements/ternary-init-err-contains-arguments.js +language/statements/class/elements/fields-asi-5.js +language/statements/class/elements/new-no-sc-line-method-literal-names.js +language/statements/class/elements/nested-static-literal-init-err-contains-arguments.js +language/statements/class/elements/intercalated-static-non-static-computed-fields.js +language/statements/class/elements/typeof-init-err-contains-super.js +language/statements/class/elements/after-same-line-static-gen-literal-names-asi.js +language/statements/class/elements/same-line-async-gen-string-literal-names.js +language/statements/class/elements/syntax/early-errors/grammar-field-identifier-invalid-zwj-error.js +language/statements/class/elements/syntax/early-errors/grammar-fields-same-line-error.js +language/statements/class/elements/syntax/early-errors/grammar-field-identifier-invalid-ues-error.js +language/statements/class/elements/syntax/early-errors/grammar-field-identifier-invalid-zwnj-error.js +language/statements/class/elements/syntax/valid/grammar-field-classelementname-initializer-alt.js +language/statements/class/elements/syntax/valid/grammar-field-identifier-alt.js +language/statements/class/elements/syntax/valid/grammar-fields-multi-line.js +language/statements/class/elements/syntax/valid/grammar-field-identifier.js +language/statements/class/elements/syntax/valid/grammar-field-classelementname-initializer.js +language/statements/class/elements/new-sc-line-method-rs-field-identifier.js +language/statements/class/elements/static-string-literal-name-init-err-contains-super.js +language/statements/class/elements/after-same-line-static-async-method-rs-field-identifier-initializer.js +language/statements/class/elements/new-no-sc-line-method-rs-field-identifier.js +language/statements/class/elements/after-same-line-static-method-computed-symbol-names.js +language/statements/class/elements/after-same-line-static-async-method-computed-names.js +language/statements/class/elements/public-class-field-initialization-on-super-class-with-setter.js +language/statements/class/elements/fields-asi-same-line-2.js +language/statements/class/elements/abrupt-completition-on-field-initializer.js +language/statements/class/elements/init-value-defined-after-class.js +language/statements/class/elements/fields-asi-4.js +language/statements/class/elements/after-same-line-gen-rs-field-identifier.js +language/statements/class/elements/static-string-literal-name-init-err-contains-arguments.js +language/statements/class/elements/nested-arrow-fnc-init-err-contains-arguments.js +language/statements/class/elements/new-sc-line-method-literal-names-asi.js +language/statements/class/elements/new-sc-line-gen-rs-field-identifier.js +language/statements/class/elements/after-same-line-static-async-method-literal-names-asi.js +language/statements/class/elements/same-line-method-rs-field-identifier-initializer.js +language/statements/class/elements/wrapped-in-sc-string-literal-names.js +language/statements/class/elements/after-same-line-static-async-gen-rs-field-identifier-initializer.js +language/statements/class/elements/new-no-sc-line-method-computed-symbol-names.js +language/statements/class/elements/nested-static-literal-init-err-contains-super.js +language/statements/class/elements/same-line-method-rs-field-identifier.js +language/statements/class/elements/literal-name-init-err-contains-super.js +language/statements/class/elements/after-same-line-static-gen-string-literal-names.js +language/statements/class/elements/after-same-line-static-async-method-literal-names.js +language/statements/class/elements/multiple-stacked-definitions-computed-names.js +language/statements/class/elements/nested-string-literal-name-init-err-contains-arguments.js +language/statements/class/elements/after-same-line-gen-rs-field-identifier-initializer.js +language/statements/class/elements/after-same-line-static-method-computed-names.js +language/statements/class/elements/same-line-method-string-literal-names.js +language/statements/class/elements/after-same-line-static-async-method-rs-field-identifier.js +language/statements/class/elements/wrapped-in-sc-rs-field-identifier-initializer.js +language/statements/class/elements/after-same-line-static-async-gen-string-literal-names.js +language/statements/class/elements/after-same-line-method-literal-names.js +language/statements/class/elements/nested-literal-name-init-err-contains-arguments.js +language/statements/class/elements/same-line-gen-literal-names.js +language/statements/class/elements/multiple-stacked-definitions-literal-names-asi.js +language/statements/class/elements/wrapped-in-sc-literal-names-asi.js +language/statements/class/elements/redeclaration-symbol.js +language/statements/class/elements/same-line-method-literal-names.js +language/statements/class/elements/after-same-line-method-rs-field-identifier-initializer.js +language/statements/class/elements/same-line-async-method-rs-field-identifier-initializer.js +language/statements/class/elements/nested-comp-name-init-err-contains-super.js +language/statements/class/elements/fields-computed-name-propname-constructor.js +language/statements/class/elements/same-line-gen-string-literal-names.js +language/statements/class/elements/nested-equality-init-err-contains-arguments.js +language/statements/class/elements/static-literal-init-err-contains-super.js +language/statements/class/elements/after-same-line-gen-computed-symbol-names.js +language/statements/class/elements/nested-static-comp-name-init-err-contains-arguments.js +language/statements/class/elements/nested-equality-init-err-contains-super.js +language/statements/class/elements/fields-string-name-propname-constructor.js +language/statements/class/elements/nested-typeof-init-err-contains-arguments.js +language/statements/class/elements/same-line-async-gen-literal-names.js +language/statements/class/elements/wrapped-in-sc-literal-names.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-condition-expression-true.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-identifier.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-numeric-literal.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-expression-logical-or.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-additive-expression-subtract.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-assignment-expression-logical-and.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-expression-coalesce.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-assignment-expression-bitwise-or.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-expression-logical-and.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-multiplicative-expression-div.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-additive-expression-add.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-multiplicative-expression-mult.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-multiplicative-expression-mult.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-string-literal.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-function-declaration.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-condition-expression-true.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-assignment-expression-coalesce.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-assignment-expression-assignment.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-exponetiation-expression.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-integer-e-notational-literal.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-exponetiation-expression.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-integer-separators.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-condition-expression-false.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-multiplicative-expression-div.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-expression-coalesce.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-decimal-e-notational-literal.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-assignment-expression-logical-or.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-condition-expression-false.js +language/statements/class/classelementname-abrupt-completion.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-math.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-additive-expression-subtract.js +language/statements/class/elements/multiple-definitions-string-literal-names.js +language/expressions/class/elements/multiple-definitions-string-literal-names.js +language/expressions/class/elements/multiple-definitions-literal-names.js +language/statements/class/elements/multiple-definitions-literal-names.js +language/expressions/class/elements/multiple-definitions-rs-field-identifier-initializer.js +language/expressions/class/elements/multiple-definitions-literal-names-asi.js +language/statements/class/elements/multiple-definitions-literal-names-asi.js +language/statements/class/elements/multiple-definitions-rs-field-identifier.js +language/statements/class/elements/multiple-definitions-rs-field-identifier-initializer.js +language/expressions/class/elements/multiple-definitions-rs-field-identifier.js +language/expressions/class/elements/multiple-definitions-computed-symbol-names.js +language/statements/class/elements/multiple-definitions-computed-symbol-names.js +language/expressions/class/elements/multiple-definitions-computed-names.js +language/statements/class/elements/multiple-definitions-computed-names.js +language/statements/class/elements/class-field-on-frozen-objects.js +language/statements/class/elements/public-class-field-initialization-is-visible-to-proxy.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-generator-function-declaration.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-function-expression.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-arrow-function-expression.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-arrow-function-expression.js +language/statements/class/cpn-class-decl-fields-methods-computed-property-name-from-async-arrow-function-expression.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-async-arrow-function-expression.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-generator-function-declaration.js +language/statements/class/cpn-class-decl-fields-computed-property-name-from-function-expression.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-generator-function-declaration.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-function-expression.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-async-arrow-function-expression.js +language/expressions/class/cpn-class-expr-fields-methods-computed-property-name-from-arrow-function-expression.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-generator-function-declaration.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-function-expression.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-async-arrow-function-expression.js +language/expressions/class/cpn-class-expr-fields-computed-property-name-from-arrow-function-expression.js +language/expressions/class/elements/evaluation-error/computed-name-valueof-err.js +language/statements/class/elements/evaluation-error/computed-name-valueof-err.js +language/statements/class/elements/evaluation-error/computed-name-tostring-err.js +language/expressions/class/elements/evaluation-error/computed-name-tostring-err.js +language/expressions/class/elements/evaluation-error/computed-name-toprimitive-err.js +language/statements/class/elements/evaluation-error/computed-name-toprimitive-err.js +language/expressions/class/elements/computed-name-toprimitive.js +language/statements/class/elements/computed-name-toprimitive.js +language/expressions/class/elements/evaluation-error/computed-name-toprimitive-returns-noncallable.js +language/statements/class/elements/evaluation-error/computed-name-toprimitive-returns-noncallable.js +language/expressions/class/elements/evaluation-error/computed-name-toprimitive-returns-nonobject.js +language/statements/class/elements/evaluation-error/computed-name-toprimitive-returns-nonobject.js +language/expressions/class/elements/computed-name-toprimitive-symbol.js +language/statements/class/elements/computed-name-toprimitive-symbol.js \ No newline at end of file -- Gitee From afb289cf9a4189341a1a3dc061a592e1ff64e117 Mon Sep 17 00:00:00 2001 From: huyunhui Date: Sat, 18 Nov 2023 22:22:53 +0800 Subject: [PATCH 2/2] es2abc support class private elements Issue:https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/I8I539 Signed-off-by: huyunhui Change-Id: I0b04410fbb39980bd3fa06d6ea90cc6da394c129 --- es2panda/BUILD.gn | 1 + es2panda/binder/binder.cpp | 26 + es2panda/binder/binder.h | 2 + es2panda/binder/scope.cpp | 27 + es2panda/binder/scope.h | 3 + es2panda/compiler/base/lreference.cpp | 58 +- es2panda/compiler/core/emitter/emitter.cpp | 10 + es2panda/compiler/core/function.cpp | 19 +- es2panda/compiler/core/pandagen.cpp | 44 + es2panda/compiler/core/pandagen.h | 8 + es2panda/ir/astNodeMapping.h | 1 + es2panda/ir/base/classDefinition.cpp | 163 ++- es2panda/ir/base/classDefinition.h | 57 +- es2panda/ir/base/classProperty.h | 5 + es2panda/ir/base/methodDefinition.h | 7 +- es2panda/ir/expressions/binaryExpression.cpp | 31 + es2panda/ir/expressions/binaryExpression.h | 5 + es2panda/ir/expressions/literal.h | 2 + .../ir/expressions/literals/taggedLiteral.h | 2 +- es2panda/ir/expressions/memberExpression.cpp | 33 + es2panda/ir/expressions/memberExpression.h | 5 + es2panda/ir/expressions/privateIdentifier.cpp | 53 + es2panda/ir/expressions/privateIdentifier.h | 80 ++ es2panda/parser/expressionParser.cpp | 86 +- es2panda/parser/parserImpl.cpp | 102 +- es2panda/parser/parserImpl.h | 11 + test262/es2022_tests.txt | 945 +++++++++++++++++- 27 files changed, 1709 insertions(+), 77 deletions(-) create mode 100644 es2panda/ir/expressions/privateIdentifier.cpp create mode 100644 es2panda/ir/expressions/privateIdentifier.h diff --git a/es2panda/BUILD.gn b/es2panda/BUILD.gn index f865882ca2..b56e183070 100644 --- a/es2panda/BUILD.gn +++ b/es2panda/BUILD.gn @@ -88,6 +88,7 @@ es2panda_src = [ "ir/expressions/newExpression.cpp", "ir/expressions/objectExpression.cpp", "ir/expressions/omittedExpression.cpp", + "ir/expressions/privateIdentifier.cpp", "ir/expressions/sequenceExpression.cpp", "ir/expressions/superExpression.cpp", "ir/expressions/taggedTemplateExpression.cpp", diff --git a/es2panda/binder/binder.cpp b/es2panda/binder/binder.cpp index 8c829d604c..9359e1332b 100644 --- a/es2panda/binder/binder.cpp +++ b/es2panda/binder/binder.cpp @@ -30,6 +30,7 @@ #include "ir/expressions/assignmentExpression.h" #include "ir/expressions/identifier.h" #include "ir/expressions/objectExpression.h" +#include "ir/expressions/privateIdentifier.h" #include "ir/expressions/literals/numberLiteral.h" #include "ir/module/exportNamedDeclaration.h" #include "ir/module/exportSpecifier.h" @@ -660,6 +661,10 @@ void Binder::ResolveReference(const ir::AstNode *parent, ir::AstNode *childNode) ResolveReferences(childNode); break; } + case ir::AstNodeType::PRIVATE_IDENTIFIER: { + CheckPrivateDeclaration(childNode->AsPrivateIdentifier()); + break; + } case ir::AstNodeType::SUPER_EXPRESSION: { VariableScope *varScope = scope_->EnclosingVariableScope(); varScope->AddFlag(VariableScopeFlags::USE_SUPER); @@ -1009,4 +1014,25 @@ void Binder::ReplaceConstReferenceWithInitialization(const ir::Identifier *ident }, this); } +void Binder::CheckPrivateDeclaration(const ir::PrivateIdentifier *privateIdent) +{ + auto name = privateIdent->Name(); + auto scope = scope_; + while (scope != nullptr) { + if (scope->Node() && scope->Node()->IsClassDefinition()) { + const auto *classDef = scope->Node()->AsClassDefinition(); + if (classDef->Find(name)) { + return; + } + } + scope = scope->Parent(); + } + + auto pos = privateIdent->Start(); + lexer::LineIndex index(program_->SourceCode()); + lexer::SourceLocation loc = index.GetLocation(pos); + + throw Error{ErrorType::SYNTAX, "Use private property before declaration", loc.line, loc.col}; +} + } // namespace panda::es2panda::binder diff --git a/es2panda/binder/binder.h b/es2panda/binder/binder.h index 1f51a5ed9e..fe39faf684 100644 --- a/es2panda/binder/binder.h +++ b/es2panda/binder/binder.h @@ -31,6 +31,7 @@ class Expression; class ExportNamedDeclaration; class ForUpdateStatement; class Identifier; +class PrivateIdentifier; class ScriptFunction; class Statement; class VariableDeclarator; @@ -213,6 +214,7 @@ private: void ValidateExportDecl(const ir::ExportNamedDeclaration *exportDecl); void StoreAndCheckSpecialFunctionName(std::string &internalNameStr, std::string recordName); void ReplaceConstReferenceWithInitialization(const ir::Identifier *ident, const Decl *decl); + void CheckPrivateDeclaration(const ir::PrivateIdentifier *privateIdent); // TypeScript specific functions void BuildTSSignatureDeclarationBaseParams(const ir::AstNode *typeNode); diff --git a/es2panda/binder/scope.cpp b/es2panda/binder/scope.cpp index 808c98638d..53eccb7f28 100644 --- a/es2panda/binder/scope.cpp +++ b/es2panda/binder/scope.cpp @@ -180,6 +180,33 @@ std::pair Scope::Find(const ir::Expression *expr, bool onlyL UNREACHABLE(); } +ir::PrivateNameFindResult Scope::FindPrivateName(const util::StringView &name, bool isSetter) const +{ + uint32_t lexLevel = 0; + const auto *iter = this; + + while(iter != nullptr) { + if (iter->Node() && iter->Node()->IsClassDefinition()) { + const auto *classDef = iter->Node()->AsClassDefinition(); + if (name.Is("#method") || classDef->Find(name)) { + return {lexLevel, classDef->GetPrivateProperty(name, isSetter)}; + } + if (classDef->NeedEnv()) { + lexLevel++; + } + } + + if (iter->IsVariableScope()) { + if (iter->AsVariableScope()->NeedLexEnv()) { + lexLevel++; + } + } + iter = iter->Parent(); + } + + UNREACHABLE(); +} + Decl *Scope::FindDecl(const util::StringView &name) const { for (auto *it : decls_) { diff --git a/es2panda/binder/scope.h b/es2panda/binder/scope.h index 120d8b8371..56a6fd53fb 100644 --- a/es2panda/binder/scope.h +++ b/es2panda/binder/scope.h @@ -32,6 +32,7 @@ class IRNode; namespace panda::es2panda::ir { class ScriptFunction; +class PrivateNameFindResult; } // namespace panda::es2panda::ir namespace panda::es2panda::binder { @@ -329,6 +330,8 @@ public: std::pair Find(const ir::Expression *expr, bool onlyLevel = false) const; + ir::PrivateNameFindResult FindPrivateName(const util::StringView &name, bool isSetter = false) const; + Decl *FindDecl(const util::StringView &name) const; bool HasVarDecl(const util::StringView &name) const; diff --git a/es2panda/compiler/base/lreference.cpp b/es2panda/compiler/base/lreference.cpp index a446b0da3f..5962a51fd9 100644 --- a/es2panda/compiler/base/lreference.cpp +++ b/es2panda/compiler/base/lreference.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -52,7 +53,36 @@ void LReference::GetValue() break; } case ReferenceKind::MEMBER: { - pg_->LoadObjProperty(node_, obj_, prop_); + if (node_->AsMemberExpression()->AccessPrivateProperty()) { + auto name = node_->AsMemberExpression()->Property()->AsPrivateIdentifier()->Name(); + auto result = pg_->Scope()->FindPrivateName(name); + if (!result.result.isMethod) { + pg_->LoadAccumulator(node_, obj_); + pg_->LoadPrivateProperty(node_, result.lexLevel, result.result.slot); + break; + } + + if (result.result.isStatic) { + pg_->LoadLexicalVar(node_, result.lexLevel, result.result.validateMethodSlot); + pg_->Equal(node_, obj_); + pg_->ThrowTypeErrorIfFalse(node_, "Object does not have private property"); + } else { + pg_->LoadAccumulator(node_, obj_); + pg_->LoadPrivateProperty(node_, result.lexLevel, result.result.validateMethodSlot); + } + if (result.result.isSetter) { + pg_->ThrowTypeError(node_, "Property is not defined with Getter"); + } + if (result.result.isGetter) { + pg_->LoadAccumulator(node_, obj_); + pg_->LoadPrivateProperty(node_, result.lexLevel, result.result.slot); + break; + } + pg_->LoadLexicalVar(node_, result.lexLevel, result.result.slot); + + } else { + pg_->LoadObjProperty(node_, obj_, prop_); + } break; } default: { @@ -71,6 +101,32 @@ void LReference::SetValue() case ReferenceKind::MEMBER: { if (node_->AsMemberExpression()->Object()->IsSuperExpression()) { pg_->StoreSuperProperty(node_, obj_, prop_); + } else if (node_->AsMemberExpression()->AccessPrivateProperty()) { + compiler::RegScope rs(pg_); + VReg valueReg = pg_->AllocReg(); + + auto name = node_->AsMemberExpression()->Property()->AsPrivateIdentifier()->Name(); + auto result = pg_->Scope()->FindPrivateName(name, true); + if (!result.result.isMethod ) { + pg_->StorePrivateProperty(node_, result.lexLevel, result.result.slot, obj_); + break; + } + if (!result.result.isSetter) { + pg_->ThrowTypeError(node_, "Method is not writable"); + } + // store value + pg_->StoreAccumulator(node_, valueReg); + + if (result.result.isStatic) { + pg_->LoadLexicalVar(node_, result.lexLevel, result.result.validateMethodSlot); + pg_->Equal(node_, obj_); + pg_->ThrowTypeErrorIfFalse(node_, "Object does not have private property"); + } else { + pg_->LoadAccumulator(node_, obj_); + pg_->LoadPrivateProperty(node_, result.lexLevel, result.result.validateMethodSlot); + } + pg_->LoadAccumulator(node_, valueReg); + pg_->StorePrivateProperty(node_, result.lexLevel, result.result.slot, obj_); } else { pg_->StoreObjProperty(node_, obj_, prop_); } diff --git a/es2panda/compiler/core/emitter/emitter.cpp b/es2panda/compiler/core/emitter/emitter.cpp index 62e6875bfe..c0e43e1f25 100644 --- a/es2panda/compiler/core/emitter/emitter.cpp +++ b/es2panda/compiler/core/emitter/emitter.cpp @@ -537,6 +537,16 @@ void Emitter::GenBufferLiterals(ArenaVector(literal->GetInt()); break; } + case ir::LiteralTag::GETTER: { + valueLit.tag_ = panda::panda_file::LiteralTag::GETTER; + valueLit.value_ = literal->GetMethod().Mutf8(); + break; + } + case ir::LiteralTag::SETTER: { + valueLit.tag_ = panda::panda_file::LiteralTag::SETTER; + valueLit.value_ = literal->GetMethod().Mutf8(); + break; + } // TODO: support ir::LiteralTag::ASYNC_GENERATOR_METHOD case ir::LiteralTag::NULL_VALUE: { valueLit.tag_ = panda::panda_file::LiteralTag::NULLVALUE; diff --git a/es2panda/compiler/core/function.cpp b/es2panda/compiler/core/function.cpp index cc5c386395..1f26373947 100644 --- a/es2panda/compiler/core/function.cpp +++ b/es2panda/compiler/core/function.cpp @@ -125,7 +125,10 @@ static void CompileFunctionParameterDeclaration(PandaGen *pg, const ir::ScriptFu static void CompileField(PandaGen *pg, const ir::ClassProperty *prop, VReg thisReg, int32_t level) { Operand op; - if (prop->IsComputed() && prop->NeedCompileKey()) { + ir::PrivateNameFindResult result; + if (prop->IsPrivate()) { + result = pg->Scope()->FindPrivateName(prop->Key()->AsPrivateIdentifier()->Name()); + } else if (prop->IsComputed() && prop->NeedCompileKey()) { auto slot = prop->Parent()->AsClassDefinition()->GetSlot(prop->Key()); pg->LoadLexicalVar(prop->Key(), level, slot); op = pg->AllocReg(); @@ -141,12 +144,17 @@ static void CompileField(PandaGen *pg, const ir::ClassProperty *prop, VReg thisR prop->Value()->Compile(pg); } - pg->DefineClassField(prop, thisReg, op); + if (prop->IsPrivate()) { + pg->DefineClassPrivateField(prop, result.lexLevel, result.result.slot, thisReg); + } else { + pg->DefineClassField(prop, thisReg, op); + } } static void CompileClassInitializer(PandaGen *pg, const ir::ScriptFunction *decl, bool isStatic) { - const auto &statements = decl->Parent()->Parent()->Parent()->AsClassDefinition()->Body(); + const auto *classDef = decl->Parent()->Parent()->Parent()->AsClassDefinition(); + const auto &statements = classDef->Body(); RegScope rs(pg); auto thisReg = pg->AllocReg(); @@ -154,6 +162,11 @@ static void CompileClassInitializer(PandaGen *pg, const ir::ScriptFunction *decl pg->StoreAccumulator(decl, thisReg); auto [level, slot] = pg->Scope()->Find(nullptr, true); + if (!isStatic && classDef->HasInstancePrivateMethod()) { + ir::PrivateNameFindResult result = pg->Scope()->FindPrivateName("#method"); + pg->LoadConst(classDef, Constant::JS_UNDEFINED); + pg->DefineClassPrivateField(classDef, result.lexLevel, result.result.slot, thisReg); + } for (auto const &stmt : statements) { if (stmt->IsMethodDefinition()) { continue; diff --git a/es2panda/compiler/core/pandagen.cpp b/es2panda/compiler/core/pandagen.cpp index 8ebd498b6b..fce3b571f2 100644 --- a/es2panda/compiler/core/pandagen.cpp +++ b/es2panda/compiler/core/pandagen.cpp @@ -458,6 +458,11 @@ void PandaGen::DefineClassField(const ir::AstNode *node, VReg obj, const Operand DefineFieldByName(node, obj, std::get(prop)); } +void PandaGen::DefineClassPrivateField(const ir::AstNode *node, uint32_t level, uint32_t slot, VReg obj) +{ + ra_.Emit(node, level, slot, obj); +} + void PandaGen::StoreOwnProperty(const ir::AstNode *node, VReg obj, const Operand &prop, bool nameSetting) { if (std::holds_alternative(prop)) { @@ -2170,4 +2175,43 @@ void PandaGen::ReArrangeIc() } } +void PandaGen::CreatePrivateProperty(const ir::AstNode *node, uint32_t num, int32_t bufIdx) +{ + std::string idxStr = std::string(context_->Binder()->Program()->RecordName()) + "_" + std::to_string(bufIdx); + util::UString litId(idxStr, allocator_); + ra_.Emit(node, num, litId.View()); +} + +void PandaGen::TestIn(const ir::AstNode *node, uint32_t level, uint32_t slot) +{ + ra_.Emit(node, 0, level, slot); +} + +void PandaGen::LoadPrivateProperty(const ir::AstNode *node, uint32_t level, uint32_t slot) +{ + ra_.Emit(node, 0, level, slot); +} + +void PandaGen::StorePrivateProperty(const ir::AstNode *node, uint32_t level, uint32_t slot, VReg obj) +{ + ra_.Emit(node, 0, level, slot, obj); +} +void PandaGen::ThrowTypeErrorIfFalse(const ir::AstNode *node, util::StringView str) +{ + auto *trueLabel = AllocLabel(); + BranchIfTrue(node, trueLabel); + ThrowTypeError(node, str); + SetLabel(node, trueLabel); +} + +void PandaGen::ThrowTypeError(const ir::AstNode *node, util::StringView str) +{ + LoadAccumulatorString(node, str); + VReg reg = AllocReg(); + StoreAccumulator(node, reg); + TryLoadGlobalByName(node, "TypeError"); + ra_.Emit(node, 0, reg); + EmitThrow(node); +} + } // namespace panda::es2panda::compiler diff --git a/es2panda/compiler/core/pandagen.h b/es2panda/compiler/core/pandagen.h index 11c2c38c5f..c7ce53dc7c 100644 --- a/es2panda/compiler/core/pandagen.h +++ b/es2panda/compiler/core/pandagen.h @@ -296,6 +296,7 @@ public: void StoreObjProperty(const ir::AstNode *node, VReg obj, const Operand &prop); void DefineClassField(const ir::AstNode *node, VReg obj, const Operand &prop); + void DefineClassPrivateField(const ir::AstNode *node, uint32_t level, uint32_t slot, VReg obj); void StoreOwnProperty(const ir::AstNode *node, VReg obj, const Operand &prop, bool nameSetting = false); void DeleteObjProperty(const ir::AstNode *node, VReg obj, const Operand &prop); void LoadAccumulator(const ir::AstNode *node, VReg reg); @@ -481,6 +482,13 @@ public: void ReArrangeIc(); + void CreatePrivateProperty(const ir::AstNode *node, uint32_t num, int32_t bufIdx); + void TestIn(const ir::AstNode *node, uint32_t level, uint32_t slot); + void LoadPrivateProperty(const ir::AstNode *node, uint32_t level, uint32_t slot); + void StorePrivateProperty(const ir::AstNode *node, uint32_t level, uint32_t slot, VReg obj); + void ThrowTypeErrorIfFalse(const ir::AstNode *node, util::StringView str); + void ThrowTypeError(const ir::AstNode *node, util::StringView str); + /* * Since the [Function] is not implemented yet, We compile the test262's framework code * which obtains the [global] Object as following into [LoadConst.Global] directly. diff --git a/es2panda/ir/astNodeMapping.h b/es2panda/ir/astNodeMapping.h index 9bbf24dedd..746d8f0f23 100644 --- a/es2panda/ir/astNodeMapping.h +++ b/es2panda/ir/astNodeMapping.h @@ -65,6 +65,7 @@ _(NULL_LITERAL, NullLiteral) \ _(NUMBER_LITERAL, NumberLiteral) \ _(OMITTED_EXPRESSION, OmittedExpression) \ + _(PRIVATE_IDENTIFIER, PrivateIdentifier) \ _(PROPERTY, Property) \ _(REGEXP_LITERAL, RegExpLiteral) \ _(RETURN_STATEMENT, ReturnStatement) \ diff --git a/es2panda/ir/base/classDefinition.cpp b/es2panda/ir/base/classDefinition.cpp index abd82f266d..00bdcbfcbd 100644 --- a/es2panda/ir/base/classDefinition.cpp +++ b/es2panda/ir/base/classDefinition.cpp @@ -130,11 +130,10 @@ void ClassDefinition::InitializeClassName(compiler::PandaGen *pg) const } // NOLINTNEXTLINE(google-runtime-references) -int32_t ClassDefinition::CreateClassStaticProperties(compiler::PandaGen *pg, util::BitSet &compiled) const +int32_t ClassDefinition::CreateClassPublicBuffer(compiler::PandaGen *pg, util::BitSet &compiled) const { auto *buf = pg->NewLiteralBuffer(); compiler::LiteralBuffer staticBuf(pg->Allocator()); - bool seenComputed = false; uint32_t instancePropertyCount = 0; std::unordered_map propNameMap; std::unordered_map staticPropNameMap; @@ -148,14 +147,17 @@ int32_t ClassDefinition::CreateClassStaticProperties(compiler::PandaGen *pg, uti const ir::MethodDefinition *prop = properties[i]->AsMethodDefinition(); if (prop->Computed()) { - seenComputed = true; - continue; + break; } if (prop->IsAccessor()) { break; } + if (prop->IsPrivate()) { + continue; + } + if (prop->IsAbstract()) { compiled.Set(i); continue; @@ -173,10 +175,6 @@ int32_t ClassDefinition::CreateClassStaticProperties(compiler::PandaGen *pg, uti size_t bufferPos = literalBuf->Literals().size(); auto res = nameMap.insert({name, bufferPos}); if (res.second) { - if (seenComputed) { - break; - } - if (!prop->IsStatic()) { instancePropertyCount++; } @@ -226,6 +224,55 @@ int32_t ClassDefinition::CreateClassStaticProperties(compiler::PandaGen *pg, uti return pg->AddLiteralBuffer(buf); } +int32_t ClassDefinition::CreateClassPrivateBuffer(compiler::PandaGen *pg) const +{ + auto *buf = pg->NewLiteralBuffer(); + compiler::LiteralBuffer staticBuf(pg->Allocator()); + uint32_t instancePropertyCount = 0; + + for (const auto *prop : body_) { + if (!prop->IsMethodDefinition()) { + continue; + } + + const auto *methodDef = prop->AsMethodDefinition(); + if (!methodDef->IsPrivate()) { + continue; + } + + compiler::LiteralBuffer *literalBuf = methodDef->IsStatic() ? &staticBuf : (instancePropertyCount++, buf); + const ir::FunctionExpression *func = methodDef->Value()->AsFunctionExpression(); + const util::StringView &internalName = func->Function()->Scope()->InternalName(); + Literal *value = nullptr; + Literal *methodAffiliate = pg->Allocator()->New(LiteralTag::METHODAFFILIATE, + func->Function()->FormalParamsLength()); + switch (methodDef->Kind()) { + case MethodDefinitionKind::METHOD: { + value = pg->Allocator()->New(LiteralTag::METHOD, internalName); + break; + } + case MethodDefinitionKind::GET: { + value = pg->Allocator()->New(LiteralTag::GETTER, internalName); + break; + } + case MethodDefinitionKind::SET: { + value = pg->Allocator()->New(LiteralTag::SETTER, internalName); + break; + } + default: { + UNREACHABLE(); + } + } + literalBuf->Add(value); + literalBuf->Add(methodAffiliate); + } + + buf->Insert(&staticBuf); + buf->Add(pg->Allocator()->New(instancePropertyCount)); + + return pg->AddLiteralBuffer(buf); +} + void ClassDefinition::CompileMissingProperties(compiler::PandaGen *pg, const util::BitSet &compiled, compiler::VReg classReg) const { @@ -246,6 +293,10 @@ void ClassDefinition::CompileMissingProperties(compiler::PandaGen *pg, const uti continue; } + if (prop->IsPrivate()) { + continue; + } + if (prop->IsAbstract()) { continue; } @@ -353,16 +404,23 @@ void ClassDefinition::Compile(compiler::PandaGen *pg) const if (NeedEnv()) { pg->NewLexEnv(this, slot_); CompileComputedKeys(pg); + int32_t bufIdx = CreateClassPrivateBuffer(pg); + pg->CreatePrivateProperty(this, privateFieldCnt_, bufIdx); } compiler::VReg baseReg = CompileHeritageClause(pg); util::StringView ctorId = ctor_->Function()->Scope()->InternalName(); util::BitSet compiled(body_.size()); - int32_t bufIdx = CreateClassStaticProperties(pg, compiled); + int32_t bufIdx = CreateClassPublicBuffer(pg, compiled); pg->DefineClassWithBuffer(this, ctorId, bufIdx, baseReg); pg->StoreAccumulator(this, classReg); + + if (HasStaticPrivateMethod()) { + pg->StoreLexicalVar(this, 0, staticMethodValidation_); + } + InitializeClassName(pg); CompileMissingProperties(pg, compiled, classReg); @@ -417,10 +475,54 @@ void ClassDefinition::UpdateSelf(const NodeUpdater &cb, binder::Binder *binder) } } +Result ClassDefinition::GetPrivateProperty(const util::StringView &name, bool isSetter) const +{ + if (name.Is("#method")) { + return {instanceMethodValidation_, false, false, false, false, 0}; + } + + uint32_t slot{0}; + bool setter{false}; + bool getter{false}; + + if (privateNames_.find(name) != privateNames_.end()) { + slot = privateNames_.find(name)->second; + } else { + auto accessor = isSetter ? privateSetters_ :privateGetters_; + auto unexpectedAccessor = isSetter ? privateGetters_ :privateSetters_; + + if (accessor.find(name) != accessor.end()) { + setter = isSetter; + getter = !setter; + slot = accessor.find(name)->second; + } else { + getter = isSetter; + setter = !getter; + slot = unexpectedAccessor.find(name)->second; + } + } + + uint32_t validateMethodSlot{0}; + + if (IsMethod(slot)) { + validateMethodSlot = IsStaticMethod(slot) ? staticMethodValidation_ : instanceMethodValidation_; + } + + return {slot, IsMethod(slot), IsStaticMethod(slot), getter, setter, validateMethodSlot}; +} + void ClassDefinition::BuildClassEnvironment() { + int instancePrivateMethodCnt = 0; + int staticPrivateMethodCnt = 0; + std::vector privateProperties; for (const auto *stmt : body_) { if (stmt->IsMethodDefinition()) { + auto *methodDef = stmt->AsMethodDefinition(); + if (methodDef->IsPrivate()) { + privateProperties.push_back(stmt); + methodDef->IsStatic() ? staticPrivateMethodCnt ++ : instancePrivateMethodCnt++; + } continue; } @@ -439,6 +541,49 @@ void ClassDefinition::BuildClassEnvironment() } else { needInstanceInitializer_ = true; } + if (prop->Key()->IsPrivateIdentifier()) { + privateFieldCnt_++; + privateProperties.push_back(stmt); + } + } + + instancePrivateMethodStartSlot_ = slot_ + privateFieldCnt_; + staticPrivateMethodStartSlot_ = instancePrivateMethodStartSlot_ + instancePrivateMethodCnt; + uint32_t instancePrivateMethodSlot = instancePrivateMethodStartSlot_; + uint32_t staticPrivateMethodSlot = staticPrivateMethodStartSlot_; + for (auto stmt : privateProperties) { + if (stmt->IsClassProperty()) { + privateNames_[stmt->AsClassProperty()->Key()->AsPrivateIdentifier()->Name()] = slot_++; + continue; + } + ASSERT(stmt->IsMethodDefinition()); + auto *methodDef = stmt->AsMethodDefinition(); + uint32_t *start = methodDef->IsStatic() ? &staticPrivateMethodSlot : &instancePrivateMethodSlot; + auto name = methodDef->Key()->AsPrivateIdentifier()->Name(); + switch (methodDef->Kind()) { + case MethodDefinitionKind::GET: { + privateGetters_[name] = (*start)++; + continue; + } + case MethodDefinitionKind::SET: { + privateSetters_[name] = (*start)++; + continue; + } + default: { + privateNames_[name]= (*start)++; + continue; + } + } + } + slot_ = staticPrivateMethodSlot; + privateMethodEndSlot_ = slot_; + if (instancePrivateMethodCnt != 0) { + needInstanceInitializer_ = true; + instanceMethodValidation_ = slot_++; + } + + if (staticPrivateMethodCnt != 0) { + staticMethodValidation_ = slot_++; } if (NeedInstanceInitializer()) { diff --git a/es2panda/ir/base/classDefinition.h b/es2panda/ir/base/classDefinition.h index 79c053702f..db07d46a19 100644 --- a/es2panda/ir/base/classDefinition.h +++ b/es2panda/ir/base/classDefinition.h @@ -19,6 +19,7 @@ #include #include #include +#include #include namespace panda::es2panda::compiler { @@ -43,6 +44,22 @@ class TSTypeParameterInstantiation; class TSClassImplements; class TSIndexSignature; +class Result { +public: + uint32_t slot; + bool isMethod; + bool isStatic; + bool isGetter; + bool isSetter; + uint32_t validateMethodSlot; +}; + +class PrivateNameFindResult { +public: + int32_t lexLevel; + ir::Result result; +}; + class ClassDefinition : public AstNode { public: explicit ClassDefinition(binder::LocalScope *scope, Identifier *ident, TSTypeParameterDeclaration *typeParams, @@ -190,6 +207,16 @@ public: return needInstanceInitializer_; } + bool HasInstancePrivateMethod() const + { + return instanceMethodValidation_ != 0; + } + + bool HasStaticPrivateMethod() const + { + return staticMethodValidation_ != 0; + } + bool NeedEnv() const { return slot_ != 0; @@ -201,11 +228,17 @@ public: return computedNames_.find(node)->second; } + bool Find(const util::StringView &name) const + { + return (privateNames_.count(name) + privateGetters_.count(name) + privateSetters_.count(name) != 0); + } + const FunctionExpression *Ctor() const; util::StringView GetName() const; void BuildClassEnvironment(); + Result GetPrivateProperty(const util::StringView &name, bool isSetter) const; void Iterate(const NodeTraverser &cb) const override; void Dump(ir::AstDumper *dumper) const override; @@ -216,12 +249,23 @@ public: private: compiler::VReg CompileHeritageClause(compiler::PandaGen *pg) const; void InitializeClassName(compiler::PandaGen *pg) const; - int32_t CreateClassStaticProperties(compiler::PandaGen *pg, util::BitSet &compiled) const; + int32_t CreateClassPublicBuffer(compiler::PandaGen *pg, util::BitSet &compiled) const; + int32_t CreateClassPrivateBuffer(compiler::PandaGen *pg) const; void CompileMissingProperties(compiler::PandaGen *pg, const util::BitSet &compiled, compiler::VReg classReg) const; void StaticInitialize(compiler::PandaGen *pg, compiler::VReg classReg) const; void InstanceInitialize(compiler::PandaGen *pg, compiler::VReg classReg) const; void CompileComputedKeys(compiler::PandaGen *pg) const; + bool IsMethod(uint32_t slot) const + { + return slot >= instancePrivateMethodStartSlot_ && slot < privateMethodEndSlot_; + } + + bool IsStaticMethod(uint32_t slot) const + { + return slot >= staticPrivateMethodStartSlot_; + } + binder::LocalScope *scope_; Identifier *ident_; TSTypeParameterDeclaration *typeParams_; @@ -234,12 +278,21 @@ private: ArenaVector body_; ArenaVector indexSignatures_; std::unordered_map computedNames_; - uint32_t slot_ {0}; + std::unordered_map privateNames_; + std::unordered_map privateGetters_; + std::unordered_map privateSetters_; bool declare_; bool abstract_; bool exportDefault_; bool needStaticInitializer_ {false}; bool needInstanceInitializer_ {false}; + uint32_t slot_ {0}; + uint32_t privateFieldCnt_ {0}; + uint32_t instancePrivateMethodStartSlot_ {0}; + uint32_t staticPrivateMethodStartSlot_ {0}; + uint32_t privateMethodEndSlot_ {0}; + uint32_t instanceMethodValidation_ {0}; + uint32_t staticMethodValidation_ {0}; }; } // namespace panda::es2panda::ir diff --git a/es2panda/ir/base/classProperty.h b/es2panda/ir/base/classProperty.h index 3a9f4a3cdc..47c915b53e 100644 --- a/es2panda/ir/base/classProperty.h +++ b/es2panda/ir/base/classProperty.h @@ -102,6 +102,11 @@ public: return isComputed_; } + bool IsPrivate() const + { + return key_->IsPrivateIdentifier(); + } + void SetComputed(bool computed) { isComputed_ = computed; diff --git a/es2panda/ir/base/methodDefinition.h b/es2panda/ir/base/methodDefinition.h index 1d3a1e2efa..217d886302 100644 --- a/es2panda/ir/base/methodDefinition.h +++ b/es2panda/ir/base/methodDefinition.h @@ -17,6 +17,7 @@ #define ES2PANDA_PARSER_INCLUDE_AST_METHOD_DEFINITION_H #include +#include namespace panda::es2panda::compiler { class PandaGen; @@ -29,7 +30,6 @@ class Type; namespace panda::es2panda::ir { -class Expression; class FunctionExpression; enum class MethodDefinitionKind { CONSTRUCTOR, METHOD, GET, SET }; @@ -111,6 +111,11 @@ public: return (modifiers_ & ModifierFlags::OPTIONAL) != 0; } + bool IsPrivate() const + { + return key_->IsPrivateIdentifier(); + } + const ArenaVector &Overloads() const { return overloads_; diff --git a/es2panda/ir/expressions/binaryExpression.cpp b/es2panda/ir/expressions/binaryExpression.cpp index 526685b453..1a51b5e57d 100644 --- a/es2panda/ir/expressions/binaryExpression.cpp +++ b/es2panda/ir/expressions/binaryExpression.cpp @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include namespace panda::es2panda::ir { @@ -78,8 +80,37 @@ void BinaryExpression::CompileLogical(compiler::PandaGen *pg) const pg->SetLabel(this, endLabel); } +void BinaryExpression::CompilePrivateIn(compiler::PandaGen *pg) const +{ + ASSERT(operator_ == lexer::TokenType::KEYW_IN); + auto name = left_->AsPrivateIdentifier()->Name(); + auto result = pg->Scope()->FindPrivateName(name); + + right_->Compile(pg); + if (!result.result.isMethod) { + pg->TestIn(this, result.lexLevel, result.result.slot); + return; + } + // Instance private method check symbol("#method") + if (!result.result.isStatic) { + pg->TestIn(this, result.lexLevel, result.result.validateMethodSlot); + return; + } + // Static private method check whether equals the class object + compiler::RegScope rs(pg); + compiler::VReg rhs = pg->AllocReg(); + pg->StoreAccumulator(right_, rhs); + pg->LoadLexicalVar(this, result.lexLevel, result.result.validateMethodSlot); + pg->Equal(this, rhs); +} + void BinaryExpression::Compile(compiler::PandaGen *pg) const { + if (left_->IsPrivateIdentifier()) { + CompilePrivateIn(pg); + return; + } + if (IsLogical()) { CompileLogical(pg); return; diff --git a/es2panda/ir/expressions/binaryExpression.h b/es2panda/ir/expressions/binaryExpression.h index 0fb29f1d63..2ca0133030 100644 --- a/es2panda/ir/expressions/binaryExpression.h +++ b/es2panda/ir/expressions/binaryExpression.h @@ -29,12 +29,16 @@ class Type; } // namespace panda::es2panda::checker namespace panda::es2panda::ir { +class PrivateNameFindResult; class BinaryExpression : public Expression { public: explicit BinaryExpression(Expression *leftExpr, Expression *rightExpr, lexer::TokenType operatorType) : Expression(AstNodeType::BINARY_EXPRESSION), left_(leftExpr), right_(rightExpr), operator_(operatorType) { + if (right_->IsPrivateIdentifier()) { + throw Error{ErrorType::SYNTAX, "Unexpect private identifier", right_->Start().line, right_->Start().index}; + } } const Expression *Left() const @@ -87,6 +91,7 @@ public: void UpdateSelf(const NodeUpdater &cb, [[maybe_unused]] binder::Binder *binder) override; private: + void CompilePrivateIn(compiler::PandaGen *pg) const; Expression *left_; Expression *right_; lexer::TokenType operator_; diff --git a/es2panda/ir/expressions/literal.h b/es2panda/ir/expressions/literal.h index c842a4137a..b92ea7b486 100644 --- a/es2panda/ir/expressions/literal.h +++ b/es2panda/ir/expressions/literal.h @@ -46,6 +46,8 @@ enum class LiteralTag { LITERALBUFFERINDEX = 23, LITERALARRAY = 24, BUILTINTYPEINDEX = 25, + GETTER = 26, + SETTER = 27, NULL_VALUE = 255, }; diff --git a/es2panda/ir/expressions/literals/taggedLiteral.h b/es2panda/ir/expressions/literals/taggedLiteral.h index 06cd7028bd..006b87d981 100644 --- a/es2panda/ir/expressions/literals/taggedLiteral.h +++ b/es2panda/ir/expressions/literals/taggedLiteral.h @@ -60,7 +60,7 @@ public: const util::StringView &Method() const { ASSERT(tag_ == LiteralTag::ACCESSOR || tag_ == LiteralTag::METHOD || tag_ == LiteralTag::GENERATOR_METHOD || - tag_ == LiteralTag::ASYNC_GENERATOR_METHOD); + tag_ == LiteralTag::ASYNC_GENERATOR_METHOD || tag_== LiteralTag::GETTER || tag_ == LiteralTag::SETTER); return str_; } diff --git a/es2panda/ir/expressions/memberExpression.cpp b/es2panda/ir/expressions/memberExpression.cpp index c3bbed8a26..496d3be6cf 100644 --- a/es2panda/ir/expressions/memberExpression.cpp +++ b/es2panda/ir/expressions/memberExpression.cpp @@ -18,7 +18,9 @@ #include #include #include +#include #include +#include #include #include @@ -48,6 +50,9 @@ void MemberExpression::CompileObject(compiler::PandaGen *pg, compiler::VReg dest compiler::Operand MemberExpression::CompileKey(compiler::PandaGen *pg) const { + if (AccessPrivateProperty()) { + return ""; + } return pg->ToPropertyKey(property_, computed_); } @@ -61,6 +66,34 @@ void MemberExpression::Compile(compiler::PandaGen *pg) const void MemberExpression::Compile(compiler::PandaGen *pg, compiler::VReg objReg) const { CompileObject(pg, objReg); + if (AccessPrivateProperty()) { + auto name = property_->AsPrivateIdentifier()->Name(); + auto result = pg->Scope()->FindPrivateName(name); + if (!result.result.isMethod) { + pg->LoadAccumulator(this, objReg); + pg->LoadPrivateProperty(this, result.lexLevel, result.result.slot); + return; + } + if (result.result.isSetter) { + pg->ThrowTypeError(this, "Property is not defined with Getter"); + } + if (result.result.isStatic) { + pg->LoadLexicalVar(this, result.lexLevel, result.result.validateMethodSlot); + pg->Equal(this, objReg); + pg->ThrowTypeErrorIfFalse(this, "Object does not have private property"); + } else { + pg->LoadAccumulator(this, objReg); + pg->LoadPrivateProperty(this, result.lexLevel, result.result.validateMethodSlot); + } + + if (result.result.isGetter) { + pg->LoadAccumulator(this, objReg); + pg->LoadPrivateProperty(this, result.lexLevel, result.result.slot); + return; + } + pg->LoadLexicalVar(this, result.lexLevel, result.result.slot); + return; + } compiler::Operand prop = CompileKey(pg); if (object_->IsSuperExpression()) { diff --git a/es2panda/ir/expressions/memberExpression.h b/es2panda/ir/expressions/memberExpression.h index 74a7e17bc1..928c4e66e5 100644 --- a/es2panda/ir/expressions/memberExpression.h +++ b/es2panda/ir/expressions/memberExpression.h @@ -71,6 +71,11 @@ public: return optional_; } + bool AccessPrivateProperty() const + { + return property_->IsPrivateIdentifier(); + } + MemberExpressionKind Kind() const { return kind_; diff --git a/es2panda/ir/expressions/privateIdentifier.cpp b/es2panda/ir/expressions/privateIdentifier.cpp new file mode 100644 index 0000000000..78839b391f --- /dev/null +++ b/es2panda/ir/expressions/privateIdentifier.cpp @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2021 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 "privateIdentifier.h" + +#include + +namespace panda::es2panda::ir { + +void PrivateIdentifier::Iterate(const NodeTraverser &cb) const +{ + if (typeAnnotation_) { + cb(typeAnnotation_); + } +} + +void PrivateIdentifier::Dump(ir::AstDumper *dumper) const +{ + dumper->Add({{"type", "PrivatePrivateIdentifier"}, + {"prefix", "#"}, + {"name", name_}, + {"typeAnnotation", AstDumper::Optional(typeAnnotation_)}}); +} + +void PrivateIdentifier::Compile(compiler::PandaGen *pg) const +{ +} + +checker::Type *PrivateIdentifier::Check(checker::Checker *checker) const +{ + return nullptr; +} + +void PrivateIdentifier::UpdateSelf(const NodeUpdater &cb, [[maybe_unused]] binder::Binder *binder) +{ + if (typeAnnotation_) { + typeAnnotation_ = std::get(cb(typeAnnotation_))->AsExpression(); + } +} + +} // namespace panda::es2panda::ir \ No newline at end of file diff --git a/es2panda/ir/expressions/privateIdentifier.h b/es2panda/ir/expressions/privateIdentifier.h new file mode 100644 index 0000000000..d1a7a8cf06 --- /dev/null +++ b/es2panda/ir/expressions/privateIdentifier.h @@ -0,0 +1,80 @@ +/** + * 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. + */ + +#ifndef ES2PANDA_IR_EXPRESSION_PRIVATEIDENTIFIER_H +#define ES2PANDA_IR_EXPRESSION_PRIVATEIDENTIFIER_H + +#include +#include + +namespace panda::es2panda::compiler { +class PandaGen; +} // namespace panda::es2panda::compiler + +namespace panda::es2panda::checker { +class Checker; +class Type; +} // namespace panda::es2panda::checker + +namespace panda::es2panda::ir { + +class PrivateIdentifier : public Expression { +public: + explicit PrivateIdentifier(util::StringView name) + : Expression(AstNodeType::PRIVATE_IDENTIFIER), name_(name) + { + } + + explicit PrivateIdentifier(util::StringView name, Expression *typeAnnotation) + : Expression(AstNodeType::PRIVATE_IDENTIFIER), + name_(name), + typeAnnotation_(typeAnnotation) + { + } + + const Expression *TypeAnnotation() const + { + return typeAnnotation_; + } + + Expression *TypeAnnotation() + { + return typeAnnotation_; + } + + const util::StringView &Name() const + { + return name_; + } + + void SetName(util::StringView name) + { + name_ = name; + } + + void Iterate(const NodeTraverser &cb) const override; + void Dump(ir::AstDumper *dumper) const override; + void Compile(compiler::PandaGen *pg) const override; + checker::Type *Check(checker::Checker *checker) const override; + void UpdateSelf(const NodeUpdater &cb, [[maybe_unused]] binder::Binder *binder) override; + +private: + util::StringView name_; + Expression *typeAnnotation_ {}; +}; + +} // namespace panda::es2panda::ir + +#endif diff --git a/es2panda/parser/expressionParser.cpp b/es2panda/parser/expressionParser.cpp index 6e16f668e3..1502fe84a8 100644 --- a/es2panda/parser/expressionParser.cpp +++ b/es2panda/parser/expressionParser.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -1366,6 +1367,14 @@ ir::Expression *ParserImpl::ParseOptionalChain(ir::Expression *leftSideExpr) lexer::TokenType tokenType = lexer_->GetToken().Type(); ir::Expression *returnExpression = nullptr; + if (tokenType == lexer::TokenType::PUNCTUATOR_HASH_MARK) { + auto *privateIdent = ParsePrivateIdentifier(); + returnExpression = AllocNode( + leftSideExpr, privateIdent, ir::MemberExpression::MemberExpressionKind::PROPERTY_ACCESS, false, true); + returnExpression->SetRange({leftSideExpr->Start(), privateIdent->End()}); + lexer_->NextToken(); + } + if (tokenType == lexer::TokenType::LITERAL_IDENT) { auto *identNode = AllocNode(lexer_->GetToken().Ident()); identNode->SetReference(); @@ -1600,32 +1609,20 @@ ir::Expression *ParserImpl::ParsePostPrimaryExpression(ir::Expression *primaryEx } case lexer::TokenType::PUNCTUATOR_PERIOD: { lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); // eat period - bool isPrivate = false; - lexer::SourcePosition memberStart = lexer_->GetToken().Start(); - - if (Extension() == ScriptExtension::TS && - lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_HASH_MARK) { - if (!(context_.Status() & ParserStatus::IN_CLASS_BODY)) { - ThrowSyntaxError("Private identifiers are not allowed outside class bodies."); + ir::Expression *property; + if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_HASH_MARK) { + if (returnExpression->IsSuperExpression()) { + ThrowSyntaxError("Unexpected private property access in super keyword"); } - isPrivate = true; - lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); - } - - if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT) { - ThrowSyntaxError("Expected an identifier"); - } - - auto *identNode = AllocNode(lexer_->GetToken().Ident()); - identNode->SetRange(lexer_->GetToken().Loc()); - - ir::Expression *property = nullptr; - if (isPrivate) { - property = AllocNode(identNode, nullptr, nullptr); - property->SetRange({memberStart, identNode->End()}); + property = ParsePrivateIdentifier(); } else { - property = identNode; + if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT) { + ThrowSyntaxError("Expected an identifier"); + } + property = AllocNode(lexer_->GetToken().Ident()); + property->SetRange(lexer_->GetToken().Loc()); + lexer_->NextToken(); } const lexer::SourcePosition &startPos = returnExpression->Start(); @@ -1633,7 +1630,6 @@ ir::Expression *ParserImpl::ParsePostPrimaryExpression(ir::Expression *primaryEx returnExpression, property, ir::MemberExpression::MemberExpressionKind::PROPERTY_ACCESS, false, false); returnExpression->SetRange({startPos, property->End()}); - lexer_->NextToken(); continue; } case lexer::TokenType::PUNCTUATOR_LEFT_SQUARE_BRACKET: { @@ -2299,6 +2295,14 @@ ir::Expression *ParserImpl::ParseUnaryOrPrefixUpdateExpression(ExpressionParseFl return ParseTsTypeAssertion(flags); } + if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_HASH_MARK) { + auto privateIdent = ParsePrivateIdentifier(); + if (lexer_->GetToken().Type() != lexer::TokenType::KEYW_IN) { + ThrowSyntaxError("Unexpected private identifier", privateIdent->Start()); + } + return privateIdent; + } + if (!lexer_->GetToken().IsUnary()) { return ParseLeftHandSideExpression(flags); } @@ -2312,8 +2316,13 @@ ir::Expression *ParserImpl::ParseUnaryOrPrefixUpdateExpression(ExpressionParseFl ValidateUpdateExpression(argument, false); } - if (operatorType == lexer::TokenType::KEYW_DELETE && argument->IsIdentifier()) { - ThrowSyntaxError("Deleting local variable in strict mode"); + if (operatorType == lexer::TokenType::KEYW_DELETE) { + if (argument->IsIdentifier()) { + ThrowSyntaxError("Deleting local variable in strict mode"); + } + if (argument->IsMemberExpression() && argument->AsMemberExpression()->AccessPrivateProperty()) { + ThrowSyntaxError("Delete private property is not allowed"); + } } lexer::SourcePosition end = argument->End(); @@ -2479,4 +2488,29 @@ ir::FunctionExpression *ParserImpl::ParseFunctionExpression(ParserStatus newStat return funcExpr; } +ir::PrivateIdentifier *ParserImpl::ParsePrivateIdentifier() +{ + ASSERT(lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_HASH_MARK); + if (!(context_.Status() & ParserStatus::IN_CLASS_BODY)) { + ThrowSyntaxError("Private identifiers are not allowed outside class bodies."); + } + + auto start = lexer_->GetToken().Start(); + auto idx = start.index; + + lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); + auto newIdx = lexer_->GetToken().Start().index; + if (newIdx != idx + 1) { + ThrowSyntaxError("Unexpected white space"); + } + if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT) { + ThrowSyntaxError("Expected an identifier"); + } + + auto *privateIdent = AllocNode(lexer_->GetToken().Ident()); + privateIdent->SetRange({start, lexer_->GetToken().End()}); + lexer_->NextToken(); + return privateIdent; +} + } // namespace panda::es2panda::parser diff --git a/es2panda/parser/parserImpl.cpp b/es2panda/parser/parserImpl.cpp index 3c83183803..c02117d026 100644 --- a/es2panda/parser/parserImpl.cpp +++ b/es2panda/parser/parserImpl.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -2260,6 +2261,9 @@ void ParserImpl::ValidateClassKey(ClassElmentDescriptor *desc, bool isDeclare) ir::Expression *ParserImpl::ParseClassKey(ClassElmentDescriptor *desc, bool isDeclare) { + if (desc->isPrivateIdent) { + return ParsePrivateIdentifier(); + } ir::Expression *propName = nullptr; if (lexer_->GetToken().IsKeyword()) { lexer_->GetToken().SetTokenType(lexer::TokenType::LITERAL_IDENT); @@ -2274,7 +2278,6 @@ ir::Expression *ParserImpl::ParseClassKey(ClassElmentDescriptor *desc, bool isDe break; } case lexer::TokenType::LITERAL_STRING: { - ThrowIfPrivateIdent(desc, "Private identifier name can not be string"); ValidateClassKey(desc, isDeclare); propName = AllocNode(lexer_->GetToken().String()); @@ -2282,7 +2285,6 @@ ir::Expression *ParserImpl::ParseClassKey(ClassElmentDescriptor *desc, bool isDe break; } case lexer::TokenType::LITERAL_NUMBER: { - ThrowIfPrivateIdent(desc, "Private identifier name can not be number"); if (lexer_->GetToken().Flags() & lexer::TokenFlags::NUMBER_BIGINT) { propName = AllocNode(lexer_->GetToken().BigInt()); @@ -2294,8 +2296,6 @@ ir::Expression *ParserImpl::ParseClassKey(ClassElmentDescriptor *desc, bool isDe break; } case lexer::TokenType::PUNCTUATOR_LEFT_SQUARE_BRACKET: { - ThrowIfPrivateIdent(desc, "Unexpected character in private identifier"); - lexer_->NextToken(); // eat left square bracket if (Extension() == ScriptExtension::TS && lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT && @@ -2423,6 +2423,62 @@ void ParserImpl::ValidateClassGetter(ClassElmentDescriptor *desc, const ArenaVec } } +void ParserImpl::ValidatePrivateProperty(ir::Statement *stmt, std::unordered_set &usedPrivateNames, + std::unordered_map &unusedGetterSetterPairs) +{ + if (stmt->IsClassProperty()) { + auto *prop = stmt->AsClassProperty(); + if (!prop->IsPrivate()) { + return; + } + auto name = prop->Key()->AsPrivateIdentifier()->Name(); + if (usedPrivateNames.find(name) != usedPrivateNames.end()) { + ThrowSyntaxError("Redeclaration of class private property", prop->Start()); + } + usedPrivateNames.insert(name); + return; + } + + if (stmt->IsMethodDefinition()) { + auto *methodDef = stmt->AsMethodDefinition(); + if (!methodDef->IsPrivate()) { + return; + } + auto name = methodDef->Key()->AsPrivateIdentifier()->Name(); + + if (methodDef->Kind() == ir::MethodDefinitionKind::METHOD) { + if (usedPrivateNames.find(name) != usedPrivateNames.end()) { + ThrowSyntaxError("Redeclaration of class private property", methodDef->Start()); + } + usedPrivateNames.insert(name); + return; + } + + ASSERT(methodDef->Kind() != ir::MethodDefinitionKind::CONSTRUCTOR); + PrivateGetterSetterType type = (methodDef->Kind() == ir::MethodDefinitionKind::GET) ? + PrivateGetterSetterType::GETTER : PrivateGetterSetterType::SETTER; + PrivateGetterSetterType unusedType = (methodDef->Kind() == ir::MethodDefinitionKind::GET) ? + PrivateGetterSetterType::SETTER : PrivateGetterSetterType::GETTER; + + if (methodDef->IsStatic()) { + type |= PrivateGetterSetterType::STATIC; + unusedType |= PrivateGetterSetterType::STATIC; + } + + if (usedPrivateNames.find(name) == usedPrivateNames.end()) { + usedPrivateNames.insert(name); + unusedGetterSetterPairs[name] = unusedType; + return; + } + + auto result = unusedGetterSetterPairs.find(name); + if (result == unusedGetterSetterPairs.end() || unusedGetterSetterPairs[name] != type) { + ThrowSyntaxError("Redeclaration of class private property", methodDef->Start()); + } + unusedGetterSetterPairs.erase(result); + } +} + ir::MethodDefinition *ParserImpl::ParseClassMethod(ClassElmentDescriptor *desc, const ArenaVector &properties, ir::Expression *propName, lexer::SourcePosition *propEnd, @@ -2542,21 +2598,7 @@ ir::Statement *ParserImpl::ParseClassProperty(ClassElmentDescriptor *desc, propEnd = value->End(); } - ir::Expression *privateId = nullptr; - - if (Extension() == ScriptExtension::JS) { - if (desc->isPrivateIdent) { - ThrowSyntaxError("Private js fields are not supported"); - } - } else { - if (desc->isPrivateIdent) { - privateId = AllocNode(propName, value, typeAnnotation); - auto privateIdStart = lexer::SourcePosition(propName->Start().index - 1, propName->Start().line); - privateId->SetRange({privateIdStart, propName->End()}); - } - } - - property = AllocNode(desc->isPrivateIdent ? privateId : propName, value, typeAnnotation, + property = AllocNode(propName, value, typeAnnotation, desc->modifiers, std::move(decorators), desc->isComputed, desc->modifiers & ir::ModifierFlags::DEFINITE); @@ -2570,8 +2612,6 @@ void ParserImpl::CheckClassGeneratorMethod(ClassElmentDescriptor *desc) return; } - ThrowIfPrivateIdent(desc, "Unexpected character in private identifier"); - desc->isGenerator = true; lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); } @@ -2582,20 +2622,11 @@ void ParserImpl::CheckClassPrivateIdentifier(ClassElmentDescriptor *desc) return; } - if (Extension() == ScriptExtension::JS) { - ThrowSyntaxError("JS private class fields are not supported."); - } - if (Extension() == ScriptExtension::AS) { return; } - if ((desc->modifiers & ~ir::ModifierFlags::READONLY) && (desc->modifiers & ~ir::ModifierFlags::STATIC)) { - ThrowSyntaxError("Unexpected modifier on private identifier"); - } - desc->isPrivateIdent = true; - lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); } void ParserImpl::CheckFieldKey(ir::Expression *propName) @@ -2604,9 +2635,9 @@ void ParserImpl::CheckFieldKey(ir::Expression *propName) return; } - ASSERT(propName->IsIdentifier() || propName->IsStringLiteral()); + ASSERT(propName->IsIdentifier() || propName->IsStringLiteral() || propName->IsPrivateIdentifier()); const util::StringView &stringView = propName->IsIdentifier() ? propName->AsIdentifier()->Name() : - propName->AsStringLiteral()->Str(); + (propName->IsStringLiteral() ? propName->AsStringLiteral()->Str() : propName->AsPrivateIdentifier()->Name()); if (stringView.Is("constructor")) { ThrowSyntaxError("Classes may not have field named 'constructor'"); } @@ -2701,9 +2732,9 @@ ir::Statement *ParserImpl::ParseClassElement(const ArenaVector return ParseStaticBlock(&desc); } - CheckClassPrivateIdentifier(&desc); CheckClassGeneratorMethod(&desc); ParseClassKeyModifiers(&desc); + CheckClassPrivateIdentifier(&desc); if (!(desc.modifiers & ir::ModifierFlags::STATIC)) { context_.Status() |= ParserStatus::ALLOW_THIS_TYPE; @@ -3063,6 +3094,9 @@ ir::ClassDefinition *ParserImpl::ParseClassDefinition(bool isDeclaration, bool i auto *static_scope = staticInitializer->Function()->Scope(); auto *instance_scope = instanceInitializer->Function()->Scope(); + std::unordered_set usedPrivateNames; + std::unordered_map unusedGetterSetterPairs; + while (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_BRACE) { if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SEMI_COLON) { lexer_->NextToken(); @@ -3089,6 +3123,7 @@ ir::ClassDefinition *ParserImpl::ParseClassDefinition(bool isDeclaration, bool i continue; } isCtorContinuousDefined = ctor == nullptr; + ValidatePrivateProperty(property, usedPrivateNames, unusedGetterSetterPairs); properties.push_back(property); } @@ -3100,6 +3135,7 @@ ir::ClassDefinition *ParserImpl::ParseClassDefinition(bool isDeclaration, bool i ctor->SetRange({startLoc, classBodyEndLoc}); hasConstructorFuncBody = !isDeclare; } + lexer_->NextToken(); ValidateClassConstructor(ctor, properties, isDeclare, hasConstructorFuncBody, hasSuperClass, isExtendsFromNull); diff --git a/es2panda/parser/parserImpl.h b/es2panda/parser/parserImpl.h index 0613a13012..913b405828 100644 --- a/es2panda/parser/parserImpl.h +++ b/es2panda/parser/parserImpl.h @@ -172,6 +172,14 @@ DEFINE_BITOPS(TypeAnnotationParsingOptions) class ArrowFunctionContext; +enum class PrivateGetterSetterType { + GETTER = 0, + SETTER = 1 << 0, + STATIC = 1 << 1, +}; + +DEFINE_BITOPS(PrivateGetterSetterType) + class ParserImpl { public: explicit ParserImpl(es2panda::ScriptExtension extension); @@ -297,6 +305,8 @@ private: void ValidateClassGetter(ClassElmentDescriptor *desc, const ArenaVector &properties, ir::Expression *propName, ir::ScriptFunction *func, bool hasDecorator, lexer::SourcePosition errorInfo); + void ValidatePrivateProperty(ir::Statement *stmt, std::unordered_set &privateNames, + std::unordered_map &unusedGetterSetterPairs); ir::MethodDefinition *ParseClassMethod(ClassElmentDescriptor *desc, const ArenaVector &properties, ir::Expression *propName, lexer::SourcePosition *propEnd, ArenaVector &&decorators, bool isDeclare); @@ -456,6 +466,7 @@ private: ArenaVector &&decorators); ir::Identifier *ParseNamedExport(const lexer::Token &exportedToken); void CheckStrictReservedWord() const; + ir::PrivateIdentifier *ParsePrivateIdentifier(); // Discard the DISALLOW_CONDITIONAL_TYPES in current status to call function. template diff --git a/test262/es2022_tests.txt b/test262/es2022_tests.txt index bc299c6773..47b59b33dc 100644 --- a/test262/es2022_tests.txt +++ b/test262/es2022_tests.txt @@ -709,4 +709,947 @@ language/statements/class/elements/evaluation-error/computed-name-toprimitive-re language/expressions/class/elements/evaluation-error/computed-name-toprimitive-returns-nonobject.js language/statements/class/elements/evaluation-error/computed-name-toprimitive-returns-nonobject.js language/expressions/class/elements/computed-name-toprimitive-symbol.js -language/statements/class/elements/computed-name-toprimitive-symbol.js \ No newline at end of file +language/statements/class/elements/computed-name-toprimitive-symbol.js +language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-bitand.js +language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-exp.js +language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-srshift.js +language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-add.js +language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-add.js +language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-srshift.js +language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-bitxor.js +language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-lshift.js +language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-sub.js +language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-exp.js +language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-div.js +language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-lshift.js +language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-sub.js +language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-rshift.js +language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-mult.js +language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-bitor.js +language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-mod.js +language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-mult.js +language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-mod.js +language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-div.js +language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-bitand.js +language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-bitor.js +language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-bitxor.js +language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-rshift.js +language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js +language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-and.js +language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-and.js +language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-and.js +language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-or.js +language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js +language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-or.js +language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-nullish.js +language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-or.js +language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js +language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-nullish.js +language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-nullish.js +language/expressions/in/private-field-presence-accessor.js +language/expressions/in/private-field-presence-accessor-shadowed.js +language/expressions/class/elements/after-same-line-method-rs-private-setter.js +language/expressions/class/elements/same-line-async-gen-rs-private-getter.js +language/expressions/class/elements/regular-definitions-rs-private-setter-alt.js +language/expressions/class/elements/after-same-line-static-async-gen-rs-private-setter-alt.js +language/expressions/class/elements/wrapped-in-sc-rs-private-getter.js +language/expressions/class/elements/new-no-sc-line-method-rs-private-getter-alt.js +language/expressions/class/elements/new-no-sc-line-method-rs-private-setter.js +language/expressions/class/elements/after-same-line-static-async-gen-rs-private-getter-alt.js +language/expressions/class/elements/multiple-definitions-rs-private-getter.js +language/expressions/class/elements/same-line-async-gen-rs-private-setter-alt.js +language/expressions/class/elements/new-sc-line-gen-rs-private-setter.js +language/expressions/class/elements/new-sc-line-method-rs-private-setter.js +language/expressions/class/elements/multiple-stacked-definitions-rs-private-setter-alt.js +language/expressions/class/elements/new-sc-line-gen-rs-private-getter-alt.js +language/expressions/class/elements/after-same-line-static-gen-rs-private-setter.js +language/expressions/class/elements/after-same-line-method-rs-private-setter-alt.js +language/expressions/class/elements/after-same-line-gen-rs-private-getter-alt.js +language/expressions/class/elements/after-same-line-static-method-rs-private-getter.js +language/expressions/class/elements/same-line-async-gen-rs-private-setter.js +language/expressions/class/elements/after-same-line-static-async-gen-rs-private-setter.js +language/expressions/class/elements/after-same-line-gen-rs-private-setter.js +language/expressions/class/elements/after-same-line-static-async-method-rs-private-getter-alt.js +language/expressions/class/elements/after-same-line-static-method-rs-private-setter-alt.js +language/expressions/class/elements/regular-definitions-rs-private-setter.js +language/expressions/class/elements/new-no-sc-line-method-rs-private-getter.js +language/expressions/class/elements/after-same-line-static-method-rs-private-getter-alt.js +language/expressions/class/elements/multiple-stacked-definitions-rs-private-setter.js +language/expressions/class/elements/new-sc-line-method-rs-private-getter-alt.js +language/expressions/class/elements/new-sc-line-method-rs-private-getter.js +language/expressions/class/elements/same-line-gen-rs-private-setter.js +language/expressions/class/elements/same-line-gen-rs-private-setter-alt.js +language/expressions/class/elements/after-same-line-method-rs-private-getter.js +language/expressions/class/elements/same-line-async-gen-rs-private-getter-alt.js +language/expressions/class/elements/wrapped-in-sc-rs-private-setter-alt.js +language/expressions/class/elements/private-setter-shadowed-by-field-on-nested-class.js +language/expressions/class/elements/same-line-method-rs-private-setter-alt.js +language/expressions/class/elements/after-same-line-static-method-rs-private-setter.js +language/expressions/class/elements/multiple-stacked-definitions-rs-private-getter-alt.js +language/expressions/class/elements/same-line-async-method-rs-private-setter.js +language/expressions/class/elements/after-same-line-static-async-method-rs-private-setter.js +language/expressions/class/elements/after-same-line-gen-rs-private-setter-alt.js +language/expressions/class/elements/new-sc-line-gen-rs-private-getter.js +language/expressions/class/elements/new-sc-line-gen-rs-private-setter-alt.js +language/expressions/class/elements/multiple-definitions-rs-private-getter-alt.js +language/expressions/class/elements/after-same-line-method-rs-private-getter-alt.js +language/expressions/class/elements/wrapped-in-sc-rs-private-setter.js +language/expressions/class/elements/same-line-method-rs-private-getter-alt.js +language/expressions/class/elements/multiple-definitions-rs-private-setter-alt.js +language/expressions/class/elements/after-same-line-static-async-method-rs-private-getter.js +language/expressions/class/elements/regular-definitions-rs-private-getter.js +language/expressions/class/elements/after-same-line-static-gen-rs-private-setter-alt.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-accessor-set.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-accessor-get.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-accessor-get.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-accessor-set.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-accessor-set.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-accessor-get.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-accessor-get.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-accessor-set.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-accessor-get.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-accessor-get.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-accessor-set.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-accessor-set.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-accessor-set.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-accessor-get.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-accessor-get.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-accessor-get.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-accessor-get.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-accessor-set.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-accessor-get.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-accessor-set.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-accessor-get.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-accessor-set.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-accessor-set.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-accessor-set.js +language/expressions/class/elements/same-line-async-method-rs-private-setter-alt.js +language/expressions/class/elements/multiple-stacked-definitions-rs-private-getter.js +language/expressions/class/elements/private-getter-shadowed-by-field-on-nested-class.js +language/expressions/class/elements/same-line-method-rs-private-getter.js +language/expressions/class/elements/after-same-line-static-gen-rs-private-getter-alt.js +language/expressions/class/elements/after-same-line-gen-rs-private-getter.js +language/expressions/class/elements/same-line-method-rs-private-setter.js +language/expressions/class/elements/after-same-line-static-async-method-rs-private-setter-alt.js +language/expressions/class/elements/new-no-sc-line-method-rs-private-setter-alt.js +language/expressions/class/elements/wrapped-in-sc-rs-private-getter-alt.js +language/expressions/class/elements/same-line-gen-rs-private-getter.js +language/expressions/class/elements/new-sc-line-method-rs-private-setter-alt.js +language/expressions/class/elements/same-line-async-method-rs-private-getter.js +language/expressions/class/elements/after-same-line-static-gen-rs-private-getter.js +language/expressions/class/elements/same-line-async-method-rs-private-getter-alt.js +language/expressions/class/elements/after-same-line-static-async-gen-rs-private-getter.js +language/expressions/class/elements/same-line-gen-rs-private-getter-alt.js +language/expressions/class/elements/multiple-definitions-rs-private-setter.js +language/expressions/class/elements/regular-definitions-rs-private-getter-alt.js +language/statements/class/elements/after-same-line-method-rs-private-setter.js +language/statements/class/elements/same-line-async-gen-rs-private-getter.js +language/statements/class/elements/regular-definitions-rs-private-setter-alt.js +language/statements/class/elements/after-same-line-static-async-gen-rs-private-setter-alt.js +language/statements/class/elements/wrapped-in-sc-rs-private-getter.js +language/statements/class/elements/new-no-sc-line-method-rs-private-getter-alt.js +language/statements/class/elements/new-no-sc-line-method-rs-private-setter.js +language/statements/class/elements/after-same-line-static-async-gen-rs-private-getter-alt.js +language/statements/class/elements/multiple-definitions-rs-private-getter.js +language/statements/class/elements/same-line-async-gen-rs-private-setter-alt.js +language/statements/class/elements/new-sc-line-gen-rs-private-setter.js +language/statements/class/elements/new-sc-line-method-rs-private-setter.js +language/statements/class/elements/multiple-stacked-definitions-rs-private-setter-alt.js +language/statements/class/elements/new-sc-line-gen-rs-private-getter-alt.js +language/statements/class/elements/after-same-line-static-gen-rs-private-setter.js +language/statements/class/elements/after-same-line-method-rs-private-setter-alt.js +language/statements/class/elements/after-same-line-gen-rs-private-getter-alt.js +language/statements/class/elements/after-same-line-static-method-rs-private-getter.js +language/statements/class/elements/same-line-async-gen-rs-private-setter.js +language/statements/class/elements/after-same-line-static-async-gen-rs-private-setter.js +language/statements/class/elements/after-same-line-gen-rs-private-setter.js +language/statements/class/elements/after-same-line-static-async-method-rs-private-getter-alt.js +language/statements/class/elements/after-same-line-static-method-rs-private-setter-alt.js +language/statements/class/elements/regular-definitions-rs-private-setter.js +language/statements/class/elements/new-no-sc-line-method-rs-private-getter.js +language/statements/class/elements/after-same-line-static-method-rs-private-getter-alt.js +language/statements/class/elements/multiple-stacked-definitions-rs-private-setter.js +language/statements/class/elements/new-sc-line-method-rs-private-getter-alt.js +language/statements/class/elements/new-sc-line-method-rs-private-getter.js +language/statements/class/elements/same-line-gen-rs-private-setter.js +language/statements/class/elements/same-line-gen-rs-private-setter-alt.js +language/statements/class/elements/after-same-line-method-rs-private-getter.js +language/statements/class/elements/same-line-async-gen-rs-private-getter-alt.js +language/statements/class/elements/wrapped-in-sc-rs-private-setter-alt.js +language/statements/class/elements/private-setter-shadowed-by-field-on-nested-class.js +language/statements/class/elements/same-line-method-rs-private-setter-alt.js +language/statements/class/elements/after-same-line-static-method-rs-private-setter.js +language/statements/class/elements/multiple-stacked-definitions-rs-private-getter-alt.js +language/statements/class/elements/same-line-async-method-rs-private-setter.js +language/statements/class/elements/after-same-line-static-async-method-rs-private-setter.js +language/statements/class/elements/after-same-line-gen-rs-private-setter-alt.js +language/statements/class/elements/new-sc-line-gen-rs-private-getter.js +language/statements/class/elements/new-sc-line-gen-rs-private-setter-alt.js +language/statements/class/elements/multiple-definitions-rs-private-getter-alt.js +language/statements/class/elements/after-same-line-method-rs-private-getter-alt.js +language/statements/class/elements/wrapped-in-sc-rs-private-setter.js +language/statements/class/elements/same-line-method-rs-private-getter-alt.js +language/statements/class/elements/multiple-definitions-rs-private-setter-alt.js +language/statements/class/elements/after-same-line-static-async-method-rs-private-getter.js +language/statements/class/elements/regular-definitions-rs-private-getter.js +language/statements/class/elements/after-same-line-static-gen-rs-private-setter-alt.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-accessor-set.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-accessor-get.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-accessor-get.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-accessor-set.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-accessor-set.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-accessor-get.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-accessor-get.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-accessor-set.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-accessor-get.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-accessor-get.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-accessor-set.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-accessor-set.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-accessor-set.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-accessor-get.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-accessor-get.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-accessor-get.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-accessor-get.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-accessor-set.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-accessor-get.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-accessor-set.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-accessor-get.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-accessor-set.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-accessor-set.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-accessor-set.js +language/statements/class/elements/same-line-async-method-rs-private-setter-alt.js +language/statements/class/elements/multiple-stacked-definitions-rs-private-getter.js +language/statements/class/elements/private-getter-shadowed-by-field-on-nested-class.js +language/statements/class/elements/same-line-method-rs-private-getter.js +language/statements/class/elements/after-same-line-static-gen-rs-private-getter-alt.js +language/statements/class/elements/after-same-line-gen-rs-private-getter.js +language/statements/class/elements/same-line-method-rs-private-setter.js +language/statements/class/elements/after-same-line-static-async-method-rs-private-setter-alt.js +language/statements/class/elements/new-no-sc-line-method-rs-private-setter-alt.js +language/statements/class/elements/wrapped-in-sc-rs-private-getter-alt.js +language/statements/class/elements/same-line-gen-rs-private-getter.js +language/statements/class/elements/new-sc-line-method-rs-private-setter-alt.js +language/statements/class/elements/same-line-async-method-rs-private-getter.js +language/statements/class/elements/after-same-line-static-gen-rs-private-getter.js +language/statements/class/elements/same-line-async-method-rs-private-getter-alt.js +language/statements/class/elements/after-same-line-static-async-gen-rs-private-getter.js +language/statements/class/elements/same-line-gen-rs-private-getter-alt.js +language/statements/class/elements/multiple-definitions-rs-private-setter.js +language/statements/class/elements/regular-definitions-rs-private-getter-alt.js +language/expressions/compound-assignment/left-hand-side-private-reference-method-div.js +language/expressions/compound-assignment/left-hand-side-private-reference-data-property-sub.js +language/expressions/compound-assignment/left-hand-side-private-reference-data-property-bitand.js +language/expressions/compound-assignment/left-hand-side-private-reference-method-mult.js +language/expressions/compound-assignment/left-hand-side-private-reference-data-property-mod.js +language/expressions/compound-assignment/left-hand-side-private-reference-method-srshift.js +language/expressions/compound-assignment/left-hand-side-private-reference-method-exp.js +language/expressions/compound-assignment/left-hand-side-private-reference-data-property-exp.js +language/expressions/compound-assignment/left-hand-side-private-reference-data-property-div.js +language/expressions/compound-assignment/left-hand-side-private-reference-method-mod.js +language/expressions/compound-assignment/left-hand-side-private-reference-data-property-bitxor.js +language/expressions/compound-assignment/left-hand-side-private-reference-data-property-add.js +language/expressions/compound-assignment/left-hand-side-private-reference-method-bitand.js +language/expressions/compound-assignment/left-hand-side-private-reference-method-bitor.js +language/expressions/compound-assignment/left-hand-side-private-reference-data-property-lshift.js +language/expressions/compound-assignment/left-hand-side-private-reference-method-add.js +language/expressions/compound-assignment/left-hand-side-private-reference-method-rshift.js +language/expressions/compound-assignment/left-hand-side-private-reference-method-sub.js +language/expressions/compound-assignment/left-hand-side-private-reference-data-property-mult.js +language/expressions/compound-assignment/left-hand-side-private-reference-data-property-srshift.js +language/expressions/compound-assignment/left-hand-side-private-reference-method-lshift.js +language/expressions/compound-assignment/left-hand-side-private-reference-method-bitxor.js +language/expressions/compound-assignment/left-hand-side-private-reference-data-property-bitor.js +language/expressions/compound-assignment/left-hand-side-private-reference-data-property-rshift.js +language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-nullish.js +language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-nullish.js +language/expressions/logical-assignment/left-hand-side-private-reference-data-property-or.js +language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-or.js +language/expressions/logical-assignment/left-hand-side-private-reference-method-and.js +language/expressions/logical-assignment/left-hand-side-private-reference-data-property-and.js +language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-and.js +language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-or.js +language/expressions/logical-assignment/left-hand-side-private-reference-data-property-nullish.js +language/expressions/in/private-field-in-nested.js +language/expressions/in/private-field-in.js +language/expressions/in/private-field-rhs-yield-absent.js +language/expressions/in/private-field-presence-method.js +language/expressions/in/private-field-invalid-assignment-reference.js +language/expressions/in/private-field-rhs-await-present.js +language/expressions/in/private-field-rhs-unresolvable.js +language/expressions/in/private-field-rhs-await-absent.js +language/expressions/in/private-field-rhs-yield-present.js +language/expressions/in/private-field-presence-field.js +language/expressions/in/private-field-invalid-identifier-complex.js +language/expressions/in/private-field-invalid-identifier-simple.js +language/expressions/class/elements/wrapped-in-sc-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/after-same-line-static-method-rs-privatename-identifier-alt.js +language/expressions/class/elements/same-line-async-method-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/after-same-line-static-method-private-field-usage.js +language/expressions/class/elements/private-field-as-function.js +language/expressions/class/elements/after-same-line-static-async-gen-rs-privatename-identifier-initializer.js +language/expressions/class/elements/new-sc-line-gen-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/nested-private-literal-name-init-err-contains-arguments.js +language/expressions/class/elements/wrapped-in-sc-rs-privatename-identifier-initializer.js +language/expressions/class/elements/after-same-line-static-gen-rs-privatename-identifier-alt.js +language/expressions/class/elements/private-static-method-shadowed-by-field-on-nested-class.js +language/expressions/class/elements/regular-definitions-private-names.js +language/expressions/class/elements/after-same-line-gen-rs-privatename-identifier-initializer.js +language/expressions/class/elements/multiple-definitions-private-names.js +language/expressions/class/elements/regular-definitions-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/private-field-on-nested-class.js +language/expressions/class/elements/after-same-line-static-method-rs-privatename-identifier.js +language/expressions/class/elements/after-same-line-method-private-names.js +language/expressions/class/elements/same-line-async-method-rs-privatename-identifier-initializer.js +language/expressions/class/elements/new-no-sc-line-method-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/new-sc-line-method-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/private-method-shadowed-by-field-on-nested-class.js +language/expressions/class/elements/after-same-line-static-async-method-rs-privatename-identifier-initializer.js +language/expressions/class/elements/after-same-line-static-async-gen-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/nested-private-typeof-init-err-contains-arguments.js +language/expressions/class/elements/nested-private-arrow-fnc-init-err-contains-super.js +language/expressions/class/elements/after-same-line-static-async-method-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/nested-private-literal-name-init-err-contains-super.js +language/expressions/class/elements/private-arrow-fnc-init-err-contains-super.js +language/expressions/class/elements/after-same-line-gen-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/fields-duplicate-privatenames.js +language/expressions/class/elements/private-ternary-init-err-contains-super.js +language/expressions/class/elements/same-line-async-method-private-field-usage.js +language/expressions/class/elements/new-no-sc-line-method-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/nested-private-ternary-init-err-contains-super.js +language/expressions/class/elements/after-same-line-static-method-rs-privatename-identifier-initializer.js +language/expressions/class/elements/same-line-async-gen-rs-privatename-identifier-initializer.js +language/expressions/class/elements/private-field-as-async-arrow-function.js +language/expressions/class/elements/multiple-stacked-definitions-private-names.js +language/expressions/class/elements/private-arrow-fnc-init-err-contains-arguments.js +language/expressions/class/elements/new-sc-line-gen-rs-privatename-identifier-initializer.js +language/expressions/class/elements/regular-definitions-rs-privatename-identifier-initializer.js +language/expressions/class/elements/after-same-line-static-async-gen-private-names.js +language/expressions/class/elements/same-line-method-rs-privatename-identifier-initializer.js +language/expressions/class/elements/multiple-stacked-definitions-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/regular-definitions-rs-privatename-identifier-alt.js +language/expressions/class/elements/wrapped-in-sc-private-names.js +language/expressions/class/elements/new-sc-line-method-rs-privatename-identifier-initializer.js +language/expressions/class/elements/same-line-async-method-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/same-line-async-gen-private-field-usage.js +language/expressions/class/elements/same-line-gen-private-names.js +language/expressions/class/elements/new-sc-line-method-private-names.js +language/expressions/class/elements/new-sc-line-gen-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/after-same-line-gen-private-names.js +language/expressions/class/elements/after-same-line-method-private-field-usage.js +language/expressions/class/elements/multiple-definitions-rs-privatename-identifier-initializer.js +language/expressions/class/elements/same-line-method-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/grammar-private-field-optional-chaining.js +language/expressions/class/elements/after-same-line-static-async-gen-private-field-usage.js +language/expressions/class/elements/same-line-async-gen-rs-privatename-identifier.js +language/expressions/class/elements/multiple-definitions-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/multiple-definitions-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/after-same-line-static-gen-private-names.js +language/expressions/class/elements/multiple-stacked-definitions-rs-privatename-identifier-alt.js +language/expressions/class/elements/new-no-sc-line-method-rs-privatename-identifier-alt.js +language/expressions/class/elements/private-typeof-init-err-contains-arguments.js +language/expressions/class/elements/multiple-definitions-rs-privatename-identifier.js +language/expressions/class/elements/same-line-gen-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/after-same-line-static-async-gen-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/same-line-async-method-private-names.js +language/expressions/class/elements/multiple-stacked-definitions-rs-privatename-identifier-initializer.js +language/expressions/class/elements/same-line-method-private-names.js +language/expressions/class/elements/after-same-line-static-method-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/after-same-line-static-method-private-names.js +language/expressions/class/elements/after-same-line-static-async-method-private-names.js +language/expressions/class/elements/private-ternary-init-err-contains-arguments.js +language/expressions/class/elements/after-same-line-static-async-gen-rs-privatename-identifier-alt.js +language/expressions/class/elements/after-same-line-method-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/after-same-line-method-rs-privatename-identifier-initializer.js +language/expressions/class/elements/after-same-line-gen-private-field-usage.js +language/expressions/class/elements/nested-private-typeof-init-err-contains-super.js +language/expressions/class/elements/wrapped-in-sc-rs-privatename-identifier-alt.js +language/expressions/class/elements/wrapped-in-sc-private-field-usage.js +language/expressions/class/elements/private-field-as-arrow-function.js +language/expressions/class/elements/same-line-async-gen-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/same-line-async-gen-rs-privatename-identifier-alt.js +language/expressions/class/elements/private-methods/prod-private-method-initialize-order.js +language/expressions/class/elements/regular-definitions-rs-privatename-identifier.js +language/expressions/class/elements/after-same-line-static-async-method-rs-privatename-identifier.js +language/expressions/class/elements/same-line-method-private-field-usage.js +language/expressions/class/elements/new-sc-line-method-rs-privatename-identifier.js +language/expressions/class/elements/after-same-line-method-rs-privatename-identifier.js +language/expressions/class/elements/private-field-access-on-inner-arrow-function.js +language/expressions/class/elements/after-same-line-static-async-method-rs-privatename-identifier-alt.js +language/expressions/class/elements/private-static-field-shadowed-by-field-on-nested-class.js +language/expressions/class/elements/same-line-async-gen-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/same-line-gen-rs-privatename-identifier-initializer.js +language/expressions/class/elements/nested-private-ternary-init-err-contains-arguments.js +language/expressions/class/elements/after-same-line-static-gen-rs-privatename-identifier.js +language/expressions/class/elements/new-sc-line-method-private-field-usage.js +language/expressions/class/elements/new-sc-line-method-rs-privatename-identifier-alt.js +language/expressions/class/elements/same-line-async-method-rs-privatename-identifier.js +language/expressions/class/elements/same-line-gen-private-field-usage.js +language/expressions/class/elements/private-literal-name-init-err-contains-arguments.js +language/expressions/class/elements/private-field-access-on-inner-function.js +language/expressions/class/elements/after-same-line-static-async-method-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/private-field-as-async-function.js +language/expressions/class/elements/same-line-method-rs-privatename-identifier.js +language/expressions/class/elements/after-same-line-static-method-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/after-same-line-static-async-gen-rs-privatename-identifier.js +language/expressions/class/elements/after-same-line-static-gen-private-field-usage.js +language/expressions/class/elements/syntax/valid/grammar-privatename-classelementname-initializer.js +language/expressions/class/elements/syntax/valid/grammar-privatenames-multi-line.js +language/expressions/class/elements/syntax/valid/grammar-privatename-no-initializer-with-method.js +language/expressions/class/elements/syntax/valid/grammar-privatename-classelementname-initializer-alt.js +language/expressions/class/elements/syntax/valid/grammar-privatename-identifier.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-gen.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-async.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-async-gen.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-privatename.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-async.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-async-gen.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-async.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-async-gen.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-gen.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-no-reference.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-no-reference.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-async-gen.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-gen.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-gen.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-gen.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-privatename.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-gen.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-async.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-async-gen.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-no-reference.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-async-gen.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-gen.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-privatename.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-privatename.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-gen.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-async-gen.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-async.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-async.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-gen.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-async.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-no-reference.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-async.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-gen.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-gen.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-async-gen.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-no-reference.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-no-reference.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-privatename.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-no-reference.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-async.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-no-reference.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-async.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-privatename.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-no-reference.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-no-reference.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-async-gen.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-privatename.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-privatename.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-async.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-async.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-gen.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-privatename.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-async-gen.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-privatename.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-async-gen.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-no-reference.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-privatename.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-no-reference.js +language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-async-gen.js +language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-privatename.js +language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-field.js +language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-field.js +language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async.js +language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-field.js +language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-obj-literal.js +language/expressions/class/elements/syntax/early-errors/grammar-privatename-whitespace-error-member-expr.js +language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage.js +language/expressions/class/elements/syntax/early-errors/grammar-privatename-whitespace-error-field-init.js +language/expressions/class/elements/syntax/early-errors/grammar-privatename-constructor.js +language/expressions/class/elements/syntax/early-errors/grammar-privatename-identifier-invalid-zwnj-error.js +language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-function-expression.js +language/expressions/class/elements/syntax/early-errors/grammar-private-field-on-object-destructuring.js +language/expressions/class/elements/syntax/early-errors/private-field-cannot-escape-token.js +language/expressions/class/elements/syntax/early-errors/grammar-privatename-error.js +language/expressions/class/elements/syntax/early-errors/grammar-private-field-super-access.js +language/expressions/class/elements/syntax/early-errors/grammar-privatename-identifier-invalid-zwj-error.js +language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-array-literal.js +language/expressions/class/elements/syntax/early-errors/grammar-privatename-identifier-invalid-ues.js +language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-gen.js +language/expressions/class/elements/syntax/early-errors/private-call-exp-cannot-escape-token.js +language/expressions/class/elements/syntax/early-errors/private-member-exp-cannot-escape-token.js +language/expressions/class/elements/syntax/early-errors/grammar-privatename-whitespace-error-call-expr.js +language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-recursive.js +language/expressions/class/elements/syntax/early-errors/grammar-privatename-in-computed-property-missing.js +language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-this.js +language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-this.js +language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-this.js +language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-this.js +language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-heritage-call-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-this.js +language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-call-expression-this.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-this.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-member-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-heritage-call-expression-this.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-this.js +language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-heritage-member-expression-this.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-call-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-heritage-member-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-this.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-this.js +language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-bad-reference.js +language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-this.js +language/expressions/class/elements/syntax/early-errors/invalid-names/method-member-expression-this.js +language/expressions/class/elements/syntax/early-errors/grammar-privatenames-same-line-error.js +language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async-gen.js +language/expressions/class/elements/syntax/early-errors/grammar-privatename-whitespace-error-field.js +language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-chained-usage.js +language/expressions/class/elements/private-typeof-init-err-contains-super.js +language/expressions/class/elements/new-sc-line-method-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/new-no-sc-line-method-rs-privatename-identifier.js +language/expressions/class/elements/after-same-line-method-rs-privatename-identifier-alt.js +language/expressions/class/elements/same-line-method-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/private-literal-name-init-err-contains-super.js +language/expressions/class/elements/after-same-line-method-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/after-same-line-static-gen-rs-privatename-identifier-initializer.js +language/expressions/class/elements/after-same-line-gen-rs-privatename-identifier.js +language/expressions/class/elements/new-no-sc-line-method-rs-privatename-identifier-initializer.js +language/expressions/class/elements/wrapped-in-sc-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/multiple-stacked-definitions-rs-privatename-identifier.js +language/expressions/class/elements/private-field-after-optional-chain.js +language/expressions/class/elements/multiple-definitions-rs-privatename-identifier-alt.js +language/expressions/class/elements/after-same-line-gen-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/new-sc-line-gen-private-field-usage.js +language/expressions/class/elements/new-sc-line-gen-rs-privatename-identifier.js +language/expressions/class/elements/wrapped-in-sc-rs-privatename-identifier.js +language/expressions/class/elements/same-line-gen-rs-privatename-identifier-alt.js +language/expressions/class/elements/nested-private-arrow-fnc-init-err-contains-arguments.js +language/expressions/class/elements/after-same-line-static-async-method-private-field-usage.js +language/expressions/class/elements/new-no-sc-line-method-private-field-usage.js +language/expressions/class/elements/same-line-async-gen-private-names.js +language/expressions/class/elements/multiple-stacked-definitions-private-field-usage.js +language/expressions/class/elements/multiple-definitions-private-field-usage.js +language/expressions/class/elements/same-line-method-rs-privatename-identifier-alt.js +language/expressions/class/elements/same-line-gen-rs-privatename-identifier.js +language/expressions/class/elements/after-same-line-static-gen-grammar-privatename-identifier-semantics-stringvalue.js +language/expressions/class/elements/new-sc-line-gen-private-names.js +language/expressions/class/elements/fields-anonymous-function-length.js +language/expressions/class/elements/same-line-async-method-rs-privatename-identifier-alt.js +language/expressions/class/elements/new-no-sc-line-method-private-names.js +language/expressions/class/elements/regular-definitions-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/same-line-gen-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/after-same-line-gen-rs-privatename-identifier-alt.js +language/expressions/class/elements/multiple-stacked-definitions-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/new-sc-line-gen-rs-privatename-identifier-alt.js +language/expressions/class/elements/after-same-line-static-gen-rs-privatename-identifier-initializer-alt.js +language/expressions/class/elements/regular-definitions-private-field-usage.js +language/expressions/function/early-errors/invalid-names-call-expression-this.js +language/expressions/function/early-errors/invalid-names-member-expression-bad-reference.js +language/expressions/function/early-errors/invalid-names-member-expression-this.js +language/expressions/function/early-errors/invalid-names-call-expression-bad-reference.js +language/statements/block/early-errors/invalid-names-call-expression-this.js +language/statements/block/early-errors/invalid-names-member-expression-bad-reference.js +language/statements/block/early-errors/invalid-names-member-expression-this.js +language/statements/block/early-errors/invalid-names-call-expression-bad-reference.js +language/statements/class/elements/wrapped-in-sc-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/after-same-line-static-method-rs-privatename-identifier-alt.js +language/statements/class/elements/same-line-async-method-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/after-same-line-static-method-private-field-usage.js +language/statements/class/elements/private-field-as-function.js +language/statements/class/elements/after-same-line-static-async-gen-rs-privatename-identifier-initializer.js +language/statements/class/elements/new-sc-line-gen-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/nested-private-literal-name-init-err-contains-arguments.js +language/statements/class/elements/wrapped-in-sc-rs-privatename-identifier-initializer.js +language/statements/class/elements/after-same-line-static-gen-rs-privatename-identifier-alt.js +language/statements/class/elements/private-static-method-shadowed-by-field-on-nested-class.js +language/statements/class/elements/regular-definitions-private-names.js +language/statements/class/elements/after-same-line-gen-rs-privatename-identifier-initializer.js +language/statements/class/elements/multiple-definitions-private-names.js +language/statements/class/elements/regular-definitions-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/private-field-on-nested-class.js +language/statements/class/elements/after-same-line-static-method-rs-privatename-identifier.js +language/statements/class/elements/after-same-line-method-private-names.js +language/statements/class/elements/same-line-async-method-rs-privatename-identifier-initializer.js +language/statements/class/elements/new-no-sc-line-method-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/new-sc-line-method-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/private-method-shadowed-by-field-on-nested-class.js +language/statements/class/elements/after-same-line-static-async-method-rs-privatename-identifier-initializer.js +language/statements/class/elements/after-same-line-static-async-gen-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/nested-private-typeof-init-err-contains-arguments.js +language/statements/class/elements/nested-private-arrow-fnc-init-err-contains-super.js +language/statements/class/elements/after-same-line-static-async-method-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/nested-private-literal-name-init-err-contains-super.js +language/statements/class/elements/private-arrow-fnc-init-err-contains-super.js +language/statements/class/elements/after-same-line-gen-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/fields-duplicate-privatenames.js +language/statements/class/elements/private-ternary-init-err-contains-super.js +language/statements/class/elements/same-line-async-method-private-field-usage.js +language/statements/class/elements/new-no-sc-line-method-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/nested-private-ternary-init-err-contains-super.js +language/statements/class/elements/after-same-line-static-method-rs-privatename-identifier-initializer.js +language/statements/class/elements/same-line-async-gen-rs-privatename-identifier-initializer.js +language/statements/class/elements/private-field-as-async-arrow-function.js +language/statements/class/elements/privatefieldget-typeerror-4.js +language/statements/class/elements/privatefieldset-typeerror-11.js +language/statements/class/elements/multiple-stacked-definitions-private-names.js +language/statements/class/elements/private-arrow-fnc-init-err-contains-arguments.js +language/statements/class/elements/new-sc-line-gen-rs-privatename-identifier-initializer.js +language/statements/class/elements/regular-definitions-rs-privatename-identifier-initializer.js +language/statements/class/elements/privatefieldset-typeerror-7.js +language/statements/class/elements/privatename-not-valid-earlyerr-script-5.js +language/statements/class/elements/after-same-line-static-async-gen-private-names.js +language/statements/class/elements/same-line-method-rs-privatename-identifier-initializer.js +language/statements/class/elements/multiple-stacked-definitions-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/regular-definitions-rs-privatename-identifier-alt.js +language/statements/class/elements/wrapped-in-sc-private-names.js +language/statements/class/elements/new-sc-line-method-rs-privatename-identifier-initializer.js +language/statements/class/elements/same-line-async-method-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/same-line-async-gen-private-field-usage.js +language/statements/class/elements/same-line-gen-private-names.js +language/statements/class/elements/new-sc-line-method-private-names.js +language/statements/class/elements/new-sc-line-gen-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/after-same-line-gen-private-names.js +language/statements/class/elements/after-same-line-method-private-field-usage.js +language/statements/class/elements/multiple-definitions-rs-privatename-identifier-initializer.js +language/statements/class/elements/same-line-method-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/privatename-not-valid-earlyerr-script-1.js +language/statements/class/elements/grammar-private-field-optional-chaining.js +language/statements/class/elements/after-same-line-static-async-gen-private-field-usage.js +language/statements/class/elements/same-line-async-gen-rs-privatename-identifier.js +language/statements/class/elements/multiple-definitions-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/multiple-definitions-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/after-same-line-static-gen-private-names.js +language/statements/class/elements/multiple-stacked-definitions-rs-privatename-identifier-alt.js +language/statements/class/elements/privatefieldset-typeerror-10.js +language/statements/class/elements/new-no-sc-line-method-rs-privatename-identifier-alt.js +language/statements/class/elements/private-typeof-init-err-contains-arguments.js +language/statements/class/elements/privatename-not-valid-earlyerr-script-4.js +language/statements/class/elements/multiple-definitions-rs-privatename-identifier.js +language/statements/class/elements/same-line-gen-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/after-same-line-static-async-gen-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/same-line-async-method-private-names.js +language/statements/class/elements/multiple-stacked-definitions-rs-privatename-identifier-initializer.js +language/statements/class/elements/same-line-method-private-names.js +language/statements/class/elements/after-same-line-static-method-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/after-same-line-static-method-private-names.js +language/statements/class/elements/after-same-line-static-async-method-private-names.js +language/statements/class/elements/private-ternary-init-err-contains-arguments.js +language/statements/class/elements/privatefieldset-evaluation-order-3.js +language/statements/class/elements/privatefieldset-typeerror-4.js +language/statements/class/elements/privatefieldset-typeerror-1.js +language/statements/class/elements/after-same-line-static-async-gen-rs-privatename-identifier-alt.js +language/statements/class/elements/after-same-line-method-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/after-same-line-method-rs-privatename-identifier-initializer.js +language/statements/class/elements/after-same-line-gen-private-field-usage.js +language/statements/class/elements/nested-private-typeof-init-err-contains-super.js +language/statements/class/elements/wrapped-in-sc-rs-privatename-identifier-alt.js +language/statements/class/elements/wrapped-in-sc-private-field-usage.js +language/statements/class/elements/privatefieldget-success-2.js +language/statements/class/elements/private-field-as-arrow-function.js +language/statements/class/elements/same-line-async-gen-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/same-line-async-gen-rs-privatename-identifier-alt.js +language/statements/class/elements/private-methods/prod-private-method-initialize-order.js +language/statements/class/elements/regular-definitions-rs-privatename-identifier.js +language/statements/class/elements/privatename-not-valid-earlyerr-script-7.js +language/statements/class/elements/after-same-line-static-async-method-rs-privatename-identifier.js +language/statements/class/elements/same-line-method-private-field-usage.js +language/statements/class/elements/privatename-not-valid-earlyerr-script-6.js +language/statements/class/elements/new-sc-line-method-rs-privatename-identifier.js +language/statements/class/elements/privatefieldset-typeerror-9.js +language/statements/class/elements/after-same-line-method-rs-privatename-identifier.js +language/statements/class/elements/private-field-access-on-inner-arrow-function.js +language/statements/class/elements/privatefieldset-typeerror-6.js +language/statements/class/elements/after-same-line-static-async-method-rs-privatename-identifier-alt.js +language/statements/class/elements/private-static-field-shadowed-by-field-on-nested-class.js +language/statements/class/elements/same-line-async-gen-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/same-line-gen-rs-privatename-identifier-initializer.js +language/statements/class/elements/nested-private-ternary-init-err-contains-arguments.js +language/statements/class/elements/after-same-line-static-gen-rs-privatename-identifier.js +language/statements/class/elements/new-sc-line-method-private-field-usage.js +language/statements/class/elements/privatefieldget-primitive-receiver.js +language/statements/class/elements/new-sc-line-method-rs-privatename-identifier-alt.js +language/statements/class/elements/same-line-async-method-rs-privatename-identifier.js +language/statements/class/elements/privatefieldget-success-3.js +language/statements/class/elements/privatefieldget-success-5.js +language/statements/class/elements/privatename-not-valid-earlyerr-script-8.js +language/statements/class/elements/privatefieldset-evaluation-order-1.js +language/statements/class/elements/same-line-gen-private-field-usage.js +language/statements/class/elements/private-literal-name-init-err-contains-arguments.js +language/statements/class/elements/private-field-access-on-inner-function.js +language/statements/class/elements/after-same-line-static-async-method-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/privatefieldset-typeerror-8.js +language/statements/class/elements/private-field-as-async-function.js +language/statements/class/elements/same-line-method-rs-privatename-identifier.js +language/statements/class/elements/privatefieldput-primitive-receiver.js +language/statements/class/elements/after-same-line-static-method-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/after-same-line-static-async-gen-rs-privatename-identifier.js +language/statements/class/elements/after-same-line-static-gen-private-field-usage.js +language/statements/class/elements/syntax/valid/grammar-privatename-classelementname-initializer.js +language/statements/class/elements/syntax/valid/grammar-privatenames-multi-line.js +language/statements/class/elements/syntax/valid/grammar-privatename-no-initializer-with-method.js +language/statements/class/elements/syntax/valid/grammar-privatename-classelementname-initializer-alt.js +language/statements/class/elements/syntax/valid/grammar-privatename-identifier.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-gen.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-async.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-async-gen.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-privatename.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-async.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-async-gen.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-async.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-async-gen.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-gen.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-no-reference.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-no-reference.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-async-gen.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-gen.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-gen.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-gen.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-privatename.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-gen.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-async.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-async-gen.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-no-reference.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-async-gen.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-gen.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-privatename.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-privatename.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-gen.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-async-gen.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-async.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-async.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-gen.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-async.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-no-reference.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-async.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-gen.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-gen.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-async-gen.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-no-reference.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-no-reference.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-privatename.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-no-reference.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-async.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-no-reference.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-async.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-privatename.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-no-reference.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-no-reference.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-async-gen.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-privatename.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-privatename.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-async.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-async.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-gen.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-privatename.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-async-gen.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-privatename.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-async-gen.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-no-reference.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-privatename.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-no-reference.js +language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-async-gen.js +language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-privatename.js +language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-field.js +language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-field.js +language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async.js +language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-field.js +language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-obj-literal.js +language/statements/class/elements/syntax/early-errors/grammar-privatename-whitespace-error-member-expr.js +language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage.js +language/statements/class/elements/syntax/early-errors/grammar-privatename-whitespace-error-field-init.js +language/statements/class/elements/syntax/early-errors/grammar-privatename-constructor.js +language/statements/class/elements/syntax/early-errors/grammar-privatename-identifier-invalid-zwnj-error.js +language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-function-expression.js +language/statements/class/elements/syntax/early-errors/grammar-private-field-on-object-destructuring.js +language/statements/class/elements/syntax/early-errors/private-field-cannot-escape-token.js +language/statements/class/elements/syntax/early-errors/grammar-privatename-error.js +language/statements/class/elements/syntax/early-errors/grammar-private-field-super-access.js +language/statements/class/elements/syntax/early-errors/grammar-privatename-identifier-invalid-zwj-error.js +language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-array-literal.js +language/statements/class/elements/syntax/early-errors/grammar-privatename-identifier-invalid-ues.js +language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-gen.js +language/statements/class/elements/syntax/early-errors/private-call-exp-cannot-escape-token.js +language/statements/class/elements/syntax/early-errors/private-member-exp-cannot-escape-token.js +language/statements/class/elements/syntax/early-errors/grammar-privatename-whitespace-error-call-expr.js +language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-recursive.js +language/statements/class/elements/syntax/early-errors/grammar-privatename-in-computed-property-missing.js +language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-call-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/fields-init-heritage-call-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/fields-init-heritage-call-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-member-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/fields-init-heritage-member-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-call-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/method-member-expression-this.js +language/statements/class/elements/syntax/early-errors/invalid-names/fields-init-heritage-member-expression-bad-reference.js +language/statements/class/elements/syntax/early-errors/grammar-privatenames-same-line-error.js +language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async-gen.js +language/statements/class/elements/syntax/early-errors/grammar-privatename-whitespace-error-field.js +language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-chained-usage.js +language/statements/class/elements/private-typeof-init-err-contains-super.js +language/statements/class/elements/new-sc-line-method-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/new-no-sc-line-method-rs-privatename-identifier.js +language/statements/class/elements/after-same-line-method-rs-privatename-identifier-alt.js +language/statements/class/elements/same-line-method-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/private-literal-name-init-err-contains-super.js +language/statements/class/elements/after-same-line-method-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/after-same-line-static-gen-rs-privatename-identifier-initializer.js +language/statements/class/elements/after-same-line-gen-rs-privatename-identifier.js +language/statements/class/elements/new-no-sc-line-method-rs-privatename-identifier-initializer.js +language/statements/class/elements/wrapped-in-sc-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/multiple-stacked-definitions-rs-privatename-identifier.js +language/statements/class/elements/privatename-not-valid-earlyerr-script-3.js +language/statements/class/elements/private-field-after-optional-chain.js +language/statements/class/elements/privatefieldget-success-4.js +language/statements/class/elements/multiple-definitions-rs-privatename-identifier-alt.js +language/statements/class/elements/after-same-line-gen-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/new-sc-line-gen-private-field-usage.js +language/statements/class/elements/new-sc-line-gen-rs-privatename-identifier.js +language/statements/class/elements/wrapped-in-sc-rs-privatename-identifier.js +language/statements/class/elements/same-line-gen-rs-privatename-identifier-alt.js +language/statements/class/elements/nested-private-arrow-fnc-init-err-contains-arguments.js +language/statements/class/elements/private-field-is-not-clobbered-by-computed-property.js +language/statements/class/elements/after-same-line-static-async-method-private-field-usage.js +language/statements/class/elements/new-no-sc-line-method-private-field-usage.js +language/statements/class/elements/same-line-async-gen-private-names.js +language/statements/class/elements/multiple-stacked-definitions-private-field-usage.js +language/statements/class/elements/multiple-definitions-private-field-usage.js +language/statements/class/elements/same-line-method-rs-privatename-identifier-alt.js +language/statements/class/elements/same-line-gen-rs-privatename-identifier.js +language/statements/class/elements/after-same-line-static-gen-grammar-privatename-identifier-semantics-stringvalue.js +language/statements/class/elements/new-sc-line-gen-private-names.js +language/statements/class/elements/privatename-not-valid-earlyerr-script-2.js +language/statements/class/elements/fields-anonymous-function-length.js +language/statements/class/elements/privatefieldset-evaluation-order-2.js +language/statements/class/elements/same-line-async-method-rs-privatename-identifier-alt.js +language/statements/class/elements/new-no-sc-line-method-private-names.js +language/statements/class/elements/regular-definitions-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/same-line-gen-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/after-same-line-gen-rs-privatename-identifier-alt.js +language/statements/class/elements/privatefieldget-typeerror-1.js +language/statements/class/elements/multiple-stacked-definitions-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/new-sc-line-gen-rs-privatename-identifier-alt.js +language/statements/class/elements/after-same-line-static-gen-rs-privatename-identifier-initializer-alt.js +language/statements/class/elements/regular-definitions-private-field-usage.js +language/statements/class/static-init-scope-private.js +language/statements/function/early-errors/invalid-names-call-expression-this.js +language/statements/function/early-errors/invalid-names-member-expression-bad-reference.js +language/statements/function/early-errors/invalid-names-member-expression-this.js +language/statements/function/early-errors/invalid-names-call-expression-bad-reference.js +language/identifiers/part-unicode-8.0.0-class.js +language/identifiers/start-unicode-6.1.0-class-escaped.js +language/identifiers/start-unicode-10.0.0-class.js +language/identifiers/part-unicode-12.0.0-class-escaped.js +language/identifiers/part-unicode-5.2.0-class-escaped.js +language/identifiers/start-unicode-15.0.0-class-escaped.js +language/identifiers/part-unicode-9.0.0-class-escaped.js +language/identifiers/part-unicode-11.0.0-class-escaped.js +language/identifiers/part-unicode-11.0.0-class.js +language/identifiers/start-unicode-12.0.0-class.js +language/identifiers/part-unicode-7.0.0-class.js +language/identifiers/part-unicode-6.1.0-class.js +language/identifiers/part-unicode-10.0.0-class-escaped.js +language/identifiers/start-unicode-10.0.0-class-escaped.js +language/identifiers/part-unicode-14.0.0-class-escaped.js +language/identifiers/part-unicode-13.0.0-class-escaped.js +language/identifiers/part-unicode-6.1.0-class-escaped.js +language/identifiers/part-unicode-14.0.0-class.js +language/identifiers/start-unicode-5.2.0-class-escaped.js +language/identifiers/part-unicode-10.0.0-class.js +language/identifiers/start-unicode-11.0.0-class.js +language/identifiers/start-unicode-14.0.0-class.js +language/identifiers/start-unicode-11.0.0-class-escaped.js +language/identifiers/start-unicode-9.0.0-class.js +language/identifiers/start-unicode-7.0.0-class.js +language/identifiers/start-unicode-6.0.0-class-escaped.js +language/identifiers/start-unicode-15.0.0-class.js +language/identifiers/start-unicode-5.2.0-class.js +language/identifiers/part-unicode-12.0.0-class.js +language/identifiers/start-unicode-13.0.0-class.js +language/identifiers/part-unicode-7.0.0-class-escaped.js +language/identifiers/part-unicode-8.0.0-class-escaped.js +language/identifiers/part-unicode-9.0.0-class.js +language/identifiers/start-unicode-9.0.0-class-escaped.js +language/identifiers/part-unicode-6.0.0-class-escaped.js +language/identifiers/part-unicode-13.0.0-class.js +language/identifiers/start-unicode-14.0.0-class-escaped.js +language/identifiers/start-unicode-6.1.0-class.js +language/identifiers/start-unicode-12.0.0-class-escaped.js +language/identifiers/part-unicode-15.0.0-class-escaped.js +language/identifiers/start-unicode-8.0.0-class-escaped.js +language/identifiers/part-unicode-6.0.0-class.js +language/identifiers/start-unicode-7.0.0-class-escaped.js +language/identifiers/part-unicode-5.2.0-class.js +language/identifiers/start-unicode-8.0.0-class.js +language/identifiers/start-unicode-13.0.0-class-escaped.js +language/identifiers/part-unicode-15.0.0-class.js +language/identifiers/start-unicode-6.0.0-class.js +language/module-code/invalid-private-names-member-expression-this.js +language/module-code/privatename-not-valid-earlyerr-module-5.js +language/module-code/privatename-not-valid-earlyerr-module-2.js +language/module-code/privatename-valid-no-earlyerr.js +language/module-code/invalid-private-names-call-expression-bad-reference.js +language/module-code/privatename-not-valid-earlyerr-module-1.js +language/module-code/privatename-not-valid-earlyerr-module-3.js +language/module-code/privatename-not-valid-earlyerr-module-4.js +language/module-code/invalid-private-names-member-expression-bad-reference.js +language/module-code/privatename-not-valid-earlyerr-module-8.js +language/module-code/privatename-not-valid-earlyerr-module-6.js +language/module-code/privatename-not-valid-earlyerr-module-7.js +language/module-code/invalid-private-names-call-expression-this.js +language/global-code/invalid-private-names-member-expression-this.js +language/global-code/invalid-private-names-call-expression-bad-reference.js +language/global-code/invalid-private-names-member-expression-bad-reference.js +language/global-code/invalid-private-names-call-expression-this.js \ No newline at end of file -- Gitee