From fae57760064e25fd1b307a8f6b117c41eae45320 Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Mon, 2 Feb 2015 04:25:15 +0200 Subject: [PATCH] Check that the let declaration comes before the reference 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 | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/js2-mode.el b/js2-mode.el index 81339037c..bef5e617f 100644 --- a/js2-mode.el +++ b/js2-mode.el @@ -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))) -- 2.39.2