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

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

[elpa] externals/js2-mode fc82b04 1/2: Support private class members


From: ELPA Syncer
Subject: [elpa] externals/js2-mode fc82b04 1/2: Support private class members
Date: Sat, 10 Jul 2021 18:57:14 -0400 (EDT)

branch: externals/js2-mode
commit fc82b042fd12d8bb4d66750d4f392d40431d8a87
Author: Dmitry Gutov <dgutov@yandex.ru>
Commit: Dmitry Gutov <dgutov@yandex.ru>

    Support private class members
    
    Resolves #537
---
 NEWS.md         |  2 ++
 js2-mode.el     | 33 +++++++++++++++++++++++----------
 tests/parser.el | 12 ++++++++++++
 3 files changed, 37 insertions(+), 10 deletions(-)

diff --git a/NEWS.md b/NEWS.md
index 932d99d..224a034 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -2,6 +2,8 @@
 
 ## Next
 
+* Support for private class memebers
+  ([#537](https://github.com/mooz/js2-mode/issues/537)).
 * Support for dynamic imports and `import.meta`
   ([#547](https://github.com/mooz/js2-mode/issues/547)).
 * Support for trailing comma in arrow function parameters
diff --git a/js2-mode.el b/js2-mode.el
index a3630b6..35b741c 100644
--- a/js2-mode.el
+++ b/js2-mode.el
@@ -657,7 +657,9 @@ which doesn't seem particularly useful, but Rhino permits 
it."
 (defvar js2-EXPON 175)
 (defvar js2-NULLISH-COALESCING 176) ; nullish coalescing (obj.value ?? 
obj.defaultValue ?? 0))
 
-(defconst js2-num-tokens (1+ js2-NULLISH-COALESCING))
+(defvar js2-PRIVATE_NAME 177)      ; this.#bar();
+
+(defconst js2-num-tokens (1+ js2-PRIVATE_NAME))
 
 (defconst js2-debug-print-trees nil)
 
@@ -5898,6 +5900,7 @@ the token is flagged as such."
 During operation, creates an instance of `js2-token' struct, sets
 its relevant fields and puts it into `js2-ti-tokens'."
   (let (identifier-start
+        identifier-private
         is-unicode-escape-start c
         contains-escape escape-val str result base
         look-for-slash continue tt legacy-octal
@@ -5943,7 +5946,10 @@ its relevant fields and puts it into `js2-ti-tokens'."
              (js2-unget-char)
              (setq c ?\\)))
           (t
-           (when (setq identifier-start (js2-identifier-start-p c))
+           (when (setq identifier-start (or (js2-identifier-start-p c)
+                                            (and
+                                             (eq c ?#)
+                                             (setq identifier-private t))))
              (setq js2-ts-string-buffer nil)
              (js2-add-to-string c))))
          (when identifier-start
@@ -6003,7 +6009,11 @@ its relevant fields and puts it into `js2-ti-tokens'."
                (throw 'return (js2-tt-code result))))
            ;; If we want to intern these as Rhino does, just use (intern str)
            (setf (js2-token-string token) str)
-           (throw 'return js2-NAME))    ; end identifier/kwd check
+           (throw 'return
+                  (if identifier-private
+                      js2-PRIVATE_NAME
+                    js2-NAME)
+                  ))    ; end identifier/kwd check
          ;; is it a number?
          (when (or (js2-digit-p c)
                    (and (eq c ?.) (js2-digit-p (js2-peek-char))))
@@ -8021,7 +8031,7 @@ string is NAME.  Returns nil and keeps current token 
otherwise."
   "Consume token and return t if next token is a valid property name.
 If `js2-language-version' is >= 180, a keyword or reserved word
 is considered valid name as well."
-  (if (eq js2-NAME (js2-get-prop-name-token))
+  (if (memq (js2-get-prop-name-token) `(,js2-NAME ,js2-PRIVATE_NAME))
       t
     (js2-unget-token)
     nil))
@@ -10514,7 +10524,7 @@ Last token parsed must be `js2-RB'."
             tt (js2-get-prop-name-token))
       (cond
        ;; handles: name, ns::name, ns::*, ns::[expr]
-       ((= tt js2-NAME)
+       ((or (= tt js2-NAME) (= tt js2-PRIVATE_NAME))
         (setq ref (js2-parse-property-name -1 nil member-type-flags)))
        ;; handles: *, *::name, *::*, *::[expr]
        ((= tt js2-MUL)
@@ -11062,7 +11072,7 @@ expression)."
                    (= js2-NAME tt)
                    (member prop '("get" "set" "async"))
                    (member (js2-peek-token 'KEYWORD_IS_NAME)
-                           (list js2-NAME js2-STRING js2-NUMBER js2-LB)))
+                           (list js2-NAME js2-PRIVATE_NAME js2-STRING 
js2-NUMBER js2-LB)))
           (setq previous-token (js2-current-token)
                 tt (js2-get-prop-name-token))))
       (cond
@@ -11073,7 +11083,7 @@ expression)."
         (setq after-comma nil
               elem (js2-make-unary nil js2-TRIPLEDOT 'js2-parse-assign-expr)))
        ;; Found a key/value property (of any sort)
-       ((member tt (list js2-NAME js2-STRING js2-NUMBER js2-LB))
+       ((member tt (list 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))
         (if (and (null elem)
@@ -11137,7 +11147,7 @@ expression)."
 (defun js2-parse-named-prop (tt previous-token &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))
+  (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)
@@ -11189,7 +11199,7 @@ When `js2-is-in-destructuring' is t, forms like {a, b, 
c} will be permitted."
   (when (js2-match-token js2-ASSIGN)
     (js2-make-binary js2-ASSIGN name 'js2-parse-assign-expr t)))
 
-(defun js2-parse-prop-name (tt)
+(defun js2-parse-prop-name (tt allow-private)
   (cond
    ;; Literal string keys: {'foo': 'bar'}
    ((= tt js2-STRING)
@@ -11207,6 +11217,9 @@ When `js2-is-in-destructuring' is t, forms like {a, b, 
c} will be permitted."
    ;; Unquoted names: {foo: 12}
    ((= tt js2-NAME)
     (js2-create-name-node))
+   ((and allow-private
+         (= tt js2-PRIVATE_NAME))
+    (js2-create-name-node))
    ;; Anything else is an error
    (t (js2-report-error "msg.bad.prop"))))
 
@@ -11296,7 +11309,7 @@ And, if CHECK-ACTIVATION-P is non-nil, use the value of 
TOKEN."
   (let* ((beg (js2-current-token-beg))
          (tt (js2-current-token-type))
          (s (or string
-                (if (= js2-NAME tt)
+                (if (or (= js2-NAME tt) (= js2-PRIVATE_NAME tt))
                     (js2-current-token-string)
                   (js2-tt-name tt))))
          name)
diff --git a/tests/parser.el b/tests/parser.el
index 95d3f5d..e1b821f 100644
--- a/tests/parser.el
+++ b/tests/parser.el
@@ -1009,6 +1009,18 @@ the test."
 (js2-deftest-parse parse-class-static-fields-no-semi
   "class C {\n  static a\n  static b = 42\n}")
 
+;;; Private names
+
+(js2-deftest-parse parse-class-private-field-with-init
+  "class C {\n  #x = 42;\n  static #y = 24;\n}"
+  :reference "class C {\n  #x = 42\n  static #y = 24\n}")
+
+(js2-deftest-parse parse-class-private-method
+  "class C {\n  #foo(y) {  this.#x = 5;\n  y.#x = 6;\n}\n}")
+
+(js2-deftest-parse parse-class-private-getter
+  "class C {\n  get #foo(y) {  this.#x;\n}\n}")
+
 ;;; Operators
 
 (js2-deftest-parse exponentiation



reply via email to

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