]> code.delx.au - gnu-emacs-elpa/commitdiff
Check that the let declaration comes before the reference
authorDmitry Gutov <dgutov@yandex.ru>
Mon, 2 Feb 2015 02:25:15 +0000 (04:25 +0200)
committerDmitry Gutov <dgutov@yandex.ru>
Mon, 2 Feb 2015 02:25:15 +0000 (04:25 +0200)
Implementing, more or less, the ES6 "temporal dead zone" for let.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let
https://bugzilla.mozilla.org/show_bug.cgi?id=1001090

js2-mode.el

index 81339037c707e6a130d63c1084820fc20507bcc8..bef5e617f757794d3182fe95956df6a975c9b3dd 100644 (file)
@@ -2313,19 +2313,25 @@ Returns nil if there is no enclosing scope node."
       (setq parent (js2-node-parent parent)))
     parent))
 
-(defun js2-get-defining-scope (scope name)
+(defun js2-get-defining-scope (scope name &optional point)
   "Search up scope chain from SCOPE looking for NAME, a string or symbol.
-Returns `js2-scope' in which NAME is defined, or nil if not found."
+Returns `js2-scope' in which NAME is defined, or nil if not found.
+
+If POINT is non-nil, and if the found declaration type is
+`js2-LET', also check that the declaration node is before POINT."
   (let ((sym (if (symbolp name)
                  name
                (intern name)))
-        table
         result
         (continue t))
     (while (and scope continue)
       (if (or
-           (and (setq table (js2-scope-symbol-table scope))
-                (assq sym table))
+           (let ((entry (cdr (assq sym (js2-scope-symbol-table scope)))))
+             (and entry
+                  (or (not point)
+                      (not (eq js2-LET (js2-symbol-decl-type entry)))
+                      (>= point
+                          (js2-node-abs-pos (js2-symbol-ast-node entry))))))
            (and (eq sym 'arguments)
                 (js2-function-node-p scope)))
           (setq continue nil
@@ -7034,7 +7040,7 @@ it is considered declared."
         (unless (or (member name js2-global-externs)
                     (member name js2-default-externs)
                     (member name js2-additional-externs)
-                    (js2-get-defining-scope scope name))
+                    (js2-get-defining-scope scope name pos))
           (js2-report-warning "msg.undeclared.variable" name pos (- end pos)
                               'js2-external-variable))))
     (setq js2-recorded-identifiers nil)))