]> code.delx.au - gnu-emacs-elpa/commitdiff
Fix async parsing
authorJackson Hamilton <jackson@jacksonrayhamilton.com>
Sat, 2 Jan 2016 23:18:04 +0000 (15:18 -0800)
committerJackson Hamilton <jackson@jacksonrayhamilton.com>
Sun, 3 Jan 2016 03:21:40 +0000 (19:21 -0800)
js2-mode.el
tests/parser.el

index 85c3ee9659965dd1ae28166cf8c94893ad230339..b20edd1a2d2590a578c2c26c8e9e3e63d494bdc7 100644 (file)
@@ -7749,12 +7749,20 @@ string is NAME.  Returns nil and keeps current token otherwise."
     (js2-get-token)
     t))
 
-(defun js2-match-async-arrow-function ()
-  (when (and (js2-contextual-kwd-p (js2-current-token) "async")
-             (/= (js2-peek-token) js2-FUNCTION))
-    (js2-record-face 'font-lock-keyword-face)
-    (js2-get-token)
-    t))
+;; Matching "async" is performed in two parts, because in the functions' one use
+;; case, it isn't known whether an arrow function is actually being parsed (and
+;; thus whether `js2-get-token' should be called) until later.  If
+;; `js2-get-token' were called eccentrically, `js2-current-token' would be
+;; off-by-one, causing `js2-parse-unary-expr' to potentially fail when "async"
+;; is unused in a non-keyword context.
+
+(defun js2-match-async-arrow-function-1 ()
+  (and (js2-contextual-kwd-p (js2-current-token) "async")
+       (/= (js2-peek-token) js2-FUNCTION)))
+
+(defun js2-match-async-arrow-function-2 ()
+  (js2-record-face 'font-lock-keyword-face)
+  (js2-get-token))
 
 (defun js2-match-await (tt)
   (when (and (= tt js2-NAME)
@@ -9676,7 +9684,7 @@ If NODE is non-nil, it is the AST node associated with the symbol."
       ;; `js2-parse-function-stmt' nor `js2-parse-function-expr' that
       ;; interpret `async` token, we trash `async` and just remember
       ;; we met `async` keyword to `async-p'.
-      (when (js2-match-async-arrow-function)
+      (when (js2-match-async-arrow-function-1)
         (setq async-p t))
       ;; Save the tokenizer state in case we find an arrow function
       ;; and have to rewind.
@@ -9711,6 +9719,8 @@ If NODE is non-nil, it is the AST node associated with the symbol."
        ((and (= tt js2-ARROW)
              (>= js2-language-version 200))
         (js2-ts-seek ts-state)
+        (when async-p
+          (js2-match-async-arrow-function-2))
         (setq js2-recorded-identifiers recorded-identifiers
               js2-parsed-errors parsed-errors)
         (setq pn (js2-parse-function 'FUNCTION_ARROW (js2-current-token-beg) nil async-p)))
index 520ff45d19fc6d567fb9166d56daf5c7ba1d4cb6..b3c362053d92e55927d3e76e1e0bc1603d4cc769 100644 (file)
@@ -487,6 +487,12 @@ the test."
 
 ;;; 'async' and 'await' are contextual keywords
 
+(js2-deftest-parse async-can-be-name
+  "void async;")
+
+(js2-deftest-parse async-can-be-object-name
+  "async.z;")
+
 (js2-deftest-parse async-can-be-var-name
   "var async = 3;")