Ver Fonte

LibJS: New expressions look for expressions with correct precedence

Matthew Olsson há 5 anos atrás
pai
commit
5cd01ed79e
2 ficheiros alterados com 52 adições e 2 exclusões
  1. 1 2
      Libraries/LibJS/Parser.cpp
  2. 51 0
      Libraries/LibJS/Tests/new-expression.js

+ 1 - 2
Libraries/LibJS/Parser.cpp

@@ -893,8 +893,7 @@ NonnullRefPtr<NewExpression> Parser::parse_new_expression()
 {
     consume(TokenType::New);
 
-    // FIXME: Support full expressions as the callee as well.
-    auto callee = create_ast_node<Identifier>(consume(TokenType::Identifier).value());
+    auto callee = parse_expression(g_operator_precedence.get(TokenType::New).value(), Associativity::Right, { TokenType::ParenOpen });
 
     Vector<CallExpression::Argument> arguments;
 

+ 51 - 0
Libraries/LibJS/Tests/new-expression.js

@@ -0,0 +1,51 @@
+load("test-common.js");
+
+try {
+    function Foo() { this.x = 1; }
+
+    let foo = new Foo();
+    assert(foo.x === 1);
+
+    foo = new Foo
+    assert(foo.x === 1);
+
+    foo = new
+    Foo
+    ()
+    assert(foo.x === 1);
+
+    foo = new Foo + 2
+    assert(foo === "[object Object]2");
+
+    let a = {
+        b: function() {
+            this.x = 2;
+        },
+    };
+
+    foo = new a.b();
+    assert(foo.x === 2);
+
+    foo = new a.b;
+    assert(foo.x === 2);
+
+    foo = new
+    a.b();
+    assert(foo.x === 2);
+
+    function funcGetter() {
+        return function(a, b) {
+            this.x = a + b;
+        };
+    };
+
+    foo = new funcGetter()(1, 5);
+    assert(foo === undefined);
+
+    foo = new (funcGetter())(1, 5);
+    assert(foo.x === 6);
+
+    console.log("PASS");
+} catch (e) {
+    console.log("FAIL: " + e);
+}