[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master dad2f12 03/45: Support method definitions in object litera
From: |
Dmitry Gutov |
Subject: |
[elpa] master dad2f12 03/45: Support method definitions in object literals. |
Date: |
Mon, 02 Feb 2015 03:18:32 +0000 |
branch: master
commit dad2f1280c88b04d13145e7ad48f290e8ae32501
Author: Stephen Hicks <address@hidden>
Commit: Stephen Hicks <address@hidden>
Support method definitions in object literals.
This is specified in ยง14.3 of the current draft spec
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-method-definitions,
and discussed with examples at
http://ariya.ofilabs.com/2013/03/es6-and-method-definitions.html.
---
js2-mode.el | 24 +++++++++++++++++-------
tests/parser.el | 9 +++++++++
2 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/js2-mode.el b/js2-mode.el
index 15e132a..b52f947 100644
--- a/js2-mode.el
+++ b/js2-mode.el
@@ -3547,13 +3547,13 @@ The `right' field is a `js2-node' representing the
initializer value.")
(defstruct (js2-getter-setter-node
(:include js2-infix-node)
(:constructor nil)
- (:constructor make-js2-getter-setter-node (&key type ; GET or SET
+ (:constructor make-js2-getter-setter-node (&key type ; GET, SET,
or FUNCTION
(pos js2-ts-cursor)
len left right)))
"AST node for a getter/setter property in an object literal.
The `left' field is the `js2-name-node' naming the getter/setter prop.
The `right' field is always an anonymous `js2-function-node' with a node
-property `GETTER_SETTER' set to js2-GET or js2-SET. ")
+property `GETTER_SETTER' set to js2-GET, js2-SET, or js2-FUNCTION. ")
(put 'cl-struct-js2-getter-setter-node 'js2-visitor 'js2-visit-infix-node)
(put 'cl-struct-js2-getter-setter-node 'js2-printer 'js2-print-getter-setter)
@@ -3563,7 +3563,8 @@ property `GETTER_SETTER' set to js2-GET or js2-SET. ")
(left (js2-getter-setter-node-left n))
(right (js2-getter-setter-node-right n)))
(insert pad)
- (insert (if (= (js2-node-type n) js2-GET) "get " "set "))
+ (if (/= (js2-node-type n) js2-FUNCTION)
+ (insert (if (= (js2-node-type n) js2-GET) "get " "set ")))
(js2-print-ast left 0)
(js2-print-ast right 0)))
@@ -9537,7 +9538,8 @@ If ONLY-OF-P is non-nil, only the 'for (foo of bar)' form
is allowed."
(setq tt (js2-get-token))
(cond
;; {foo: ...}, {'foo': ...}, {foo, bar, ...},
- ;; {get foo() {...}}, or {set foo(x) {...}}
+ ;; {get foo() {...}}, {set foo(x) {...}}, or {foo(x) {...}}
+ ;; TODO(sdh): support *foo() {...}
((or (js2-valid-prop-name-token tt)
(= tt js2-STRING))
(setq after-comma nil
@@ -9591,7 +9593,12 @@ When `js2-is-in-destructuring' is t, forms like {a, b,
c} will be permitted."
(js2-set-face ppos pend 'font-lock-keyword-face 'record) ; get/set
(js2-record-face 'font-lock-function-name-face) ; for peeked name
(setq name (js2-create-name-node)) ; discard get/set & use peeked name
- (js2-parse-getter-setter-prop ppos name (string= prop "get")))
+ (js2-parse-getter-setter-prop ppos name prop))
+ ;; method definition: {f() {...}}
+ ((and (= (js2-peek-token) js2-LP)
+ (>= js2-language-version 200))
+ (js2-set-face ppos pend 'font-lock-keyword-face 'record) ; name
+ (js2-parse-getter-setter-prop ppos name ""))
;; Abbreviated destructuring binding, e.g. {a, b} = c;
;; XXX: To be honest, the value of `js2-is-in-destructuring' becomes t
only
;; when patterns are used in variable declarations, function parameters,
@@ -9656,7 +9663,7 @@ PROP is the node representing the property: a number,
name or string."
(js2-node-add-children result prop expr)
result))))
-(defun js2-parse-getter-setter-prop (pos prop get-p)
+(defun js2-parse-getter-setter-prop (pos prop type-string)
"Parse getter or setter property in an object literal.
JavaScript syntax is:
@@ -9669,7 +9676,10 @@ and expression closure style is also supported
POS is the start position of the `get' or `set' keyword.
PROP is the `js2-name-node' representing the property name.
GET-P is non-nil if the keyword was `get'."
- (let ((type (if get-p js2-GET js2-SET))
+ (let ((type (cond
+ ((string= "get" type-string) js2-GET)
+ ((string= "set" type-string) js2-SET)
+ (t js2-FUNCTION)))
result end
(fn (js2-parse-function-expr)))
;; it has to be an anonymous function, as we already parsed the name
diff --git a/tests/parser.el b/tests/parser.el
index 1c903be..3804ce8 100644
--- a/tests/parser.el
+++ b/tests/parser.el
@@ -184,6 +184,15 @@ the test."
(js2-deftest-parse abbreviated-object
"var x = {a: 1, b, c: 1, d};")
+(js2-deftest-parse object-literal-method
+ "var x = {f(y) { return y;\n}};")
+
+(js2-deftest-parse object-literal-getter-method
+ "var x = {get f() { return 42;\n}};")
+
+(js2-deftest-parse object-literal-setter-method
+ "var x = {set f(y) { x = y;\n}};")
+
;;; Function parameters
(js2-deftest-parse function-with-default-parameters
- [elpa] master updated (d47c872 -> a1ac1e0), Dmitry Gutov, 2015/02/01
- [elpa] master 6037c0f 04/45: Add support for 'u' and 'y' RegExp flags in ES6 mode., Dmitry Gutov, 2015/02/01
- [elpa] master dad2f12 03/45: Support method definitions in object literals.,
Dmitry Gutov <=
- [elpa] master 926cb45 05/45: Support ES6 computed property names., Dmitry Gutov, 2015/02/01
- [elpa] master 30249fa 07/45: Support parsing the ES6 'static' keyword., Dmitry Gutov, 2015/02/01
- [elpa] master c79d426 06/45: Support ES6 class statements/expressions., Dmitry Gutov, 2015/02/01
- [elpa] master 2b0f5ba 08/45: Support parsing the ES6 'super' keyword., Dmitry Gutov, 2015/02/01
- [elpa] master dd344ff 01/45: Support short-hand object literals {foo, bar} everywhere., Dmitry Gutov, 2015/02/01
- [elpa] master b1f7e6c 11/45: Simplify parsing of destructuring literals, Dmitry Gutov, 2015/02/01
- [elpa] master 68b4abd 02/45: Add ES6 class externs, Dmitry Gutov, 2015/02/01
- [elpa] master ee17084 13/45: js2-parse-plain-property: Disallow numbers as abbreviated props, Dmitry Gutov, 2015/02/01
- [elpa] master b19ea52 12/45: js2-parse-named-prop: Highlight externals in abbreviated props, Dmitry Gutov, 2015/02/01
- [elpa] master 31c49e0 14/45: js2-imenu-extension-styles: Turn into defvar, Dmitry Gutov, 2015/02/01