From 2d4852907318d5fdd0cf3c30e671da861fe96ff1 Mon Sep 17 00:00:00 2001 From: davidot Date: Mon, 18 Oct 2021 23:32:47 +0200 Subject: [PATCH] LibJS: Implement private identifiers in optional chains --- Userland/Libraries/LibJS/AST.cpp | 11 +++++++++++ Userland/Libraries/LibJS/AST.h | 6 +++++- Userland/Libraries/LibJS/Parser.cpp | 20 +++++++++++++++++++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibJS/AST.cpp b/Userland/Libraries/LibJS/AST.cpp index 009065051c..a715fa384b 100644 --- a/Userland/Libraries/LibJS/AST.cpp +++ b/Userland/Libraries/LibJS/AST.cpp @@ -2704,6 +2704,11 @@ void OptionalChain::dump(int indent) const print_indent(indent + 1); outln("MemberReference({})", ref.mode == Mode::Optional ? "Optional" : "Not Optional"); ref.identifier->dump(indent + 2); + }, + [&](PrivateMemberReference const& ref) { + print_indent(indent + 1); + outln("PrivateMemberReference({})", ref.mode == Mode::Optional ? "Optional" : "Not Optional"); + ref.private_identifier->dump(indent + 2); }); } } @@ -2738,6 +2743,12 @@ Optional OptionalChain::to_reference_and_value create_ast_node(source_range(), *base_reference, base), ref.identifier, false); + }, + [&](PrivateMemberReference const& ref) -> NonnullRefPtr { + return create_ast_node(source_range(), + create_ast_node(source_range(), *base_reference, base), + ref.private_identifier, + false); }); if (is(*expression)) { base_reference = JS::Reference {}; diff --git a/Userland/Libraries/LibJS/AST.h b/Userland/Libraries/LibJS/AST.h index 88ef640da4..6b8b46bd9a 100644 --- a/Userland/Libraries/LibJS/AST.h +++ b/Userland/Libraries/LibJS/AST.h @@ -1590,8 +1590,12 @@ public: NonnullRefPtr identifier; Mode mode; }; + struct PrivateMemberReference { + NonnullRefPtr private_identifier; + Mode mode; + }; - using Reference = Variant; + using Reference = Variant; OptionalChain(SourceRange source_range, NonnullRefPtr base, Vector references) : Expression(source_range) diff --git a/Userland/Libraries/LibJS/Parser.cpp b/Userland/Libraries/LibJS/Parser.cpp index 787fc3ff90..0bfdefb1ed 100644 --- a/Userland/Libraries/LibJS/Parser.cpp +++ b/Userland/Libraries/LibJS/Parser.cpp @@ -2696,6 +2696,17 @@ NonnullRefPtr Parser::parse_optional_chain(NonnullRefPtr({ m_state.current_token.filename(), start, position() }, private_identifier.value()), + OptionalChain::Mode::Optional }); + break; + } case TokenType::TemplateLiteralStart: // 13.3.1.1 - Static Semantics: Early Errors // OptionalChain : @@ -2721,7 +2732,14 @@ NonnullRefPtr Parser::parse_optional_chain(NonnullRefPtr({ m_state.current_token.filename(), start, position() }, private_identifier.value()), + OptionalChain::Mode::NotOptional, + }); + } else if (match_identifier_name()) { auto start = position(); auto identifier = consume(); chain.append(OptionalChain::MemberReference {