emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/js2-mode d3d8723802 1/3: Support async generators in me


From: ELPA Syncer
Subject: [elpa] externals/js2-mode d3d8723802 1/3: Support async generators in method notation
Date: Tue, 19 Dec 2023 15:58:20 -0500 (EST)

branch: externals/js2-mode
commit d3d8723802e91d26bbc644e6066fd815a02a7613
Author: Dmitry Gutov <dmitry@gutov.dev>
Commit: Dmitry Gutov <dmitry@gutov.dev>

    Support async generators in method notation
    
    Resolves #598
---
 NEWS.md         |  2 ++
 js2-mode.el     | 58 +++++++++++++++++++++++++++++----------------------------
 tests/parser.el |  8 +++++++-
 3 files changed, 39 insertions(+), 29 deletions(-)

diff --git a/NEWS.md b/NEWS.md
index 92cd99732f..d257a66088 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -2,6 +2,8 @@
 
 ## Next
 
+* Support for async generators in method notation
+  ([#598](https://github.com/mooz/js2-mode/issues/598)).
 * Support for static initialization blocks
   ([#594](https://github.com/mooz/js2-mode/issues/594)).
 
diff --git a/js2-mode.el b/js2-mode.el
index 637bb7687c..9a26023543 100644
--- a/js2-mode.el
+++ b/js2-mode.el
@@ -11095,7 +11095,8 @@ expression)."
         (continue t)
         tt elems elem
         elem-key-string previous-elem-key-string
-        after-comma previous-token)
+        after-comma
+        prev-pos star-p type-string)
     (while continue
       ;; Clear out any lookahead tokens (possibly wrong modifier).
       ;; FIXME: Deal with this problem in a more systematic fashion.
@@ -11108,38 +11109,49 @@ expression)."
       (setq tt (js2-get-prop-name-token)
             static nil
             elem nil
-            previous-token nil)
+            prev-pos nil
+            star-p nil
+            type-string nil)
       ;; Handle 'static' keyword only if we're in a class
       (when (and class-p (= js2-NAME tt)
                  (string= "static" (js2-current-token-string)))
         (js2-record-face 'font-lock-keyword-face)
         (setq static t
               tt (js2-get-prop-name-token)))
-      ;; Handle generator * before the property name for in-line functions
-      (when (and (>= js2-language-version 200)
-                 (= js2-MUL tt))
-        (setq previous-token (js2-current-token)
-              tt (js2-get-prop-name-token)))
       ;; Handle getter, setter and async methods
       (let ((prop (js2-current-token-string)))
         (when (and (>= js2-language-version 200)
                    (= js2-NAME tt)
                    (member prop '("get" "set" "async"))
                    (memq (js2-peek-token 'KEYWORD_IS_NAME)
-                         `(,js2-NAME ,js2-PRIVATE_NAME ,js2-STRING ,js2-NUMBER 
,js2-LB)))
-          (setq previous-token (js2-current-token)
+                         `( ,js2-NAME ,js2-PRIVATE_NAME ,js2-STRING ,js2-NUMBER
+                            ,js2-LB ,js2-MUL)))
+          (js2-set-face (js2-current-token-beg)
+                        (js2-current-token-end)
+                        'font-lock-keyword-face 'record)
+          (setq type-string prop
+                prev-pos (js2-current-token-beg)
                 tt (js2-get-prop-name-token))))
+      ;; Handle generator * before the property name for in-line functions
+      (when (and (>= js2-language-version 200)
+                 (= js2-MUL tt))
+        (js2-set-face (js2-current-token-beg)
+                      (js2-current-token-end)
+                      'font-lock-keyword-face 'record)
+        (setq star-p t
+              prev-pos (or prev-pos (js2-current-token-beg))
+              tt (js2-get-prop-name-token)))
       (cond
        ;; Rest/spread (...expr)
        ((and (>= js2-language-version 200)
-             (not class-p) (not static) (not previous-token)
+             (not class-p) (not static) (not type-string)
              (= js2-TRIPLEDOT tt))
         (setq after-comma nil
               elem (js2-make-unary nil js2-TRIPLEDOT 'js2-parse-assign-expr)))
        ;; Found a key/value property (of any sort)
        ((memq tt `(,js2-NAME ,js2-PRIVATE_NAME ,js2-STRING ,js2-NUMBER 
,js2-LB))
         (setq after-comma nil
-              elem (js2-parse-named-prop tt previous-token class-p))
+              elem (js2-parse-named-prop tt prev-pos type-string star-p 
class-p))
         (if (and (null elem)
                  (not js2-recover-from-parse-errors))
             (setq continue nil)))
@@ -11202,21 +11214,10 @@ expression)."
     (js2-must-match js2-RC "msg.no.brace.prop")
     (nreverse elems)))
 
-(defun js2-parse-named-prop (tt previous-token &optional class-p)
+(defun js2-parse-named-prop (tt pos type-string star-p &optional class-p)
   "Parse a name, string, or getter/setter object property.
 When `js2-is-in-destructuring' is t, forms like {a, b, c} will be permitted."
-  (let ((key (js2-parse-prop-name tt class-p))
-        (prop (and previous-token (js2-token-string previous-token)))
-        (property-type (when previous-token
-                             (if (= (js2-token-type previous-token) js2-MUL)
-                                 "*"
-                               (js2-token-string previous-token))))
-        pos)
-    (when (member prop '("get" "set" "async"))
-      (setq pos (js2-token-beg previous-token))
-      (js2-set-face (js2-token-beg previous-token)
-                    (js2-token-end previous-token)
-                    'font-lock-keyword-face 'record))  ; get/set/async
+  (let ((key (js2-parse-prop-name tt class-p)))
     (cond
      ;; method definition: {f() {...}}
      ((and (= (js2-peek-token) js2-LP)
@@ -11224,7 +11225,7 @@ When `js2-is-in-destructuring' is t, forms like {a, b, 
c} will be permitted."
       (when (or (js2-name-node-p key) (js2-string-node-p key))
         ;; highlight function name properties
         (js2-record-face 'font-lock-function-name-face))
-      (js2-parse-method-prop pos key property-type))
+      (js2-parse-method-prop pos key type-string star-p))
      ;; class field or binding element with initializer
      ((and (= (js2-peek-token) js2-ASSIGN)
            (>= js2-language-version 200))
@@ -11326,7 +11327,7 @@ string or expression."
       (js2-node-add-children result prop expr)
       result))))
 
-(defun js2-parse-method-prop (pos prop type-string)
+(defun js2-parse-method-prop (pos prop type-string star-p)
   "Parse method property in an object literal or a class body.
 JavaScript syntax is:
 
@@ -11339,7 +11340,8 @@ and expression closure style is also supported
 
 POS is the start position of the `get' or `set' keyword, if any.
 PROP is the `js2-name-node' representing the property name.
-TYPE-STRING is a string `get', `set', `*', or nil, indicating a found keyword."
+TYPE-STRING is a string `get', `set', `async', or nil.
+START-P is non-nil when name is preceded by the star character."
   (let* ((type (or (cdr (assoc type-string '(("get" . GET)
                                              ("set" . SET)
                                              ("async" . ASYNC))))
@@ -11348,7 +11350,7 @@ TYPE-STRING is a string `get', `set', `*', or nil, 
indicating a found keyword."
          (pos (or pos (js2-current-token-beg)))
          (_ (js2-must-match js2-LP "msg.no.paren.parms"))
          (fn (js2-parse-function 'FUNCTION_EXPRESSION pos
-                                 (string= type-string "*")
+                                 star-p
                                  (eq type 'ASYNC)
                                  nil)))
     (js2-node-set-prop fn 'METHOD_TYPE type)  ; for codegen
diff --git a/tests/parser.el b/tests/parser.el
index f6e6abcda0..18f953562f 100644
--- a/tests/parser.el
+++ b/tests/parser.el
@@ -1,6 +1,6 @@
 ;;; tests/parser.el --- Some tests for js2-mode.  -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2009, 2011-2017  Free Software Foundation, Inc.
+;; Copyright (C) 2009, 2011-2023  Free Software Foundation, Inc.
 
 ;; This file is part of GNU Emacs.
 
@@ -304,6 +304,9 @@ the test."
 (js2-deftest-parse object-literal-computed-generator-key
   "var x = {*[foo + bar]() {  yield 42;\n}};")
 
+(js2-deftest-parse object-literal-async-generator
+  "var x = {async *foo() {  yield 42;\n}};")
+
 ;;; Function definition
 
 (js2-deftest function-redeclaring-var "var gen = 3; function gen() {};"
@@ -562,6 +565,9 @@ the test."
 (js2-deftest-parse async-method-allow-await
   "({async f() {  await x;\n}});")
 
+(js2-deftest-parse async-method-generator
+  "class C {\n  async *foo() {}\n}")
+
 ;;; Await
 
 (js2-deftest-parse await-is-ok "async function foo() {\n  await bar();\n}")



reply via email to

[Prev in Thread] Current Thread [Next in Thread]