ES6 class syntax should allow static setters and getters
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 1 Apr 2015 02:35:56 +0000 (02:35 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 1 Apr 2015 02:35:56 +0000 (02:35 +0000)
https://bugs.webkit.org/show_bug.cgi?id=143180

Source/JavaScriptCore:

Reviewed by Filip Pizlo

Apparently I misread the spec when I initially implemented parseClass.
ES6 class syntax allows static getters and setters so just allow that.

* parser/Parser.cpp:
(JSC::Parser<LexerType>::parseClass):

LayoutTests:

Reviewed by Filip Pizlo.

Added test cases.

* js/class-syntax-declaration-expected.txt:
* js/class-syntax-expression-expected.txt:
* js/script-tests/class-syntax-declaration.js:
* js/script-tests/class-syntax-expression.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@182218 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/js/class-syntax-declaration-expected.txt
LayoutTests/js/class-syntax-expression-expected.txt
LayoutTests/js/script-tests/class-syntax-declaration.js
LayoutTests/js/script-tests/class-syntax-expression.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/parser/Parser.cpp

index bfcfc3b0a1c91968039a482e38089eed04225ae0..b372e13920ee27580efa6da1de57a44abc7a4753 100644 (file)
@@ -1,3 +1,17 @@
+2015-03-31  Ryosuke Niwa  <rniwa@webkit.org>
+
+        ES6 class syntax should allow static setters and getters
+        https://bugs.webkit.org/show_bug.cgi?id=143180
+
+        Reviewed by Filip Pizlo.
+
+        Added test cases.
+
+        * js/class-syntax-declaration-expected.txt:
+        * js/class-syntax-expression-expected.txt:
+        * js/script-tests/class-syntax-declaration.js:
+        * js/script-tests/class-syntax-expression.js:
+
 2015-03-31  Simon Fraser  <simon.fraser@apple.com>
 
         Make it possible to compute a region for elements on the page that have wheel event handlers
index 59ed67f1a66d8a179f41f62559db66b91a32f3d9..dd000297404d90a389eff73899b1933719dad7b2 100644 (file)
@@ -5,14 +5,14 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 PASS constructorCallCount is 0
 PASS A.someStaticMethod() is staticMethodValue
+PASS A.someStaticGetter is getterValue
+PASS setterValue = undefined; A.someStaticSetter = 123; setterValue is 123
 PASS (new A).someInstanceMethod() is instanceMethodValue
 PASS constructorCallCount is 1
 PASS (new A).someGetter is getterValue
 PASS constructorCallCount is 2
 PASS (new A).someGetter is getterValue
-PASS setterValue is undefined
-PASS (new A).someSetter = 789 did not throw exception.
-PASS setterValue is 789
+PASS setterValue = undefined; (new A).someSetter = 789; setterValue is 789
 PASS (new A).__proto__ is A.prototype
 PASS A.prototype.constructor is A
 PASS class threw exception SyntaxError: Unexpected end of script.
index b2725d591421b6a9b6d6a0a8402c0448d45c0019..db302d42f362db2051bb90f16f141a6967888259 100644 (file)
@@ -5,14 +5,14 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 PASS constructorCallCount is 0
 PASS A.someStaticMethod() is staticMethodValue
+PASS A.someStaticGetter is getterValue
+PASS setterValue = undefined; A.someStaticSetter = 123; setterValue is 123
 PASS (new A).someInstanceMethod() is instanceMethodValue
 PASS constructorCallCount is 1
 PASS (new A).someGetter is getterValue
 PASS constructorCallCount is 2
 PASS (new A).someGetter is getterValue
-PASS setterValue is undefined
-PASS (new A).someSetter = 789 did not throw exception.
-PASS setterValue is 789
+PASS setterValue = undefined; (new A).someSetter = 789; setterValue is 789
 PASS (new A).__proto__ is A.prototype
 PASS A.prototype.constructor is A
 PASS x = class threw exception SyntaxError: Unexpected end of script.
index 78a669975ce501cd90275bc42e7917d309b52d17..769688c4eea28509a2d5f86ef3e8bad0502b29d4 100644 (file)
@@ -9,6 +9,8 @@ var setterValue = undefined;
 class A {
     constructor() { constructorCallCount++; }
     static someStaticMethod() { return staticMethodValue; }
+    static get someStaticGetter() { return getterValue; }
+    static set someStaticSetter(value) { setterValue = value; }
     someInstanceMethod() { return instanceMethodValue; }
     get someGetter() { return getterValue; }
     set someSetter(value) { setterValue = value; }
@@ -16,14 +18,14 @@ class A {
 
 shouldBe("constructorCallCount", "0");
 shouldBe("A.someStaticMethod()", "staticMethodValue");
+shouldBe("A.someStaticGetter", "getterValue");
+shouldBe("setterValue = undefined; A.someStaticSetter = 123; setterValue", "123");
 shouldBe("(new A).someInstanceMethod()", "instanceMethodValue");
 shouldBe("constructorCallCount", "1");
 shouldBe("(new A).someGetter", "getterValue");
 shouldBe("constructorCallCount", "2");
 shouldBe("(new A).someGetter", "getterValue");
-shouldBe("setterValue", "undefined");
-shouldNotThrow("(new A).someSetter = 789");
-shouldBe("setterValue", "789");
+shouldBe("setterValue = undefined; (new A).someSetter = 789; setterValue", "789");
 shouldBe("(new A).__proto__", "A.prototype");
 shouldBe("A.prototype.constructor", "A");
 
index b581111231000765626b22c1d463b9cfacd75396..16c67c7ec38659c1c6b67107e2db4185b4cdbd10 100644 (file)
@@ -9,6 +9,8 @@ var setterValue = undefined;
 var A = class {
     constructor() { constructorCallCount++; }
     static someStaticMethod() { return staticMethodValue; }
+    static get someStaticGetter() { return getterValue; }
+    static set someStaticSetter(value) { setterValue = value; }
     someInstanceMethod() { return instanceMethodValue; }
     get someGetter() { return getterValue; }
     set someSetter(value) { setterValue = value; }
@@ -16,14 +18,14 @@ var A = class {
 
 shouldBe("constructorCallCount", "0");
 shouldBe("A.someStaticMethod()", "staticMethodValue");
+shouldBe("A.someStaticGetter", "getterValue");
+shouldBe("setterValue = undefined; A.someStaticSetter = 123; setterValue", "123");
 shouldBe("(new A).someInstanceMethod()", "instanceMethodValue");
 shouldBe("constructorCallCount", "1");
 shouldBe("(new A).someGetter", "getterValue");
 shouldBe("constructorCallCount", "2");
 shouldBe("(new A).someGetter", "getterValue");
-shouldBe("setterValue", "undefined");
-shouldNotThrow("(new A).someSetter = 789");
-shouldBe("setterValue", "789");
+shouldBe("setterValue = undefined; (new A).someSetter = 789; setterValue", "789");
 shouldBe("(new A).__proto__", "A.prototype");
 shouldBe("A.prototype.constructor", "A");
 
index 1f9b33de0957e740fd88d2427d32e177c704bfac..a8661ecef56cad23faece20a4f1e607fd5710085 100644 (file)
@@ -1,3 +1,16 @@
+2015-03-31  Ryosuke Niwa  <rniwa@webkit.org>
+
+        ES6 class syntax should allow static setters and getters
+        https://bugs.webkit.org/show_bug.cgi?id=143180
+
+        Reviewed by Filip Pizlo
+
+        Apparently I misread the spec when I initially implemented parseClass.
+        ES6 class syntax allows static getters and setters so just allow that.
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::parseClass):
+
 2015-03-31  Filip Pizlo  <fpizlo@apple.com>
 
         PutClosureVar CSE def() rule has a wrong base
index 5f4480b49cad5d49156c625fa484af7a1dc8b3cf..32d250ca7cc53f4bea61f61b6dabfe64bcbc6846 100644 (file)
@@ -1545,7 +1545,6 @@ template <class TreeBuilder> TreeClassExpression Parser<LexerType>::parseClass(T
         TreeProperty property;
         const bool alwaysStrictInsideClass = true;
         if (isGetter || isSetter) {
-            semanticFailIfTrue(isStaticMethod, "Cannot declare a static", stringForFunctionMode(isGetter ? GetterMode : SetterMode));
             nextExpectIdentifier(LexerFlagsIgnoreReservedWords);
             property = parseGetterSetter(context, alwaysStrictInsideClass, isGetter ? PropertyNode::Getter : PropertyNode::Setter, methodStart, constructorKind, SuperBinding::Needed);
             failIfFalse(property, "Cannot parse this method");