Просмотр исходного кода

JSSpecCompiler: Parse "the *this* value" in expressions

Dan Klishch 1 год назад
Родитель
Сommit
3e6a07154b

+ 15 - 0
Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Parser/TextParser.cpp

@@ -194,6 +194,18 @@ TextParseErrorOr<Tree> TextParser::parse_list_initialization()
     return make_ref_counted<List>(move(elements));
 }
 
+TextParseErrorOr<Tree> TextParser::parse_the_this_value()
+{
+    auto rollback = rollback_point();
+
+    TRY(consume_word("the"sv));
+    TRY(consume_token(TokenType::WellKnownValue, "this"sv));
+    TRY(consume_word("value"sv));
+
+    rollback.disarm();
+    return make_ref_counted<WellKnownNode>(WellKnownNode::Type::This);
+}
+
 // <value> :== <identifier> | <well_known_value> | <enumerator> | <number> | <string> | <list_initialization> | <record_initialization>
 TextParseErrorOr<Tree> TextParser::parse_value()
 {
@@ -232,6 +244,9 @@ TextParseErrorOr<Tree> TextParser::parse_value()
     if (auto record_initialization = parse_record_direct_list_initialization(); !record_initialization.is_error())
         return record_initialization.release_value();
 
+    if (auto the_this_value = parse_the_this_value(); !the_this_value.is_error())
+        return the_this_value.release_value();
+
     return TextParseError {};
 }
 

+ 1 - 0
Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Parser/TextParser.h

@@ -78,6 +78,7 @@ private:
     TextParseErrorOr<Tree> parse_record_direct_list_initialization();
     TextParseErrorOr<Vector<Tree>> parse_function_arguments();
     TextParseErrorOr<Tree> parse_list_initialization();
+    TextParseErrorOr<Tree> parse_the_this_value();
     TextParseErrorOr<Tree> parse_value();
     TextParseErrorOr<Tree> parse_expression();
     TextParseErrorOr<Tree> parse_condition();

+ 10 - 0
Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Tests/spec-parsing.xml

@@ -63,4 +63,14 @@
          </ol>
       </emu-alg>
    </emu-clause>
+   <emu-clause id="6">
+      <h1><span class="secnum">6</span> get Temporal.PlainDateTime.prototype.inLeapYear</h1>
+      <emu-alg>
+         <ol>
+            <li>Let <var>dateTime</var> be the <emu-val>this</emu-val> value.</li>
+            <li>Perform ? <emu-xref><a>RequireInternalSlot</a></emu-xref>(<var>dateTime</var>, <var class="field">[[A]]</var>).</li>
+            <li>Return <emu-val>undefined</emu-val>.</li>
+         </ol>
+      </emu-alg>
+   </emu-clause>
 </specification>

+ 13 - 0
Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Tests/spec-parsing.xml.expectation

@@ -87,3 +87,16 @@ TreeList
   ReturnNode
     Enumerator unused
 
+%get Temporal.PlainDateTime.prototype.inLeapYear%():
+TreeList
+  BinaryOperation Assignment
+    Var dateTime
+    WellKnownNode This
+  UnaryOperation ReturnIfAbrubt
+    FunctionCall
+      UnresolvedReference RequireInternalSlot
+      Var dateTime
+      Slot A
+  ReturnNode
+    WellKnownNode Undefined
+