annotate .elisp/js2.el @ 207:c965d5dbd868

emacs localfuncs: add list rotation and string-joining functions I sometimes use
author Augie Fackler <durin42@gmail.com>
date Tue, 11 May 2010 15:32:19 -0500
parents 614a83a1c5dd
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1 ;;; js2.el -- an improved JavaScript editing mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2 ;;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3 ;;; This file was auto-generated on Mon Jun 16 01:46:45 2008 from files:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4 ;;; js2-vars.el
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5 ;;; js2-util.el
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6 ;;; js2-scan.el
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7 ;;; js2-messages.el
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8 ;;; js2-ast.el
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9 ;;; js2-highlight.el
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10 ;;; js2-browse.el
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11 ;;; js2-parse.el
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
12 ;;; js2-indent.el
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
13 ;;; js2-mode.el
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
14
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
15 ;;; js2-mode.el --- an improved JavaScript editing mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
16
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
17 ;; Author: Steve Yegge (steve.yegge@gmail.com)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
18 ;; Version: 20080616
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
19 ;; Keywords: javascript languages
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
20
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
21 ;; This program is free software; you can redistribute it and/or
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
22 ;; modify it under the terms of the GNU General Public License as
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
23 ;; published by the Free Software Foundation; either version 2 of
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
24 ;; the License, or (at your option) any later version.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
25
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
26 ;; This program is distributed in the hope that it will be
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
27 ;; useful, but WITHOUT ANY WARRANTY; without even the implied
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
28 ;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
29 ;; PURPOSE. See the GNU General Public License for more details.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
30
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
31 ;; You should have received a copy of the GNU General Public
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
32 ;; License along with this program; if not, write to the Free
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
33 ;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
34 ;; MA 02111-1307 USA
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
35
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
36 ;;; Commentary:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
37
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
38 ;; This JavaScript editing mode supports:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
39 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
40 ;; - the full JavaScript language through version 1.7
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
41 ;; - support for most Rhino and SpiderMonkey extensions from 1.5 to 1.7
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
42 ;; - accurate syntax highlighting using a recursive-descent parser
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
43 ;; - syntax-error and strict-mode warning reporting
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
44 ;; - "bouncing" line indentation to choose among alternate indentation points
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
45 ;; - smart line-wrapping within comments (Emacs 22+) and strings
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
46 ;; - code folding:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
47 ;; - show some or all function bodies as {...}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
48 ;; - show some or all block comments as /*...*/
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
49 ;; - context-sensitive menu bar and popup menus
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
50 ;; - code browsing using the `imenu' package
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
51 ;; - typing helpers (e.g. inserting matching braces/parens)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
52 ;; - many customization options
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
53 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
54 ;; It is only compatible with GNU Emacs versions 21 and higher (not XEmacs).
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
55 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
56 ;; Installation:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
57 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
58 ;; - put `js2.el' somewhere in your emacs load path
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
59 ;; - M-x byte-compile-file RET <path-to-js2.el> RET
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
60 ;; Note: it will refuse to run unless byte-compiled
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
61 ;; - add these lines to your .emacs file:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
62 ;; (autoload 'js2-mode "js2" nil t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
63 ;; (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
64 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
65 ;; To customize how it works:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
66 ;; M-x customize-group RET js2-mode RET
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
67 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
68 ;; The variable `js2-mode-version' is a date stamp. When you upgrade
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
69 ;; to a newer version, you must byte-compile the file again.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
70 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
71 ;; Notes:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
72 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
73 ;; This mode is different in many ways from standard Emacs language editing
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
74 ;; modes, inasmuch as it attempts to be more like an IDE. If this drives
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
75 ;; you crazy, it IS possible to customize it to be more like other Emacs
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
76 ;; editing modes. Please customize the group `js2-mode' to see all of the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
77 ;; configuration options.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
78 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
79 ;; Some of the functionality does not work in Emacs 21 -- upgrading to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
80 ;; Emacs 22 or higher will get you better results. If you byte-compiled
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
81 ;; js2.el with Emacs 21, you should re-compile it for Emacs 22.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
82 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
83 ;; Unlike cc-engine based language modes, js2-mode's line-indentation is not
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
84 ;; customizable. It is a surprising amount of work to support customizable
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
85 ;; indentation. The current compromise is that the tab key lets you cycle among
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
86 ;; various likely indentation points, similar to the behavior of python-mode.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
87 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
88 ;; This mode does not yet work with "multi-mode" modes such as mmm-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
89 ;; and mumamo, although it could possibly be made to do so with some effort.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
90 ;; This means that js2-mode is currently only useful for editing JavaScript
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
91 ;; files, and not for editing JavaScript within <script> tags or templates.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
92 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
93 ;; This code is part of a larger project, in progress, to enable writing
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
94 ;; Emacs customizations in JavaScript.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
95 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
96 ;; Please email bug reports and suggestions to the author, or submit them
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
97 ;; at http://code.google.com/p/js2-mode/issues
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
98
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
99 ;; TODO:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
100 ;; - add unreachable-code warning (error?) using the inconsistent-return analysis
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
101 ;; - labeled stmt length is now 1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
102 ;; - "anonymous function does not always return a value" - use getter/setter name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
103 ;; - extend js2-missing-semi-one-line-override to handle catch (e) {return x}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
104 ;; - set a text prop on autoinserted delimiters and don't biff user-entered ones
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
105 ;; - when inserting magic curlies, look for matching close-curly before inserting
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
106 ;; - get more use out of the symbol table:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
107 ;; - jump to declaration (put hyperlinks on all non-decl var usages?)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
108 ;; - rename variable/function
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
109 ;; - warn on unused var
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
110 ;; - add some dabbrev-expansions for built-in keywords like finally, function
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
111 ;; - add at least some completion support, e.g. for built-ins
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
112 ;; - code formatting
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
113
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
114 ;;; Code:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
115 ;;; js2-vars.el -- byte-compiler support for js2-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
116
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
117 ;; Author: Steve Yegge (steve.yegge@gmail.com)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
118 ;; Keywords: javascript languages
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
119
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
120 ;;; Code:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
121
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
122 (eval-when-compile
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
123 (require 'cl))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
124
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
125 (eval-and-compile
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
126 (require 'cc-mode) ; (only) for `c-populate-syntax-table'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
127 (require 'cc-langs) ; it's here in Emacs 21...
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
128 (require 'cc-engine)) ; for `c-paragraph-start' et. al.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
129
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
130 (defvar js2-emacs22 (>= emacs-major-version 22))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
131
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
132 (defcustom js2-highlight-level 2
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
133 "Amount of syntax highlighting to perform.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
134 nil, zero or negative means none.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
135 1 adds basic syntax highlighting.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
136 2 adds highlighting of some Ecma built-in properties.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
137 3 adds highlighting of many Ecma built-in functions."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
138 :type 'integer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
139 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
140
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
141 (defvar js2-mode-dev-mode-p nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
142 "Non-nil if running in development mode. Normally nil.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
143
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
144 (defgroup js2-mode nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
145 "An improved JavaScript mode."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
146 :group 'languages)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
147
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
148 (defcustom js2-basic-offset (if (and (boundp 'c-basic-offset)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
149 (numberp c-basic-offset))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
150 c-basic-offset
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
151 2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
152 "Number of spaces to indent nested statements.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
153 Similar to `c-basic-offset'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
154 :group 'js2-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
155 :type 'integer)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
156 (make-variable-buffer-local 'js2-basic-offset)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
157
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
158 (defcustom js2-cleanup-whitespace t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
159 "Non-nil to invoke `delete-trailing-whitespace' before saves."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
160 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
161 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
162
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
163 (defcustom js2-move-point-on-right-click t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
164 "Non-nil to move insertion point when you right-click.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
165 This makes right-click context menu behavior a bit more intuitive,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
166 since menu operations generally apply to the point. The exception
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
167 is if there is a region selection, in which case the point does -not-
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
168 move, so cut/copy/paste etc. can work properly.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
169
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
170 Note that IntelliJ moves the point, and Eclipse leaves it alone,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
171 so this behavior is customizable."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
172 :group 'js2-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
173 :type 'boolean)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
174
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
175 (defcustom js2-mirror-mode t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
176 "Non-nil to insert closing brackets, parens, etc. automatically."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
177 :group 'js2-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
178 :type 'boolean)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
179
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
180 (defcustom js2-auto-indent-flag t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
181 "Automatic indentation with punctuation characters. If non-nil, the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
182 current line is indented when certain punctuations are inserted."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
183 :group 'js2-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
184 :type 'boolean)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
185
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
186 (defcustom js2-bounce-indent-flag t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
187 "Non-nil to have indent-line function choose among alternatives.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
188 If nil, the indent-line function will indent to a predetermined column
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
189 based on heuristic guessing. If non-nil, then if the current line is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
190 already indented to that predetermined column, indenting will choose
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
191 another likely column and indent to that spot. Repeated invocation of
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
192 the indent-line function will cycle among the computed alternatives.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
193 See the function `js2-bounce-indent' for details."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
194 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
195 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
196
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
197 (defcustom js2-indent-on-enter-key nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
198 "Non-nil to have Enter/Return key indent the line.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
199 This is unusual for Emacs modes but common in IDEs like Eclipse."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
200 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
201 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
202
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
203 (defcustom js2-enter-indents-newline t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
204 "Non-nil to have Enter/Return key indent the newly-inserted line.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
205 This is unusual for Emacs modes but common in IDEs like Eclipse."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
206 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
207 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
208
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
209 (defcustom js2-rebind-eol-bol-keys t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
210 "Non-nil to rebind beginning-of-line and end-of-line keys.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
211 If non-nil, bounce between bol/eol and first/last non-whitespace char."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
212 :group 'js2-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
213 :type 'boolean)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
214
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
215 (defcustom js2-electric-keys '("{" "}" "(" ")" "[" "]" ":" ";" "," "*")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
216 "Keys that auto-indent when `js2-auto-indent-flag' is non-nil.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
217 Each value in the list is passed to `define-key'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
218 :type 'list
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
219 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
220
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
221 (defcustom js2-idle-timer-delay 0.2
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
222 "Delay in secs before re-parsing after user makes changes.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
223 Multiplied by `js2-dynamic-idle-timer-adjust', which see."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
224 :type 'number
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
225 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
226 (make-variable-buffer-local 'js2-idle-timer-delay)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
227
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
228 (defcustom js2-dynamic-idle-timer-adjust 0
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
229 "Positive to adjust `js2-idle-timer-delay' based on file size.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
230 The idea is that for short files, parsing is faster so we can be
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
231 more responsive to user edits without interfering with editing.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
232 The buffer length in characters (typically bytes) is divided by
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
233 this value and used to multiply `js2-idle-timer-delay' for the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
234 buffer. For example, a 21k file and 10k adjust yields 21k/10k
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
235 == 2, so js2-idle-timer-delay is multiplied by 2.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
236 If `js2-dynamic-idle-timer-adjust' is 0 or negative,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
237 `js2-idle-timer-delay' is not dependent on the file size."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
238 :type 'number
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
239 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
240
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
241 (defcustom js2-mode-escape-quotes t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
242 "Non-nil to disable automatic quote-escaping inside strings."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
243 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
244 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
245
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
246 (defcustom js2-mode-squeeze-spaces t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
247 "Non-nil to normalize whitespace when filling in comments.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
248 Multiple runs of spaces are converted to a single space."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
249 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
250 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
251
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
252 (defcustom js2-mode-show-parse-errors t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
253 "True to highlight parse errors."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
254 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
255 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
256
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
257 (defcustom js2-mode-show-strict-warnings t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
258 "Non-nil to emit Ecma strict-mode warnings.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
259 Some of the warnings can be individually disabled by other flags,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
260 even if this flag is non-nil."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
261 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
262 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
263
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
264 (defcustom js2-strict-trailing-comma-warning t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
265 "Non-nil to warn about trailing commas in array literals.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
266 Ecma-262 forbids them, but many browsers permit them. IE is the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
267 big exception, and can produce bugs if you have trailing commas."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
268 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
269 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
270
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
271 (defcustom js2-strict-missing-semi-warning t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
272 "Non-nil to warn about semicolon auto-insertion after statement.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
273 Technically this is legal per Ecma-262, but some style guides disallow
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
274 depending on it."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
275 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
276 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
277
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
278 (defcustom js2-missing-semi-one-line-override nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
279 "Non-nil to permit missing semicolons in one-line functions.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
280 In one-liner functions such as `function identity(x) {return x}'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
281 people often omit the semicolon for a cleaner look. If you are
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
282 such a person, you can suppress the missing-semicolon warning
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
283 by setting this variable to t."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
284 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
285 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
286
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
287 (defcustom js2-strict-inconsistent-return-warning t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
288 "Non-nil to warn about mixing returns with value-returns.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
289 It's perfectly legal to have a `return' and a `return foo' in the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
290 same function, but it's often an indicator of a bug, and it also
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
291 interferes with type inference (in systems that support it.)"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
292 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
293 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
294
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
295 (defcustom js2-strict-cond-assign-warning t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
296 "Non-nil to warn about expressions like if (a = b).
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
297 This often should have been '==' instead of '='. If the warning
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
298 is enabled, you can suppress it on a per-expression basis by
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
299 parenthesizing the expression, e.g. if ((a = b)) ..."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
300 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
301 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
302
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
303 (defcustom js2-strict-cond-assign-warning t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
304 "Non-nil to warn about expressions like if (a = b).
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
305 This often should have been '==' instead of '='. If the warning
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
306 is enabled, you can suppress it on a per-expression basis by
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
307 parenthesizing the expression, e.g. if ((a = b)) ..."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
308 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
309 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
310
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
311 (defcustom js2-strict-var-redeclaration-warning t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
312 "Non-nil to warn about redeclaring variables in a script or function."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
313 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
314 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
315
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
316 (defcustom js2-strict-var-hides-function-arg-warning t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
317 "Non-nil to warn about a var decl hiding a function argument."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
318 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
319 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
320
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
321 (defcustom js2-skip-preprocessor-directives nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
322 "Non-nil to treat lines beginning with # as comments.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
323 Useful for viewing Mozilla JavaScript source code."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
324 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
325 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
326
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
327 (defcustom js2-basic-offset c-basic-offset
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
328 "Functions like `c-basic-offset' in js2-mode buffers."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
329 :type 'integer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
330 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
331 (make-variable-buffer-local 'js2-basic-offset)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
332
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
333 (defcustom js2-language-version 170
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
334 "Configures what JavaScript language version to recognize.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
335 Currently only 150, 160 and 170 are supported, corresponding
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
336 to JavaScript 1.5, 1.6 and 1.7, respectively. In a nutshell,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
337 1.6 adds E4X support, and 1.7 adds let, yield, and Array
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
338 comprehensions."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
339 :type 'integer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
340 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
341
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
342 (defcustom js2-allow-keywords-as-property-names t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
343 "If non-nil, you can use JavaScript keywords as object property names.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
344 Examples:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
345
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
346 var foo = {int: 5, while: 6, continue: 7};
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
347 foo.return = 8;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
348
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
349 Ecma-262 forbids this syntax, but many browsers support it."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
350 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
351 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
352
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
353 (defcustom js2-instanceof-has-side-effects nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
354 "If non-nil, treats the instanceof operator as having side effects.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
355 This is useful for xulrunner apps."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
356 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
357 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
358
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
359 (defcustom js2-allow-rhino-new-expr-initializer nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
360 "Non-nil to support a Rhino's experimental syntactic construct.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
361
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
362 Rhino supports the ability to follow a `new' expression with an object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
363 literal, which is used to set additional properties on the new object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
364 after calling its constructor. Syntax:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
365
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
366 new <expr> [ ( arglist ) ] [initializer]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
367
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
368 Hence, this expression:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
369
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
370 new Object {a: 1, b: 2}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
371
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
372 results in an Object with properties a=1 and b=2. This syntax is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
373 apparently not configurable in Rhino - it's currently always enabled,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
374 as of Rhino version 1.7R2."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
375 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
376 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
377
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
378 (defcustom js2-allow-member-expr-as-function-name nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
379 "Non-nil to support experimental Rhino syntax for function names.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
380
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
381 Rhino supports an experimental syntax configured via the Rhino Context
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
382 setting `allowMemberExprAsFunctionName'. The experimental syntax is:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
383
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
384 function <member-expr> ( [ arg-list ] ) { <body> }
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
385
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
386 Where member-expr is a non-parenthesized 'member expression', which
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
387 is anything at the grammar level of a new-expression or lower, meaning
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
388 any expression that does not involve infix or unary operators.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
389
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
390 When <member-expr> is not a simple identifier, then it is syntactic
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
391 sugar for assigning the anonymous function to the <member-expr>. Hence,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
392 this code:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
393
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
394 function a.b().c[2] (x, y) { ... }
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
395
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
396 is rewritten as:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
397
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
398 a.b().c[2] = function(x, y) {...}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
399
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
400 which doesn't seem particularly useful, but Rhino permits it."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
401 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
402 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
403
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
404 (defvar js2-mode-version 20080616
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
405 "Release number for `js2-mode'.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
406
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
407 ;; scanner variables
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
408
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
409 ;; We record the start and end position of each token.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
410 (defvar js2-token-beg 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
411 (make-variable-buffer-local 'js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
412 (defvar js2-token-end -1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
413 (make-variable-buffer-local 'js2-token-end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
414
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
415 (defvar js2-EOF_CHAR -1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
416 "Represents end of stream. Distinct from js2-EOF token type.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
417
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
418 ;; I originally used symbols to represent tokens, but Rhino uses
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
419 ;; ints and then sets various flag bits in them, so ints it is.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
420 ;; The upshot is that we need a `js2-' prefix in front of each name.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
421 (defvar js2-ERROR -1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
422 (defvar js2-EOF 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
423 (defvar js2-EOL 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
424 (defvar js2-ENTERWITH 2) ; begin interpreter bytecodes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
425 (defvar js2-LEAVEWITH 3)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
426 (defvar js2-RETURN 4)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
427 (defvar js2-GOTO 5)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
428 (defvar js2-IFEQ 6)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
429 (defvar js2-IFNE 7)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
430 (defvar js2-SETNAME 8)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
431 (defvar js2-BITOR 9)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
432 (defvar js2-BITXOR 10)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
433 (defvar js2-BITAND 11)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
434 (defvar js2-EQ 12)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
435 (defvar js2-NE 13)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
436 (defvar js2-LT 14)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
437 (defvar js2-LE 15)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
438 (defvar js2-GT 16)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
439 (defvar js2-GE 17)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
440 (defvar js2-LSH 18)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
441 (defvar js2-RSH 19)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
442 (defvar js2-URSH 20)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
443 (defvar js2-ADD 21) ; infix plus
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
444 (defvar js2-SUB 22) ; infix minus
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
445 (defvar js2-MUL 23)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
446 (defvar js2-DIV 24)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
447 (defvar js2-MOD 25)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
448 (defvar js2-NOT 26)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
449 (defvar js2-BITNOT 27)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
450 (defvar js2-POS 28) ; unary plus
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
451 (defvar js2-NEG 29) ; unary minus
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
452 (defvar js2-NEW 30)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
453 (defvar js2-DELPROP 31)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
454 (defvar js2-TYPEOF 32)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
455 (defvar js2-GETPROP 33)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
456 (defvar js2-GETPROPNOWARN 34)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
457 (defvar js2-SETPROP 35)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
458 (defvar js2-GETELEM 36)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
459 (defvar js2-SETELEM 37)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
460 (defvar js2-CALL 38)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
461 (defvar js2-NAME 39) ; an identifier
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
462 (defvar js2-NUMBER 40)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
463 (defvar js2-STRING 41)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
464 (defvar js2-NULL 42)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
465 (defvar js2-THIS 43)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
466 (defvar js2-FALSE 44)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
467 (defvar js2-TRUE 45)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
468 (defvar js2-SHEQ 46) ; shallow equality (===)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
469 (defvar js2-SHNE 47) ; shallow inequality (!==)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
470 (defvar js2-REGEXP 48)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
471 (defvar js2-BINDNAME 49)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
472 (defvar js2-THROW 50)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
473 (defvar js2-RETHROW 51) ; rethrow caught exception: catch (e if ) uses it
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
474 (defvar js2-IN 52)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
475 (defvar js2-INSTANCEOF 53)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
476 (defvar js2-LOCAL_LOAD 54)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
477 (defvar js2-GETVAR 55)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
478 (defvar js2-SETVAR 56)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
479 (defvar js2-CATCH_SCOPE 57)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
480 (defvar js2-ENUM_INIT_KEYS 58)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
481 (defvar js2-ENUM_INIT_VALUES 59)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
482 (defvar js2-ENUM_INIT_ARRAY 60)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
483 (defvar js2-ENUM_NEXT 61)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
484 (defvar js2-ENUM_ID 62)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
485 (defvar js2-THISFN 63)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
486 (defvar js2-RETURN_RESULT 64) ; to return previously stored return result
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
487 (defvar js2-ARRAYLIT 65) ; array literal
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
488 (defvar js2-OBJECTLIT 66) ; object literal
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
489 (defvar js2-GET_REF 67) ; *reference
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
490 (defvar js2-SET_REF 68) ; *reference = something
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
491 (defvar js2-DEL_REF 69) ; delete reference
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
492 (defvar js2-REF_CALL 70) ; f(args) = something or f(args)++
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
493 (defvar js2-REF_SPECIAL 71) ; reference for special properties like __proto
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
494 (defvar js2-YIELD 72) ; JS 1.7 yield pseudo keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
495
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
496 ;; XML support
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
497 (defvar js2-DEFAULTNAMESPACE 73)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
498 (defvar js2-ESCXMLATTR 74)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
499 (defvar js2-ESCXMLTEXT 75)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
500 (defvar js2-REF_MEMBER 76) ; Reference for x.@y, x..y etc.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
501 (defvar js2-REF_NS_MEMBER 77) ; Reference for x.ns::y, x..ns::y etc.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
502 (defvar js2-REF_NAME 78) ; Reference for @y, @[y] etc.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
503 (defvar js2-REF_NS_NAME 79) ; Reference for ns::y, @ns::y@[y] etc.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
504
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
505 (defvar js2-first-bytecode js2-ENTERWITH)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
506 (defvar js2-last-bytecode js2-REF_NS_NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
507
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
508 (defvar js2-TRY 80)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
509 (defvar js2-SEMI 81) ; semicolon
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
510 (defvar js2-LB 82) ; left and right brackets
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
511 (defvar js2-RB 83)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
512 (defvar js2-LC 84) ; left and right curly-braces
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
513 (defvar js2-RC 85)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
514 (defvar js2-LP 86) ; left and right parens
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
515 (defvar js2-RP 87)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
516 (defvar js2-COMMA 88) ; comma operator
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
517
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
518 (defvar js2-ASSIGN 89) ; simple assignment (=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
519 (defvar js2-ASSIGN_BITOR 90) ; |=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
520 (defvar js2-ASSIGN_BITXOR 91) ; ^=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
521 (defvar js2-ASSIGN_BITAND 92) ; &=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
522 (defvar js2-ASSIGN_LSH 93) ; <<=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
523 (defvar js2-ASSIGN_RSH 94) ; >>=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
524 (defvar js2-ASSIGN_URSH 95) ; >>>=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
525 (defvar js2-ASSIGN_ADD 96) ; +=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
526 (defvar js2-ASSIGN_SUB 97) ; -=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
527 (defvar js2-ASSIGN_MUL 98) ; *=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
528 (defvar js2-ASSIGN_DIV 99) ; /=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
529 (defvar js2-ASSIGN_MOD 100) ; %=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
530
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
531 (defvar js2-first-assign js2-ASSIGN)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
532 (defvar js2-last-assign js2-ASSIGN_MOD)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
533
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
534 (defvar js2-HOOK 101) ; conditional (?:)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
535 (defvar js2-COLON 102)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
536 (defvar js2-OR 103) ; logical or (||)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
537 (defvar js2-AND 104) ; logical and (&&)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
538 (defvar js2-INC 105) ; increment/decrement (++ --)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
539 (defvar js2-DEC 106)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
540 (defvar js2-DOT 107) ; member operator (.)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
541 (defvar js2-FUNCTION 108) ; function keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
542 (defvar js2-EXPORT 109) ; export keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
543 (defvar js2-IMPORT 110) ; import keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
544 (defvar js2-IF 111) ; if keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
545 (defvar js2-ELSE 112) ; else keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
546 (defvar js2-SWITCH 113) ; switch keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
547 (defvar js2-CASE 114) ; case keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
548 (defvar js2-DEFAULT 115) ; default keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
549 (defvar js2-WHILE 116) ; while keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
550 (defvar js2-DO 117) ; do keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
551 (defvar js2-FOR 118) ; for keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
552 (defvar js2-BREAK 119) ; break keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
553 (defvar js2-CONTINUE 120) ; continue keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
554 (defvar js2-VAR 121) ; var keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
555 (defvar js2-WITH 122) ; with keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
556 (defvar js2-CATCH 123) ; catch keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
557 (defvar js2-FINALLY 124) ; finally keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
558 (defvar js2-VOID 125) ; void keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
559 (defvar js2-RESERVED 126) ; reserved keywords
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
560
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
561 (defvar js2-EMPTY 127)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
562
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
563 ;; Types used for the parse tree - never returned by scanner.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
564
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
565 (defvar js2-BLOCK 128) ; statement block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
566 (defvar js2-LABEL 129) ; label
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
567 (defvar js2-TARGET 130)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
568 (defvar js2-LOOP 131)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
569 (defvar js2-EXPR_VOID 132) ; expression statement in functions
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
570 (defvar js2-EXPR_RESULT 133) ; expression statement in scripts
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
571 (defvar js2-JSR 134)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
572 (defvar js2-SCRIPT 135) ; top-level node for entire script
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
573 (defvar js2-TYPEOFNAME 136) ; for typeof(simple-name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
574 (defvar js2-USE_STACK 137)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
575 (defvar js2-SETPROP_OP 138) ; x.y op= something
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
576 (defvar js2-SETELEM_OP 139) ; x[y] op= something
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
577 (defvar js2-LOCAL_BLOCK 140)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
578 (defvar js2-SET_REF_OP 141) ; *reference op= something
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
579
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
580 ;; For XML support:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
581 (defvar js2-DOTDOT 142) ; member operator (..)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
582 (defvar js2-COLONCOLON 143) ; namespace::name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
583 (defvar js2-XML 144) ; XML type
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
584 (defvar js2-DOTQUERY 145) ; .() -- e.g., x.emps.emp.(name == "terry")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
585 (defvar js2-XMLATTR 146) ; @
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
586 (defvar js2-XMLEND 147)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
587
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
588 ;; Optimizer-only tokens
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
589 (defvar js2-TO_OBJECT 148)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
590 (defvar js2-TO_DOUBLE 149)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
591
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
592 (defvar js2-GET 150) ; JS 1.5 get pseudo keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
593 (defvar js2-SET 151) ; JS 1.5 set pseudo keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
594 (defvar js2-LET 152) ; JS 1.7 let pseudo keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
595 (defvar js2-CONST 153)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
596 (defvar js2-SETCONST 154)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
597 (defvar js2-SETCONSTVAR 155)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
598 (defvar js2-ARRAYCOMP 156)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
599 (defvar js2-LETEXPR 157)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
600 (defvar js2-WITHEXPR 158)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
601 (defvar js2-DEBUGGER 159)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
602
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
603 (defvar js2-COMMENT 160) ; not yet in Rhino
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
604
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
605 (defvar js2-num-tokens (1+ js2-COMMENT))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
606
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
607 (defconst js2-debug-print-trees nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
608
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
609 ;; Rhino accepts any string or stream as input.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
610 ;; Emacs character processing works best in buffers, so we'll
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
611 ;; assume the input is a buffer. JavaScript strings can be
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
612 ;; copied into temp buffers before scanning them.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
613
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
614 (defmacro deflocal (name value comment)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
615 `(progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
616 (defvar ,name ,value ,comment)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
617 (make-variable-buffer-local ',name)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
618
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
619 ;; Buffer-local variables yield much cleaner code than using `defstruct'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
620 ;; They're the Emacs equivalent of instance variables, more or less.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
621
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
622 (deflocal js2-ts-dirty-line nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
623 "Token stream buffer-local variable.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
624 Indicates stuff other than whitespace since start of line.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
625
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
626 (deflocal js2-ts-regexp-flags nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
627 "Token stream buffer-local variable.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
628
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
629 (deflocal js2-ts-string ""
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
630 "Token stream buffer-local variable.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
631 Last string scanned.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
632
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
633 (deflocal js2-ts-number nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
634 "Token stream buffer-local variable.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
635 Last literal number scanned.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
636
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
637 (deflocal js2-ts-hit-eof nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
638 "Token stream buffer-local variable.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
639
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
640 (deflocal js2-ts-line-start 0
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
641 "Token stream buffer-local variable.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
642
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
643 (deflocal js2-ts-lineno 1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
644 "Token stream buffer-local variable.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
645
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
646 (deflocal js2-ts-line-end-char -1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
647 "Token stream buffer-local variable.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
648
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
649 (deflocal js2-ts-cursor 1 ; emacs buffers are 1-indexed
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
650 "Token stream buffer-local variable.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
651 Current scan position.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
652
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
653 (deflocal js2-ts-is-xml-attribute nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
654 "Token stream buffer-local variable.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
655
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
656 (deflocal js2-ts-xml-is-tag-content nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
657 "Token stream buffer-local variable.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
658
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
659 (deflocal js2-ts-xml-open-tags-count 0
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
660 "Token stream buffer-local variable.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
661
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
662 (deflocal js2-ts-string-buffer nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
663 "Token stream buffer-local variable.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
664 List of chars built up while scanning various tokens.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
665
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
666 (deflocal js2-ts-comment-type nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
667 "Token stream buffer-local variable.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
668
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
669 ;;; Parser variables
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
670
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
671 (defvar js2-parsed-errors nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
672 "List of errors produced during scanning/parsing.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
673 (make-variable-buffer-local 'js2-parsed-errors)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
674
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
675 (defvar js2-parsed-warnings nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
676 "List of warnings produced during scanning/parsing.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
677 (make-variable-buffer-local 'js2-parsed-warnings)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
678
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
679 (defvar js2-recover-from-parse-errors t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
680 "Non-nil to continue parsing after a syntax error.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
681
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
682 In recovery mode, the AST will be built in full, and any error
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
683 nodes will be flagged with appropriate error information. If
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
684 this flag is nil, a syntax error will result in an error being
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
685 signaled.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
686
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
687 The variable is automatically buffer-local, because different
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
688 modes that use the parser will need different settings.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
689 (make-variable-buffer-local 'js2-recover-from-parse-errors)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
690
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
691 (defvar js2-parse-hook nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
692 "List of callbacks for receiving parsing progress.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
693 (make-variable-buffer-local 'js2-parse-hook)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
694
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
695 (defvar js2-parse-finished-hook nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
696 "List of callbacks to notify when parsing finishes.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
697 Not called if parsing was interrupted.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
698
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
699 (defvar js2-is-eval-code nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
700 "True if we're evaluating code in a string.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
701 If non-nil, the tokenizer will record the token text, and the AST nodes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
702 will record their source text. Off by default for IDE modes, since the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
703 text is available in the buffer.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
704 (make-variable-buffer-local 'js2-is-eval-code)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
705
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
706 (defvar js2-parse-ide-mode t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
707 "Non-nil if the parser is being used for `js2-mode'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
708 If non-nil, the parser will set text properties for fontification
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
709 and the syntax-table. The value should be nil when using the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
710 parser as a frontend to an interpreter or byte compiler.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
711
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
712 ;;; Parser instance variables (buffer-local vars for js2-parse)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
713
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
714 (defconst js2-clear-ti-mask #xFFFF
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
715 "Mask to clear token information bits.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
716
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
717 (defconst js2-ti-after-eol (lsh 1 16)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
718 "Flag: first token of the source line.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
719
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
720 (defconst js2-ti-check-label (lsh 1 17)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
721 "Flag: indicates to check for label.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
722
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
723 ;; Inline Rhino's CompilerEnvirons vars as buffer-locals.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
724
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
725 (defvar js2-compiler-generate-debug-info t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
726 (make-variable-buffer-local 'js2-compiler-generate-debug-info)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
727
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
728 (defvar js2-compiler-use-dynamic-scope nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
729 (make-variable-buffer-local 'js2-compiler-use-dynamic-scope)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
730
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
731 (defvar js2-compiler-reserved-keywords-as-identifier nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
732 (make-variable-buffer-local 'js2-compiler-reserved-keywords-as-identifier)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
733
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
734 (defvar js2-compiler-xml-available t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
735 (make-variable-buffer-local 'js2-compiler-xml-available)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
736
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
737 (defvar js2-compiler-optimization-level 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
738 (make-variable-buffer-local 'js2-compiler-optimization-level)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
739
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
740 (defvar js2-compiler-generating-source t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
741 (make-variable-buffer-local 'js2-compiler-generating-source)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
742
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
743 (defvar js2-compiler-strict-mode nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
744 (make-variable-buffer-local 'js2-compiler-strict-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
745
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
746 (defvar js2-compiler-report-warning-as-error nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
747 (make-variable-buffer-local 'js2-compiler-report-warning-as-error)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
748
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
749 (defvar js2-compiler-generate-observer-count nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
750 (make-variable-buffer-local 'js2-compiler-generate-observer-count)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
751
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
752 (defvar js2-compiler-activation-names nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
753 (make-variable-buffer-local 'js2-compiler-activation-names)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
754
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
755 ;; SKIP: sourceURI
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
756
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
757 ;; There's a compileFunction method in Context.java - may need it.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
758 (defvar js2-called-by-compile-function nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
759 "True if `js2-parse' was called by `js2-compile-function'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
760 Will only be used when we finish implementing the interpreter.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
761 (make-variable-buffer-local 'js2-called-by-compile-function)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
762
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
763 ;; SKIP: ts (we just call `js2-init-scanner' and use its vars)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
764
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
765 (defvar js2-current-flagged-token js2-EOF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
766 (make-variable-buffer-local 'js2-current-flagged-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
767
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
768 (defvar js2-current-token js2-EOF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
769 (make-variable-buffer-local 'js2-current-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
770
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
771 ;; SKIP: node factory - we're going to just call functions directly,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
772 ;; and eventually go to a unified AST format.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
773
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
774 (defvar js2-nesting-of-function 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
775 (make-variable-buffer-local 'js2-nesting-of-function)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
776
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
777 (defvar js2-recorded-assignments nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
778 (make-variable-buffer-local 'js2-assignments-from-parse)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
779
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
780 ;; SKIP: decompiler
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
781 ;; SKIP: encoded-source
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
782
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
783 ;;; These variables are per-function and should be saved/restored
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
784 ;;; during function parsing.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
785
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
786 (defvar js2-current-script-or-fn nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
787 (make-variable-buffer-local 'js2-current-script-or-fn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
788
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
789 (defvar js2-current-scope nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
790 (make-variable-buffer-local 'js2-current-scope)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
791
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
792 (defvar js2-nesting-of-with 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
793 (make-variable-buffer-local 'js2-nesting-of-with)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
794
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
795 (defvar js2-label-set nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
796 "An alist mapping label names to nodes.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
797 (make-variable-buffer-local 'js2-label-set)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
798
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
799 (defvar js2-loop-set nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
800 (make-variable-buffer-local 'js2-loop-set)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
801
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
802 (defvar js2-loop-and-switch-set nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
803 (make-variable-buffer-local 'js2-loop-and-switch-set)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
804
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
805 (defvar js2-has-return-value nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
806 (make-variable-buffer-local 'js2-has-return-value)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
807
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
808 (defvar js2-end-flags 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
809 (make-variable-buffer-local 'js2-end-flags)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
810
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
811 ;;; end of per function variables
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
812
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
813 ;; Without 2-token lookahead, labels are a problem.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
814 ;; These vars store the token info of the last matched name,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
815 ;; iff it wasn't the last matched token. Only valid in some contexts.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
816 (defvar js2-prev-name-token-start nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
817 (defvar js2-prev-name-token-string nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
818
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
819 (defsubst js2-save-name-token-data (pos name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
820 (setq js2-prev-name-token-start pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
821 js2-prev-name-token-string name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
822
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
823 ;; These flags enumerate the possible ways a statement/function can
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
824 ;; terminate. These flags are used by endCheck() and by the Parser to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
825 ;; detect inconsistent return usage.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
826 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
827 ;; END_UNREACHED is reserved for code paths that are assumed to always be
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
828 ;; able to execute (example: throw, continue)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
829 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
830 ;; END_DROPS_OFF indicates if the statement can transfer control to the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
831 ;; next one. Statement such as return dont. A compound statement may have
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
832 ;; some branch that drops off control to the next statement.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
833 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
834 ;; END_RETURNS indicates that the statement can return (without arguments)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
835 ;; END_RETURNS_VALUE indicates that the statement can return a value.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
836 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
837 ;; A compound statement such as
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
838 ;; if (condition) {
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
839 ;; return value;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
840 ;; }
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
841 ;; Will be detected as (END_DROPS_OFF | END_RETURN_VALUE) by endCheck()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
842
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
843 (defconst js2-end-unreached #x0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
844 (defconst js2-end-drops-off #x1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
845 (defconst js2-end-returns #x2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
846 (defconst js2-end-returns-value #x4)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
847 (defconst js2-end-yields #x8)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
848
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
849 ;; Rhino awkwardly passes a statementLabel parameter to the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
850 ;; statementHelper() function, the main statement parser, which
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
851 ;; is then used by quite a few of the sub-parsers. We just make
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
852 ;; it a buffer-local variable and make sure it's cleaned up properly.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
853 (defvar js2-labeled-stmt nil) ; type `js2-labeled-stmt-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
854 (make-variable-buffer-local 'js2-labeled-stmt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
855
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
856 ;; Similarly, Rhino passes an inForInit boolean through about half
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
857 ;; the expression parsers. We use a dynamically-scoped variable,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
858 ;; which makes it easier to funcall the parsers individually without
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
859 ;; worrying about whether they take the parameter or not.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
860 (defvar js2-in-for-init nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
861 (make-variable-buffer-local 'js2-in-for-init)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
862
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
863 (defvar js2-temp-name-counter 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
864 (make-variable-buffer-local 'js2-temp-name-counter)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
865
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
866 (defvar js2-parse-stmt-count 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
867 (make-variable-buffer-local 'js2-parse-stmt-count)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
868
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
869 (defsubst js2-get-next-temp-name ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
870 (format "$%d" (incf js2-temp-name-counter)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
871
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
872 (defvar js2-parse-interruptable-p t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
873 "Set this to nil to force parse to continue until finished.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
874 This will mostly be useful for interpreters.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
875
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
876 (defvar js2-statements-per-pause 50
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
877 "Pause after this many statements to check for user input.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
878 If user input is pending, stop the parse and discard the tree.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
879 This makes for a smoother user experience for large files.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
880 You may have to wait a second or two before the highlighting
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
881 and error-reporting appear, but you can always type ahead if
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
882 you wish. This appears to be more or less how Eclipse, IntelliJ
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
883 and other editors work.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
884
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
885 (defvar js2-record-comments t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
886 "Instructs the scanner to record comments in `js2-scanned-comments'.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
887 (make-variable-buffer-local 'js2-record-comments)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
888
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
889 (defvar js2-scanned-comments nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
890 "List of all comments from the current parse.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
891 (make-variable-buffer-local 'js2-scanned-comments)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
892
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
893 (defun js2-underline-color (color)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
894 "Return a legal value for the :underline face attribute based on COLOR."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
895 ;; In XEmacs the :underline attribute can only be a boolean.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
896 ;; In GNU it can be the name of a colour.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
897 (if (featurep 'xemacs)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
898 (if color t nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
899 color))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
900
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
901 (defcustom js2-mode-indent-inhibit-undo nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
902 "Non-nil to disable collection of Undo information when indenting lines.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
903 Some users have requested this behavior. It's nil by default because
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
904 other Emacs modes don't work this way."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
905 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
906 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
907
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
908 (defcustom js2-mode-indent-ignore-first-tab nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
909 "If non-nil, ignore first TAB keypress if we look indented properly.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
910 It's fairly common for users to navigate to an already-indented line
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
911 and press TAB for reassurance that it's been indented. For this class
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
912 of users, we want the first TAB press on a line to be ignored if the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
913 line is already indented to one of the precomputed alternatives.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
914
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
915 This behavior is only partly implemented. If you TAB-indent a line,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
916 navigate to another line, and then navigate back, it fails to clear
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
917 the last-indented variable, so it thinks you've already hit TAB once,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
918 and performs the indent. A full solution would involve getting on the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
919 point-motion hooks for the entire buffer. If we come across another
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
920 use cases that requires watching point motion, I'll consider doing it.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
921
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
922 If you set this variable to nil, then the TAB key will always change
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
923 the indentation of the current line, if more than one alternative
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
924 indentation spot exists."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
925 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
926 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
927
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
928 (defvar js2-indent-hook nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
929 "A hook for user-defined indentation rules.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
930
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
931 Functions on this hook should expect two arguments: (LIST INDEX)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
932 The LIST argument is the list of computed indentation points for
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
933 the current line. INDEX is the list index of the indentation point
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
934 that `js2-bounce-indent' plans to use. If INDEX is nil, then the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
935 indent function is not going to change the current line indentation.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
936
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
937 If a hook function on this list returns a non-nil value, then
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
938 `js2-bounce-indent' assumes the hook function has performed its own
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
939 indentation, and will do nothing. If all hook functions on the list
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
940 return nil, then `js2-bounce-indent' will use its computed indentation
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
941 and reindent the line.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
942
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
943 When hook functions on this hook list are called, the variable
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
944 `js2-mode-ast' may or may not be set, depending on whether the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
945 parse tree is available. If the variable is nil, you can pass a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
946 callback to `js2-mode-wait-for-parse', and your callback will be
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
947 called after the new parse tree is built. This can take some time
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
948 in large files.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
949
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
950 (defface js2-warning-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
951 `((((class color) (background light))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
952 (:underline ,(js2-underline-color "orange")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
953 (((class color) (background dark))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
954 (:underline ,(js2-underline-color "orange")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
955 (t (:underline t)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
956 "Face for JavaScript warnings."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
957 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
958
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
959 (defface js2-error-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
960 `((((class color) (background light))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
961 (:foreground "red"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
962 (((class color) (background dark))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
963 (:foreground "red"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
964 (t (:foreground "red")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
965 "Face for JavaScript errors."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
966 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
967
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
968 (defface js2-jsdoc-tag-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
969 '((t :foreground "SlateGray"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
970 "Face used to highlight @whatever tags in jsdoc comments."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
971 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
972
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
973 (defface js2-jsdoc-type-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
974 '((t :foreground "SteelBlue"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
975 "Face used to highlight {FooBar} types in jsdoc comments."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
976 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
977
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
978 (defface js2-jsdoc-value-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
979 '((t :foreground "PeachPuff3"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
980 "Face used to highlight tag values in jsdoc comments."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
981 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
982
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
983 (defface js2-function-param-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
984 '((t :foreground "SeaGreen"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
985 "Face used to highlight function parameters in javascript."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
986 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
987
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
988 (defface js2-instance-member-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
989 '((t :foreground "DarkOrchid"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
990 "Face used to highlight instance variables in javascript.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
991 Not currently used."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
992 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
993
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
994 (defface js2-private-member-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
995 '((t :foreground "PeachPuff3"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
996 "Face used to highlight calls to private methods in javascript.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
997 Not currently used."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
998 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
999
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1000 (defface js2-private-function-call-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1001 '((t :foreground "goldenrod"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1002 "Face used to highlight calls to private functions in javascript.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1003 Not currently used."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1004 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1005
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1006 (defface js2-jsdoc-html-tag-name-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1007 (if js2-emacs22
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1008 '((((class color) (min-colors 88) (background light))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1009 (:foreground "rosybrown"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1010 (((class color) (min-colors 8) (background dark))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1011 (:foreground "yellow"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1012 (((class color) (min-colors 8) (background light))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1013 (:foreground "magenta")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1014 '((((type tty pc) (class color) (background light))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1015 (:foreground "magenta"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1016 (((type tty pc) (class color) (background dark))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1017 (:foreground "yellow"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1018 (t (:foreground "RosyBrown"))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1019 "Face used to highlight jsdoc html tag names"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1020 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1021
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1022 (defface js2-jsdoc-html-tag-delimiter-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1023 (if js2-emacs22
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1024 '((((class color) (min-colors 88) (background light))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1025 (:foreground "dark khaki"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1026 (((class color) (min-colors 8) (background dark))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1027 (:foreground "green"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1028 (((class color) (min-colors 8) (background light))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1029 (:foreground "green")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1030 '((((type tty pc) (class color) (background light))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1031 (:foreground "green"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1032 (((type tty pc) (class color) (background dark))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1033 (:foreground "green"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1034 (t (:foreground "dark khaki"))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1035 "Face used to highlight brackets in jsdoc html tags."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1036 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1037
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1038 (defface js2-external-variable-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1039 '((t :foreground "orange"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1040 "Face used to highlight assignments to undeclared variables.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1041 An undeclared variable is any variable not declared with var or let
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1042 in the current scope or any lexically enclosing scope. If you assign
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1043 to such a variable, then you are either expecting it to originate from
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1044 another file, or you've got a potential bug."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1045 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1046
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1047 (defcustom js2-highlight-external-variables t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1048 "Non-nil to higlight assignments to undeclared variables."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1049 :type 'boolean
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1050 :group 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1051
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1052 (defvar js2-mode-map
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1053 (let ((map (make-sparse-keymap))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1054 keys)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1055 (define-key map [mouse-1] #'js2-mode-show-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1056 (define-key map "\C-m" #'js2-enter-key)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1057 (when js2-rebind-eol-bol-keys
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1058 (define-key map "\C-a" #'js2-beginning-of-line)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1059 (define-key map "\C-e" #'js2-end-of-line))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1060 (define-key map "\C-c\C-e" #'js2-mode-hide-element)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1061 (define-key map "\C-c\C-s" #'js2-mode-show-element)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1062 (define-key map "\C-c\C-a" #'js2-mode-show-all)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1063 (define-key map "\C-c\C-f" #'js2-mode-toggle-hide-functions)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1064 (define-key map "\C-c\C-t" #'js2-mode-toggle-hide-comments)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1065 (define-key map "\C-c\C-o" #'js2-mode-toggle-element)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1066 (define-key map "\C-c\C-w" #'js2-mode-toggle-warnings-and-errors)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1067 (define-key map (kbd "C-c C-'") #'js2-next-error)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1068 ;; also define user's preference for next-error, if available
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1069 (if (setq keys (where-is-internal #'next-error))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1070 (define-key map (car keys) #'js2-next-error))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1071 (define-key map (or (car (where-is-internal #'mark-defun))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1072 (kbd "M-C-h"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1073 #'js2-mark-defun)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1074 (define-key map (or (car (where-is-internal #'narrow-to-defun))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1075 (kbd "C-x nd"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1076 #'js2-narrow-to-defun)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1077 (define-key map [down-mouse-3] #'js2-mouse-3)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1078 (when js2-auto-indent-flag
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1079 (mapc (lambda (key)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1080 (define-key map key #'js2-insert-and-indent))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1081 js2-electric-keys))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1082
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1083 (define-key map [menu-bar javascript]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1084 (cons "JavaScript" (make-sparse-keymap "JavaScript")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1085
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1086 (define-key map [menu-bar javascript customize-js2-mode]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1087 '(menu-item "Customize js2-mode" js2-mode-customize
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1088 :help "Customize the behavior of this mode"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1089
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1090 (define-key map [menu-bar javascript js2-force-refresh]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1091 '(menu-item "Force buffer refresh" js2-mode-reset
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1092 :help "Re-parse the buffer from scratch"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1093
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1094 (define-key map [menu-bar javascript separator-2]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1095 '("--"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1096
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1097 (define-key map [menu-bar javascript next-error]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1098 '(menu-item "Next warning or error" js2-next-error
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1099 :enabled (and js2-mode-ast
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1100 (or (js2-ast-root-errors js2-mode-ast)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1101 (js2-ast-root-warnings js2-mode-ast)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1102 :help "Move to next warning or error"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1103
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1104 (define-key map [menu-bar javascript display-errors]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1105 '(menu-item "Show errors and warnings" js2-mode-display-warnings-and-errors
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1106 :visible (not js2-mode-show-parse-errors)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1107 :help "Turn on display of warnings and errors"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1108
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1109 (define-key map [menu-bar javascript hide-errors]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1110 '(menu-item "Hide errors and warnings" js2-mode-hide-warnings-and-errors
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1111 :visible js2-mode-show-parse-errors
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1112 :help "Turn off display of warnings and errors"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1113
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1114 (define-key map [menu-bar javascript separator-1]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1115 '("--"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1116
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1117 (define-key map [menu-bar javascript js2-toggle-function]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1118 '(menu-item "Show/collapse element" js2-mode-toggle-element
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1119 :help "Hide or show function body or comment"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1120
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1121 (define-key map [menu-bar javascript show-comments]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1122 '(menu-item "Show block comments" js2-mode-toggle-hide-comments
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1123 :visible js2-mode-comments-hidden
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1124 :help "Expand all hidden block comments"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1125
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1126 (define-key map [menu-bar javascript hide-comments]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1127 '(menu-item "Hide block comments" js2-mode-toggle-hide-comments
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1128 :visible (not js2-mode-comments-hidden)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1129 :help "Show block comments as /*...*/"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1130
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1131 (define-key map [menu-bar javascript show-all-functions]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1132 '(menu-item "Show function bodies" js2-mode-toggle-hide-functions
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1133 :visible js2-mode-functions-hidden
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1134 :help "Expand all hidden function bodies"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1135
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1136 (define-key map [menu-bar javascript hide-all-functions]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1137 '(menu-item "Hide function bodies" js2-mode-toggle-hide-functions
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1138 :visible (not js2-mode-functions-hidden)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1139 :help "Show {...} for all top-level function bodies"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1140
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1141 map)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1142 "Keymap used in `js2-mode' buffers.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1143
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1144 (defconst js2-mode-identifier-re "[a-zA-Z_$][a-zA-Z0-9_$]*")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1145
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1146 (defvar js2-mode-//-comment-re "^\\(\\s-*\\)//.+"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1147 "Matches a //-comment line. Must be first non-whitespace on line.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1148 First match-group is the leading whitespace.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1149
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1150 (defvar js2-mode-ast nil "Private variable.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1151 (make-variable-buffer-local 'js2-mode-ast)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1152
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1153 (defvar js2-mode-hook nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1154
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1155 (defvar js2-mode-parse-timer nil "Private variable.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1156 (make-variable-buffer-local 'js2-mode-parse-timer)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1157
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1158 (defvar js2-mode-buffer-dirty-p nil "Private variable.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1159 (make-variable-buffer-local 'js2-mode-buffer-dirty-p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1160
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1161 (defvar js2-mode-parsing nil "Private variable.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1162 (make-variable-buffer-local 'js2-mode-parsing)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1163
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1164 (defvar js2-mode-node-overlay nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1165 (make-variable-buffer-local 'js2-mode-node-overlay)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1166
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1167 (defvar js2-mode-show-overlay js2-mode-dev-mode-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1168 "Debug: Non-nil to highlight AST nodes on mouse-down.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1169
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1170 (defvar js2-mode-fontifications nil "Private variable")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1171 (make-variable-buffer-local 'js2-mode-fontifications)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1172
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1173 (defvar js2-mode-deferred-properties nil "Private variable")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1174 (make-variable-buffer-local 'js2-mode-deferred-properties)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1175
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1176 (defvar js2-imenu-recorder nil "Private variable")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1177 (make-variable-buffer-local 'js2-imenu-recorder)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1178
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1179 (defvar js2-imenu-function-map nil "Private variable")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1180 (make-variable-buffer-local 'js2-imenu-function-map)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1181
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1182 (defvar js2-paragraph-start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1183 "\\(@[a-zA-Z]+\\>\\|$\\)")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1184
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1185 ;; Note that we also set a 'c-in-sws text property in html comments,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1186 ;; so that `c-forward-sws' and `c-backward-sws' work properly.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1187 (defvar js2-syntactic-ws-start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1188 "\\s \\|/[*/]\\|[\n\r]\\|\\\\[\n\r]\\|\\s!\\|<!--\\|^\\s-*-->")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1189
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1190 (defvar js2-syntactic-ws-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1191 "\\s \\|[\n\r/]\\|\\s!")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1192
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1193 (defvar js2-syntactic-eol
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1194 (concat "\\s *\\(/\\*[^*\n\r]*"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1195 "\\(\\*+[^*\n\r/][^*\n\r]*\\)*"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1196 "\\*+/\\s *\\)*"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1197 "\\(//\\|/\\*[^*\n\r]*"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1198 "\\(\\*+[^*\n\r/][^*\n\r]*\\)*$"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1199 "\\|\\\\$\\|$\\)")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1200 "Copied from java-mode. Needed for some cc-engine functions.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1201
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1202 (defvar js2-comment-prefix-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1203 "//+\\|\\**")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1204
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1205 (defvar js2-comment-start-skip
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1206 "\\(//+\\|/\\*+\\)\\s *")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1207
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1208 (defvar js2-mode-verbose-parse-p js2-mode-dev-mode-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1209 "Non-nil to emit status messages during parsing.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1210
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1211 (defvar js2-mode-functions-hidden nil "private variable")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1212 (defvar js2-mode-comments-hidden nil "private variable")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1213
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1214 (defvar js2-mode-syntax-table
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1215 (let ((table (make-syntax-table)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1216 (c-populate-syntax-table table)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1217 table)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1218 "Syntax table used in js2-mode buffers.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1219
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1220 (defvar js2-mode-abbrev-table nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1221 "Abbrev table in use in `js2-mode' buffers.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1222 (define-abbrev-table 'js2-mode-abbrev-table ())
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1223
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1224 (defvar js2-mode-must-byte-compile (not js2-mode-dev-mode-p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1225 "Non-nil to have `js2-mode' signal an error if not byte-compiled.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1226
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1227 (defvar js2-mode-pending-parse-callbacks nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1228 "List of functions waiting to be notified that parse is finished.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1229
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1230 (defvar js2-mode-last-indented-line -1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1231
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1232 (eval-when-compile
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1233 (defvar c-paragraph-start nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1234 (defvar c-paragraph-separate nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1235 (defvar c-syntactic-ws-start nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1236 (defvar c-syntactic-ws-end nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1237 (defvar c-syntactic-eol nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1238 (defvar running-xemacs nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1239 (defvar font-lock-mode nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1240 (defvar font-lock-keywords nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1241
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1242 (eval-when-compile
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1243 (if (< emacs-major-version 22)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1244 (defun c-setup-paragraph-variables () nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1245
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1246 (provide 'js2-vars)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1247
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1248 ;;; js2-vars.el ends here
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1249 ;;; js2-util.el -- JavaScript utilities
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1250
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1251 ;; Author: Steve Yegge (steve.yegge@gmail.com)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1252 ;; Keywords: javascript languages
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1253
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1254 ;;; Code
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1255
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1256 (eval-when-compile
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1257 (require 'cl))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1258
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1259
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1260 ;; Emacs21 compatibility, plus some stuff to avoid runtime dependency on CL
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1261
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1262 (unless (fboundp #'looking-back)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1263 (defun looking-back (regexp &optional limit greedy)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1264 "Return non-nil if text before point matches regular expression REGEXP.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1265 Like `looking-at' except matches before point, and is slower.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1266 LIMIT if non-nil speeds up the search by specifying a minimum
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1267 starting position, to avoid checking matches that would start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1268 before LIMIT.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1269
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1270 If GREEDY is non-nil, extend the match backwards as far as possible,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1271 stopping when a single additional previous character cannot be part
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1272 of a match for REGEXP."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1273 (let ((start (point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1274 (pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1275 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1276 (and (re-search-backward (concat "\\(?:" regexp "\\)\\=") limit t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1277 (point)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1278 (if (and greedy pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1279 (save-restriction
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1280 (narrow-to-region (point-min) start)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1281 (while (and (> pos (point-min))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1282 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1283 (goto-char pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1284 (backward-char 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1285 (looking-at (concat "\\(?:" regexp "\\)\\'"))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1286 (setq pos (1- pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1287 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1288 (goto-char pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1289 (looking-at (concat "\\(?:" regexp "\\)\\'")))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1290 (not (null pos)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1291
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1292 (unless (fboundp #'copy-overlay)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1293 (defun copy-overlay (o)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1294 "Return a copy of overlay O."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1295 (let ((o1 (make-overlay (overlay-start o) (overlay-end o)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1296 ;; FIXME: there's no easy way to find the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1297 ;; insertion-type of the two markers.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1298 (overlay-buffer o)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1299 (props (overlay-properties o)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1300 (while props
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1301 (overlay-put o1 (pop props) (pop props)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1302 o1)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1303
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1304 (unless (fboundp #'remove-overlays)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1305 (defun remove-overlays (&optional beg end name val)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1306 "Clear BEG and END of overlays whose property NAME has value VAL.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1307 Overlays might be moved and/or split.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1308 BEG and END default respectively to the beginning and end of buffer."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1309 (unless beg (setq beg (point-min)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1310 (unless end (setq end (point-max)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1311 (if (< end beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1312 (setq beg (prog1 end (setq end beg))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1313 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1314 (dolist (o (overlays-in beg end))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1315 (when (eq (overlay-get o name) val)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1316 ;; Either push this overlay outside beg...end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1317 ;; or split it to exclude beg...end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1318 ;; or delete it entirely (if it is contained in beg...end).
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1319 (if (< (overlay-start o) beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1320 (if (> (overlay-end o) end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1321 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1322 (move-overlay (copy-overlay o)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1323 (overlay-start o) beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1324 (move-overlay o end (overlay-end o)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1325 (move-overlay o (overlay-start o) beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1326 (if (> (overlay-end o) end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1327 (move-overlay o end (overlay-end o))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1328 (delete-overlay o))))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1329
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1330 ;; we don't want a runtime dependency on the CL package, so define
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1331 ;; our own versions of these functions.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1332
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1333 (defun js2-delete-if (predicate list)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1334 "Remove all items satisfying PREDICATE in LIST."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1335 (loop for item in list
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1336 if (not (funcall predicate item))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1337 collect item))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1338
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1339 (defun js2-position (element list)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1340 "Find 0-indexed position of ELEMENT in LIST comparing with `eq'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1341 Returns nil if element is not found in the list."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1342 (let ((count 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1343 found)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1344 (while (and list (not found))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1345 (if (eq element (car list))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1346 (setq found t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1347 (setq count (1+ count)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1348 list (cdr list))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1349 (if found count)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1350
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1351 (defun js2-find-if (predicate list)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1352 "Find first item satisfying PREDICATE in LIST."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1353 (let (result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1354 (while (and list (not result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1355 (if (funcall predicate (car list))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1356 (setq result (car list)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1357 (setq list (cdr list)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1358 result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1359
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1360 ;;; end Emacs 21 compat
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1361
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1362 (defmacro js2-time (form)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1363 "Evaluate FORM, discard result, and return elapsed time in sec"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1364 (let ((beg (make-symbol "--js2-time-beg--"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1365 (delta (make-symbol "--js2-time-end--")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1366 `(let ((,beg (current-time))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1367 ,delta)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1368 ,form
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1369 (/ (truncate (* (- (float-time (current-time))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1370 (float-time ,beg)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1371 10000)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1372 10000.0))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1373
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1374 (def-edebug-spec js2-time t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1375
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1376 (defsubst neq (expr1 expr2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1377 "Return (not (eq expr1 expr2))."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1378 (not (eq expr1 expr2)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1379
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1380 (defsubst js2-same-line (pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1381 "Return t if POS is on the same line as current point."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1382 (and (>= pos (point-at-bol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1383 (<= pos (point-at-eol))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1384
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1385 (defsubst js2-same-line-2 (p1 p2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1386 "Return t if p1 is on the same line as p2."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1387 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1388 (goto-char p1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1389 (js2-same-line p2)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1390
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1391 (defun js2-code-bug ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1392 "Signal an error when we encounter an unexpected code path."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1393 (error "failed assertion"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1394
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1395 ;; I'd like to associate errors with nodes, but for now the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1396 ;; easiest thing to do is get the context info from the last token.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1397 (defsubst js2-record-parse-error (msg &optional arg pos len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1398 (push (list (list msg arg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1399 (or pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1400 (or len (- js2-token-end js2-token-beg)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1401 js2-parsed-errors))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1402
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1403 (defsubst js2-report-error (msg &optional msg-arg pos len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1404 "Signal a syntax error or record a parse error."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1405 (if js2-recover-from-parse-errors
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1406 (js2-record-parse-error msg msg-arg pos len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1407 (signal 'js2-syntax-error
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1408 (list msg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1409 js2-ts-lineno
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1410 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1411 (goto-char js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1412 (current-column))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1413 js2-ts-hit-eof))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1414
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1415 (defsubst js2-report-warning (msg &optional msg-arg pos len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1416 (if js2-compiler-report-warning-as-error
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1417 (js2-report-error msg msg-arg pos len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1418 (push (list (list msg msg-arg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1419 (or pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1420 (or len (- js2-token-end js2-token-beg)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1421 js2-parsed-warnings)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1422
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1423 (defsubst js2-add-strict-warning (msg-id &optional msg-arg beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1424 (if js2-compiler-strict-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1425 (js2-report-warning msg-id msg-arg beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1426 (and beg end (- end beg)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1427
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1428 (put 'js2-syntax-error 'error-conditions
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1429 '(error syntax-error js2-syntax-error))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1430 (put 'js2-syntax-error 'error-message "Syntax error")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1431
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1432 (put 'js2-parse-error 'error-conditions
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1433 '(error parse-error js2-parse-error))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1434 (put 'js2-parse-error 'error-message "Parse error")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1435
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1436 (defmacro js2-clear-flag (flags flag)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1437 `(setq ,flags (logand ,flags (lognot ,flag))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1438
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1439 (defmacro js2-set-flag (flags flag)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1440 "Logical-or FLAG into FLAGS."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1441 `(setq ,flags (logior ,flags ,flag)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1442
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1443 (defsubst js2-flag-set-p (flags flag)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1444 (/= 0 (logand flags flag)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1445
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1446 (defsubst js2-flag-not-set-p (flags flag)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1447 (zerop (logand flags flag)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1448
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1449 ;; Stolen shamelessly from James Clark's nxml-mode.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1450 (defmacro js2-with-unmodifying-text-property-changes (&rest body)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1451 "Evaluate BODY without any text property changes modifying the buffer.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1452 Any text properties changes happen as usual but the changes are not treated as
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1453 modifications to the buffer."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1454 (let ((modified (make-symbol "modified")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1455 `(let ((,modified (buffer-modified-p))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1456 (inhibit-read-only t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1457 (inhibit-modification-hooks t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1458 (buffer-undo-list t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1459 (deactivate-mark nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1460 ;; Apparently these avoid file locking problems.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1461 (buffer-file-name nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1462 (buffer-file-truename nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1463 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1464 (progn ,@body)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1465 (unless ,modified
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1466 (restore-buffer-modified-p nil))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1467
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1468 (put 'js2-with-unmodifying-text-property-changes 'lisp-indent-function 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1469 (def-edebug-spec js2-with-unmodifying-text-property-changes t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1470
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1471 (defmacro js2-with-underscore-as-word-syntax (&rest body)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1472 "Evaluate BODY with the _ character set to be word-syntax."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1473 (let ((old-syntax (make-symbol "old-syntax")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1474 `(let ((,old-syntax (string (char-syntax ?_))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1475 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1476 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1477 (modify-syntax-entry ?_ "w" js2-mode-syntax-table)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1478 ,@body)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1479 (modify-syntax-entry ?_ ,old-syntax js2-mode-syntax-table)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1480
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1481 (put 'js2-with-underscore-as-word-syntax 'lisp-indent-function 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1482 (def-edebug-spec js2-with-underscore-as-word-syntax t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1483
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1484 (defmacro with-buffer (buf form)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1485 "Executes FORM in buffer BUF.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1486 BUF can be a buffer name or a buffer object.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1487 If the buffer doesn't exist, it's created."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1488 `(let ((buffer (gentemp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1489 (setq buffer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1490 (if (stringp ,buf)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1491 (get-buffer-create ,buf)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1492 ,buf))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1493 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1494 (set-buffer buffer)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1495 ,form)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1496
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1497 (defsubst char-is-uppercase (c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1498 "Return t if C is an uppercase character.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1499 Handles unicode and latin chars properly."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1500 (/= c (downcase c)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1501
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1502 (defsubst char-is-lowercase (c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1503 "Return t if C is an uppercase character.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1504 Handles unicode and latin chars properly."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1505 (/= c (upcase c)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1506
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1507 (put 'with-buffer 'lisp-indent-function 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1508 (def-edebug-spec with-buffer t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1509
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1510 (provide 'js2-util)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1511
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1512 ;;; js2-util.el ends here
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1513 ;;; js2-scan.el --- JavaScript scanner
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1514
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1515 ;; Author: Steve Yegge (steve.yegge@gmail.com)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1516 ;; Keywords: javascript languages
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1517
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1518 ;;; Commentary:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1519
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1520 ;; A port of Mozilla Rhino's scanner.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1521 ;; Corresponds to Rhino files Token.java and TokenStream.java.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1522
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1523 ;;; Code:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1524
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1525
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1526 (eval-when-compile
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1527 (require 'cl))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1528
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1529 (defvar js2-tokens nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1530 "List of all defined token names.") ; intialized below
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1531
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1532 (defvar js2-token-names
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1533 (let* ((names (make-vector js2-num-tokens -1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1534 (case-fold-search nil) ; only match js2-UPPER_CASE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1535 (syms (apropos-internal "^js2-\\(?:[A-Z_]+\\)")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1536 (loop for sym in syms
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1537 for i from 0
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1538 do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1539 (unless (or (memq sym '(js2-EOF_CHAR js2-ERROR))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1540 (not (boundp sym)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1541 (aset names (symbol-value sym) ; code, e.g. 152
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1542 (substring (symbol-name sym) 4)) ; name, e.g. "LET"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1543 (push sym js2-tokens)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1544 names)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1545 "Vector mapping int values to token string names, sans `js2-' prefix.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1546
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1547 (defun js2-token-name (tok)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1548 "Return a string name for TOK, a token symbol or code.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1549 Signals an error if it's not a recognized token."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1550 (let ((code tok))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1551 (if (symbolp tok)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1552 (setq code (symbol-value tok)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1553 (if (eq code -1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1554 "ERROR"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1555 (if (and (numberp code)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1556 (not (minusp code))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1557 (< code js2-num-tokens))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1558 (aref js2-token-names code)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1559 (error "Invalid token: %s" code)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1560
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1561 (defsubst js2-token-sym (tok)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1562 "Return symbol for TOK given its code, e.g. 'js2-LP for code 86."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1563 (intern (js2-token-name tok)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1564
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1565 (defvar js2-token-codes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1566 (let ((table (make-hash-table :test 'eq :size 256)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1567 (loop for name across js2-token-names
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1568 for sym = (intern (concat "js2-" name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1569 do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1570 (puthash sym (symbol-value sym) table))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1571 ;; clean up a few that are "wrong" in Rhino's token codes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1572 (puthash 'js2-DELETE js2-DELPROP table)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1573 table)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1574 "Hashtable mapping token symbols to their bytecodes.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1575
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1576 (defsubst js2-token-code (sym)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1577 "Return code for token symbol SYM, e.g. 86 for 'js2-LP."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1578 (or (gethash sym js2-token-codes)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1579 (error "Invalid token symbol: %s " sym))) ; signal code bug
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1580
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1581 (defsubst js2-report-scan-error (msg &optional no-throw beg len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1582 (setq js2-token-end js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1583 (js2-report-error msg nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1584 (or beg js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1585 (or len (- js2-token-end js2-token-beg)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1586 (unless no-throw
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1587 (throw 'return js2-ERROR)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1588
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1589 (defsubst js2-get-string-from-buffer ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1590 "Reverse the char accumulator and return it as a string."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1591 (setq js2-token-end js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1592 (if js2-ts-string-buffer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1593 (apply #'string (nreverse js2-ts-string-buffer))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1594 ""))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1595
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1596 ;; TODO: could potentially avoid a lot of consing by allocating a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1597 ;; char buffer the way Rhino does.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1598 (defsubst js2-add-to-string (c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1599 (push c js2-ts-string-buffer))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1600
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1601 ;; Note that when we "read" the end-of-file, we advance js2-ts-cursor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1602 ;; to (1+ (point-max)), which lets the scanner treat end-of-file like
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1603 ;; any other character: when it's not part of the current token, we
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1604 ;; unget it, allowing it to be read again by the following call.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1605 (defsubst js2-unget-char ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1606 (decf js2-ts-cursor))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1607
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1608 ;; Rhino distinguishes \r and \n line endings. We don't need to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1609 ;; because we only scan from Emacs buffers, which always use \n.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1610 (defsubst js2-get-char ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1611 "Read and return the next character from the input buffer.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1612 Increments `js2-ts-lineno' if the return value is a newline char.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1613 Updates `js2-ts-cursor' to the point after the returned char.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1614 Returns `js2-EOF_CHAR' if we hit the end of the buffer.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1615 Also updates `js2-ts-hit-eof' and `js2-ts-line-start' as needed."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1616 (let (c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1617 ;; check for end of buffer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1618 (if (>= js2-ts-cursor (point-max))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1619 (setq js2-ts-hit-eof t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1620 js2-ts-cursor (1+ js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1621 c js2-EOF_CHAR) ; return value
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1622
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1623 ;; otherwise read next char
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1624 (setq c (char-before (incf js2-ts-cursor)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1625
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1626 ;; if we read a newline, update counters
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1627 (if (= c ?\n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1628 (setq js2-ts-line-start js2-ts-cursor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1629 js2-ts-lineno (1+ js2-ts-lineno)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1630
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1631 ;; TODO: skip over format characters
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1632 c)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1633
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1634 (defsubst js2-read-unicode-escape ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1635 "Read a \\uNNNN sequence from the input.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1636 Assumes the ?\ and ?u have already been read.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1637 Returns the unicode character, or nil if it wasn't a valid character.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1638 Doesn't change the values of any scanner variables."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1639 ;; I really wish I knew a better way to do this, but I can't
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1640 ;; find the Emacs function that takes a 16-bit int and converts
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1641 ;; it to a Unicode/utf-8 character. So I basically eval it with (read).
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1642 ;; Have to first check that it's 4 hex characters or it may stop
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1643 ;; the read early.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1644 (ignore-errors
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1645 (let ((s (buffer-substring-no-properties js2-ts-cursor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1646 (+ 4 js2-ts-cursor))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1647 (if (string-match "[a-zA-Z0-9]\\{4\\}" s)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1648 (read (concat "?\\u" s))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1649
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1650 (defsubst js2-match-char (test)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1651 "Consume and return next character if it matches TEST, a character.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1652 Returns nil and consumes nothing if TEST is not the next character."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1653 (let ((c (js2-get-char)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1654 (if (eq c test)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1655 t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1656 (js2-unget-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1657 nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1658
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1659 (defsubst js2-peek-char ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1660 (prog1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1661 (js2-get-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1662 (js2-unget-char)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1663
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1664 (defsubst js2-java-identifier-start-p (c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1665 (or
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1666 (memq c '(?$ ?_))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1667 (char-is-uppercase c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1668 (char-is-lowercase c)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1669
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1670 (defsubst js2-java-identifier-part-p (c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1671 "Implementation of java.lang.Character.isJavaIdentifierPart()"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1672 ;; TODO: make me Unicode-friendly. See comments above.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1673 (or
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1674 (memq c '(?$ ?_))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1675 (char-is-uppercase c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1676 (char-is-lowercase c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1677 (and (>= c ?0) (<= c ?9))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1678
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1679 (defsubst js2-alpha-p (c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1680 ;; Use 'Z' < 'a'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1681 (if (<= c ?Z)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1682 (<= ?A c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1683 (and (<= ?a c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1684 (<= c ?z))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1685
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1686 (defsubst js2-digit-p (c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1687 (and (<= ?0 c) (<= c ?9)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1688
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1689 (defsubst js2-js-space-p (c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1690 (if (<= c 127)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1691 (memq c '(#x20 #x9 #xC #xB))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1692 (or
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1693 (eq c #xA0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1694 ;; TODO: change this nil to check for Unicode space character
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1695 nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1696
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1697 (defsubst js2-skip-line ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1698 "Skip to end of line"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1699 (let (c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1700 (while (and (/= js2-EOF_CHAR (setq c (js2-get-char)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1701 (/= c ?\n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1702 (js2-unget-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1703 (setq js2-token-end js2-ts-cursor)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1704
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1705 (defun js2-init-scanner (&optional buf line)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1706 "Create token stream for BUF starting on LINE.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1707 BUF defaults to current-buffer and line defaults to 1.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1708
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1709 A buffer can only have one scanner active at a time, which yields
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1710 dramatically simpler code than using a defstruct. If you need to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1711 have simultaneous scanners in a buffer, copy the regions to scan
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1712 into temp buffers."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1713 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1714 (when buf
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1715 (set-buffer buf))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1716 (setq js2-ts-dirty-line nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1717 js2-ts-regexp-flags nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1718 js2-ts-string ""
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1719 js2-ts-number nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1720 js2-ts-hit-eof nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1721 js2-ts-line-start 0
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1722 js2-ts-lineno (or line 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1723 js2-ts-line-end-char -1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1724 js2-ts-cursor (point-min)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1725 js2-ts-is-xml-attribute nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1726 js2-ts-xml-is-tag-content nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1727 js2-ts-xml-open-tags-count 0
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1728 js2-ts-string-buffer nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1729
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1730 ;; This function uses the cached op, string and number fields in
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1731 ;; TokenStream; if getToken has been called since the passed token
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1732 ;; was scanned, the op or string printed may be incorrect.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1733 (defun js2-token-to-string (token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1734 ;; Not sure where this function is used in Rhino. Not tested.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1735 (if (not js2-debug-print-trees)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1736 ""
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1737 (let ((name (js2-token-name token)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1738 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1739 ((memq token (list js2-STRING js2-REGEXP js2-NAME))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1740 (concat name " `" js2-ts-string "'"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1741 ((eq token js2-NUMBER)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1742 (format "NUMBER %g" js2-ts-number))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1743 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1744 name)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1745
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1746 (defconst js2-keywords
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1747 '(break
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1748 case catch const continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1749 debugger default delete do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1750 else enum
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1751 false finally for function
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1752 if in instanceof import
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1753 let
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1754 new null
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1755 return
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1756 switch
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1757 this throw true try typeof
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1758 var void
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1759 while with
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1760 yield))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1761
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1762 ;; Token names aren't exactly the same as the keywords, unfortunately.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1763 ;; E.g. enum isn't in the tokens, and delete is js2-DELPROP.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1764 (defconst js2-kwd-tokens
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1765 (let ((table (make-vector js2-num-tokens nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1766 (tokens
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1767 (list js2-BREAK
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1768 js2-CASE js2-CATCH js2-CONST js2-CONTINUE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1769 js2-DEBUGGER js2-DEFAULT js2-DELPROP js2-DO
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1770 js2-ELSE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1771 js2-FALSE js2-FINALLY js2-FOR js2-FUNCTION
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1772 js2-IF js2-IN js2-INSTANCEOF js2-IMPORT
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1773 js2-LET
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1774 js2-NEW js2-NULL
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1775 js2-RETURN
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1776 js2-SWITCH
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1777 js2-THIS js2-THROW js2-TRUE js2-TRY js2-TYPEOF
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1778 js2-VAR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1779 js2-WHILE js2-WITH
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1780 js2-YIELD)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1781 (dolist (i tokens)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1782 (aset table i 'font-lock-keyword-face))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1783 (aset table js2-STRING 'font-lock-string-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1784 (aset table js2-REGEXP 'font-lock-string-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1785 (aset table js2-COMMENT 'font-lock-comment-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1786 (aset table js2-THIS 'font-lock-builtin-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1787 (aset table js2-VOID 'font-lock-constant-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1788 (aset table js2-NULL 'font-lock-constant-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1789 (aset table js2-TRUE 'font-lock-constant-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1790 (aset table js2-FALSE 'font-lock-constant-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1791 table)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1792 "Vector whose values are non-nil for tokens that are keywords.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1793 The values are default faces to use for highlighting the keywords.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1794
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1795 (defconst js2-reserved-words
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1796 '(abstract
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1797 boolean byte
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1798 char class
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1799 double
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1800 enum extends
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1801 final float
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1802 goto
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1803 implements int interface
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1804 long
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1805 native
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1806 package private protected public
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1807 short static super synchronized
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1808 throws transient
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1809 volatile))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1810
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1811 (defconst js2-keyword-names
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1812 (let ((table (make-hash-table :test 'equal)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1813 (loop for k in js2-keywords
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1814 do (puthash
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1815 (symbol-name k) ; instanceof
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1816 (intern (concat "js2-"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1817 (upcase (symbol-name k)))) ; js2-INSTANCEOF
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1818 table))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1819 table)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1820 "JavaScript keywords by name, mapped to their symbols.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1821
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1822 (defconst js2-reserved-word-names
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1823 (let ((table (make-hash-table :test 'equal)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1824 (loop for k in js2-reserved-words
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1825 do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1826 (puthash (symbol-name k) 'js2-RESERVED table))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1827 table)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1828 "JavaScript reserved words by name, mapped to 'js2-RESERVED.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1829
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1830 (defsubst js2-collect-string (buf)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1831 "Convert BUF, a list of chars, to a string.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1832 Reverses BUF before converting."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1833 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1834 ((stringp buf)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1835 buf)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1836 ((null buf) ; for emacs21 compat
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1837 "")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1838 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1839 (if buf
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1840 (apply #'string (nreverse buf))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1841 ""))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1842
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1843 (defun js2-string-to-keyword (s)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1844 "Return token for S, a string, if S is a keyword or reserved word.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1845 Returns a symbol such as 'js2-BREAK, or nil if not keyword/reserved."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1846 (or (gethash s js2-keyword-names)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1847 (gethash s js2-reserved-word-names)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1848
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1849 (defsubst js2-ts-set-char-token-bounds ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1850 "Used when next token is one character."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1851 (setq js2-token-beg (1- js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1852 js2-token-end js2-ts-cursor))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1853
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1854 (defsubst js2-ts-return (token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1855 "Return an N-character TOKEN from `js2-get-token'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1856 Updates `js2-token-end' accordingly."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1857 (setq js2-token-end js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1858 (throw 'return token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1859
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1860 (defsubst js2-x-digit-to-int (c accumulator)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1861 "Build up a hex number.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1862 If C is a hexadecimal digit, return ACCUMULATOR * 16 plus
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1863 corresponding number. Otherwise return -1."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1864 (catch 'return
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1865 (catch 'check
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1866 ;; Use 0..9 < A..Z < a..z
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1867 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1868 ((<= c ?9)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1869 (decf c ?0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1870 (if (<= 0 c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1871 (throw 'check nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1872 ((<= c ?F)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1873 (when (<= ?A c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1874 (decf c (- ?A 10))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1875 (throw 'check nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1876 ((<= c ?f)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1877 (when (<= ?a c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1878 (decf c (- ?a 10))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1879 (throw 'check nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1880 (throw 'return -1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1881 (logior c (lsh accumulator 4))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1882
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1883 (defun js2-get-token ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1884 "Return next JavaScript token, an int such as js2-RETURN."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1885 (let (c
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1886 c1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1887 identifier-start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1888 is-unicode-escape-start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1889 contains-escape
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1890 escape-val
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1891 escape-start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1892 str
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1893 result
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1894 base
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1895 is-integer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1896 quote-char
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1897 val
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1898 look-for-slash
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1899 continue)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1900 (catch 'return
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1901 (while t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1902 ;; Eat whitespace, possibly sensitive to newlines.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1903 (setq continue t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1904 (while continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1905 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1906 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1907 ((eq c js2-EOF_CHAR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1908 (js2-ts-set-char-token-bounds)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1909 (throw 'return js2-EOF))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1910 ((eq c ?\n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1911 (js2-ts-set-char-token-bounds)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1912 (setq js2-ts-dirty-line nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1913 (throw 'return js2-EOL))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1914 ((not (js2-js-space-p c))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1915 (if (/= c ?-) ; in case end of HTML comment
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1916 (setq js2-ts-dirty-line t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1917 (setq continue nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1918
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1919 ;; Assume the token will be 1 char - fixed up below.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1920 (js2-ts-set-char-token-bounds)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1921
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1922 (when (eq c ?@)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1923 (throw 'return js2-XMLATTR))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1924
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1925 ;; identifier/keyword/instanceof?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1926 ;; watch out for starting with a <backslash>
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1927 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1928 ((eq c ?\\)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1929 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1930 (if (eq c ?u)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1931 (setq identifier-start t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1932 is-unicode-escape-start t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1933 js2-ts-string-buffer nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1934 (setq identifier-start nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1935 (js2-unget-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1936 (setq c ?\\)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1937 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1938 (when (setq identifier-start (js2-java-identifier-start-p c))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1939 (setq js2-ts-string-buffer nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1940 (js2-add-to-string c))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1941
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1942 (when identifier-start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1943 (setq contains-escape is-unicode-escape-start)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1944 (catch 'break
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1945 (while t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1946 (if is-unicode-escape-start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1947 ;; strictly speaking we should probably push-back
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1948 ;; all the bad characters if the <backslash>uXXXX
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1949 ;; sequence is malformed. But since there isn't a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1950 ;; correct context(is there?) for a bad Unicode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1951 ;; escape sequence in an identifier, we can report
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1952 ;; an error here.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1953 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1954 (setq escape-val 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1955 (dotimes (i 4)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1956 (setq c (js2-get-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1957 escape-val (js2-x-digit-to-int c escape-val))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1958 ;; Next check takes care of c < 0 and bad escape
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1959 (if (minusp escape-val)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1960 (throw 'break nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1961 (if (minusp escape-val)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1962 (js2-report-scan-error "msg.invalid.escape" t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1963 (js2-add-to-string escape-val)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1964 (setq is-unicode-escape-start nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1965 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1966 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1967 ((eq c ?\\)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1968 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1969 (if (eq c ?u)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1970 (setq is-unicode-escape-start t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1971 contains-escape t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1972 (js2-report-scan-error "msg.illegal.character" t)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1973 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1974 (if (or (eq c js2-EOF_CHAR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1975 (not (js2-java-identifier-part-p c)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1976 (throw 'break nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1977 (js2-add-to-string c))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1978 (js2-unget-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1979
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1980 (setq str (js2-get-string-from-buffer))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1981 (unless contains-escape
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1982 ;; OPT we shouldn't have to make a string (object!) to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1983 ;; check if it's a keyword.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1984
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1985 ;; Return the corresponding token if it's a keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1986 (when (setq result (js2-string-to-keyword str))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1987 (if (and (< js2-language-version 170)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1988 (memq result '(js2-LET js2-YIELD)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1989 ;; LET and YIELD are tokens only in 1.7 and later
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1990 (setq result 'js2-NAME))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1991 (if (neq result js2-RESERVED)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1992 (throw 'return (js2-token-code result)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1993 (js2-report-warning "msg.reserved.keyword" str)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1994
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1995 ;; If we want to intern these as Rhino does, just use (intern str)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1996 (setq js2-ts-string str)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1997 (throw 'return js2-NAME)) ; end identifier/kwd check
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1998
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1999 ;; is it a number?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2000 (when (or (js2-digit-p c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2001 (and (eq c ?.) (js2-digit-p (js2-peek-char))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2002 (setq js2-ts-string-buffer nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2003 base 10)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2004 (when (eq c ?0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2005 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2006 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2007 ((or (eq c ?x) (eq c ?X))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2008 (setq base 16)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2009 (setq c (js2-get-char)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2010 ((js2-digit-p c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2011 (setq base 8))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2012 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2013 (js2-add-to-string ?0))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2014
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2015 (if (eq base 16)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2016 (while (<= 0 (js2-x-digit-to-int c 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2017 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2018 (setq c (js2-get-char)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2019 (while (and (<= ?0 c) (<= c ?9))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2020 ;; We permit 08 and 09 as decimal numbers, which
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2021 ;; makes our behavior a superset of the ECMA
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2022 ;; numeric grammar. We might not always be so
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2023 ;; permissive, so we warn about it.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2024 (when (and (eq base 8) (>= c ?8))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2025 (js2-report-warning "msg.bad.octal.literal"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2026 (if (eq c ?8) "8" "9"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2027 (setq base 10))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2028 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2029 (setq c (js2-get-char))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2030
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2031 (setq is-integer t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2032
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2033 (when (and (eq base 10) (memq c '(?. ?e ?E)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2034 (setq is-integer nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2035 (when (eq c ?.)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2036 (loop do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2037 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2038 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2039 while (js2-digit-p c)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2040 (when (memq c '(?e ?E))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2041 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2042 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2043 (when (memq c '(?+ ?-))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2044 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2045 (setq c (js2-get-char)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2046 (unless (js2-digit-p c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2047 (js2-report-scan-error "msg.missing.exponent" t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2048 (loop do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2049 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2050 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2051 while (js2-digit-p c))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2052
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2053 (js2-unget-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2054 (setq js2-ts-string (js2-get-string-from-buffer)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2055 js2-ts-number
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2056 (if (and (eq base 10) (not is-integer))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2057 (string-to-number js2-ts-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2058 ;; TODO: call runtime number-parser. Some of it is in
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2059 ;; js2-util.el, but I need to port ScriptRuntime.stringToNumber.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2060 (string-to-number js2-ts-string)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2061 (throw 'return js2-NUMBER))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2062
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2063 ;; is it a string?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2064 (when (memq c '(?\" ?\'))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2065 ;; We attempt to accumulate a string the fast way, by
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2066 ;; building it directly out of the reader. But if there
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2067 ;; are any escaped characters in the string, we revert to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2068 ;; building it out of a string buffer.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2069 (setq quote-char c
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2070 js2-ts-string-buffer nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2071 c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2072 (catch 'break
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2073 (while (/= c quote-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2074 (catch 'continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2075 (when (or (eq c ?\n) (eq c js2-EOF_CHAR))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2076 (js2-unget-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2077 (setq js2-token-end js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2078 (js2-report-error "msg.unterminated.string.lit")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2079 (throw 'return js2-STRING))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2080
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2081 (when (eq c ?\\)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2082 ;; We've hit an escaped character
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2083 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2084 (case c
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2085 (?b (setq c ?\b))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2086 (?f (setq c ?\f))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2087 (?n (setq c ?\n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2088 (?r (setq c ?\r))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2089 (?t (setq c ?\t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2090 (?v (setq c ?\v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2091 (?u
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2092 (setq c1 (js2-read-unicode-escape))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2093 (if js2-parse-ide-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2094 (if c1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2095 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2096 ;; just copy the string in IDE-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2097 (js2-add-to-string ?\\)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2098 (js2-add-to-string ?u)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2099 (dotimes (i 3)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2100 (js2-add-to-string (js2-get-char)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2101 (setq c (js2-get-char))) ; added at end of loop
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2102 ;; flag it as an invalid escape
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2103 (js2-report-warning "msg.invalid.escape"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2104 nil (- js2-ts-cursor 2) 6))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2105 ;; Get 4 hex digits; if the u escape is not
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2106 ;; followed by 4 hex digits, use 'u' + the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2107 ;; literal character sequence that follows.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2108 (js2-add-to-string ?u)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2109 (setq escape-val 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2110 (dotimes (i 4)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2111 (setq c (js2-get-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2112 escape-val (js2-x-digit-to-int c escape-val))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2113 (if (minusp escape-val)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2114 (throw 'continue nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2115 (js2-add-to-string c))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2116 ;; prepare for replace of stored 'u' sequence by escape value
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2117 (setq js2-ts-string-buffer (nthcdr 5 js2-ts-string-buffer)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2118 c escape-val)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2119 (?x
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2120 ;; Get 2 hex digits, defaulting to 'x'+literal
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2121 ;; sequence, as above.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2122 (setq c (js2-get-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2123 escape-val (js2-x-digit-to-int c 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2124 (if (minusp escape-val)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2125 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2126 (js2-add-to-string ?x)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2127 (throw 'continue nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2128 (setq c1 c
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2129 c (js2-get-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2130 escape-val (js2-x-digit-to-int c escape-val))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2131 (if (minusp escape-val)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2132 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2133 (js2-add-to-string ?x)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2134 (js2-add-to-string c1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2135 (throw 'continue nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2136 ;; got 2 hex digits
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2137 (setq c escape-val))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2138 (?\n
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2139 ;; Remove line terminator after escape to follow
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2140 ;; SpiderMonkey and C/C++
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2141 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2142 (throw 'continue nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2143 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2144 (when (and (<= ?0 c) (< c ?8))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2145 (setq val (- c ?0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2146 c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2147 (when (and (<= ?0 c) (< c ?8))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2148 (setq val (- (+ (* 8 val) c) ?0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2149 c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2150 (when (and (<= ?0 c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2151 (< c ?8)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2152 (< val #o37))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2153 ;; c is 3rd char of octal sequence only
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2154 ;; if the resulting val <= 0377
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2155 (setq val (- (+ (* 8 val) c) ?0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2156 c (js2-get-char))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2157 (js2-unget-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2158 (setq c val)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2159 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2160 (setq c (js2-get-char)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2161 (setq js2-ts-string (js2-get-string-from-buffer))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2162 (throw 'return js2-STRING))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2163
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2164 (case c
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2165 (?\;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2166 (throw 'return js2-SEMI))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2167 (?\[
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2168 (throw 'return js2-LB))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2169 (?\]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2170 (throw 'return js2-RB))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2171 (?{
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2172 (throw 'return js2-LC))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2173 (?}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2174 (throw 'return js2-RC))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2175 (?\(
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2176 (throw 'return js2-LP))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2177 (?\)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2178 (throw 'return js2-RP))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2179 (?,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2180 (throw 'return js2-COMMA))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2181 (??
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2182 (throw 'return js2-HOOK))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2183 (?:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2184 (if (js2-match-char ?:)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2185 (js2-ts-return js2-COLONCOLON)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2186 (throw 'return js2-COLON)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2187 (?.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2188 (if (js2-match-char ?.)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2189 (js2-ts-return js2-DOTDOT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2190 (if (js2-match-char ?\()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2191 (js2-ts-return js2-DOTQUERY)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2192 (throw 'return js2-DOT))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2193 (?|
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2194 (if (js2-match-char ?|)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2195 (throw 'return js2-OR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2196 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2197 (js2-ts-return js2-ASSIGN_BITOR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2198 (throw 'return js2-BITOR))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2199 (?^
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2200 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2201 (js2-ts-return js2-ASSIGN_BITOR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2202 (throw 'return js2-BITXOR)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2203 (?&
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2204 (if (js2-match-char ?&)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2205 (throw 'return js2-AND)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2206 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2207 (js2-ts-return js2-ASSIGN_BITAND)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2208 (throw 'return js2-BITAND))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2209 (?=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2210 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2211 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2212 (js2-ts-return js2-SHEQ)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2213 (throw 'return js2-EQ))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2214 (throw 'return js2-ASSIGN)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2215 (?!
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2216 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2217 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2218 (js2-ts-return js2-SHNE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2219 (js2-ts-return js2-NE))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2220 (throw 'return js2-NOT)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2221 (?<
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2222 ;; NB:treat HTML begin-comment as comment-till-eol
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2223 (when (js2-match-char ?!)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2224 (when (js2-match-char ?-)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2225 (when (js2-match-char ?-)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2226 (js2-skip-line)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2227 (setq js2-ts-comment-type 'html)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2228 (throw 'return js2-COMMENT)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2229 (js2-unget-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2230
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2231 (if (js2-match-char ?<)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2232 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2233 (js2-ts-return js2-ASSIGN_LSH)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2234 (js2-ts-return js2-LSH))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2235 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2236 (js2-ts-return js2-LE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2237 (throw 'return js2-LT))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2238 (?>
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2239 (if (js2-match-char ?>)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2240 (if (js2-match-char ?>)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2241 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2242 (js2-ts-return js2-ASSIGN_URSH)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2243 (js2-ts-return js2-URSH))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2244 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2245 (js2-ts-return js2-ASSIGN_RSH)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2246 (js2-ts-return js2-RSH)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2247 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2248 (js2-ts-return js2-GE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2249 (throw 'return js2-GT))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2250 (?*
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2251 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2252 (js2-ts-return js2-ASSIGN_MUL)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2253 (throw 'return js2-MUL)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2254
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2255 (?/
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2256 ;; is it a // comment?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2257 (when (js2-match-char ?/)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2258 (setq js2-token-beg (- js2-ts-cursor 2))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2259 (js2-skip-line)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2260 (setq js2-ts-comment-type 'line)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2261 (throw 'return js2-COMMENT))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2262
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2263 ;; is it a /* comment?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2264 (when (js2-match-char ?*)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2265 (setq look-for-slash nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2266 js2-token-beg (- js2-ts-cursor 2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2267 js2-ts-comment-type
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2268 (if (js2-match-char ?*)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2269 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2270 (setq look-for-slash t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2271 'jsdoc)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2272 'block))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2273 (while t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2274 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2275 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2276 ((eq c js2-EOF_CHAR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2277 (setq js2-token-end (1- js2-ts-cursor))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2278 (js2-report-error "msg.unterminated.comment")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2279 (throw 'return js2-COMMENT))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2280 ((eq c ?*)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2281 (setq look-for-slash t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2282 ((eq c ?/)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2283 (if look-for-slash
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2284 (js2-ts-return js2-COMMENT)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2285 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2286 (setq look-for-slash nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2287 js2-token-end js2-ts-cursor)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2288
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2289 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2290 (js2-ts-return js2-ASSIGN_DIV)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2291 (throw 'return js2-DIV)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2292
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2293 (?#
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2294 (when js2-skip-preprocessor-directives
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2295 (js2-skip-line)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2296 (setq js2-ts-comment-type 'preprocessor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2297 js2-token-end js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2298 (throw 'return js2-COMMENT))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2299 (throw 'return js2-ERROR))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2300
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2301 (?%
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2302 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2303 (js2-ts-return js2-ASSIGN_MOD)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2304 (throw 'return js2-MOD)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2305 (?~
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2306 (throw 'return js2-BITNOT))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2307 (?+
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2308 (if (js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2309 (js2-ts-return js2-ASSIGN_ADD)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2310 (if (js2-match-char ?+)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2311 (js2-ts-return js2-INC)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2312 (throw 'return js2-ADD))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2313 (?-
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2314 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2315 ((js2-match-char ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2316 (setq c js2-ASSIGN_SUB))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2317 ((js2-match-char ?-)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2318 (unless js2-ts-dirty-line
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2319 ;; treat HTML end-comment after possible whitespace
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2320 ;; after line start as comment-until-eol
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2321 (when (js2-match-char ?>)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2322 (js2-skip-line)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2323 (setq js2-ts-comment-type 'html)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2324 (throw 'return js2-COMMENT)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2325 (setq c js2-DEC))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2326 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2327 (setq c js2-SUB)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2328 (setq js2-ts-dirty-line t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2329 (js2-ts-return c))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2330
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2331 (otherwise
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2332 (js2-report-scan-error "msg.illegal.character")))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2333
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2334 (defun js2-read-regexp (start-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2335 "Called by parser when it gets / or /= in literal context."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2336 (let (c
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2337 err
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2338 in-class ; inside a '[' .. ']' character-class
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2339 flags
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2340 (continue t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2341 (setq js2-token-beg js2-ts-cursor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2342 js2-ts-string-buffer nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2343 js2-ts-regexp-flags nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2344
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2345 (if (eq start-token js2-ASSIGN_DIV)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2346 ;; mis-scanned /=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2347 (js2-add-to-string ?=)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2348 (if (neq start-token js2-DIV)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2349 (error "failed assertion")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2350
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2351 (while (and (not err)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2352 (or (/= (setq c (js2-get-char)) ?/)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2353 in-class))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2354 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2355 ((or (= c ?\n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2356 (= c js2-EOF_CHAR))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2357 (setq js2-token-end (1- js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2358 err t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2359 js2-ts-string (js2-collect-string js2-ts-string-buffer))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2360 (js2-report-error "msg.unterminated.re.lit"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2361 (t (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2362 ((= c ?\\)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2363 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2364 (setq c (js2-get-char)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2365
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2366 ((= c ?\[)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2367 (setq in-class t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2368
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2369 ((= c ?\])
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2370 (setq in-class nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2371 (js2-add-to-string c))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2372
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2373 (unless err
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2374 (while continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2375 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2376 ((js2-match-char ?g)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2377 (push ?g flags))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2378 ((js2-match-char ?i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2379 (push ?i flags))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2380 ((js2-match-char ?m)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2381 (push ?m flags))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2382 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2383 (setq continue nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2384 (if (js2-alpha-p (js2-peek-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2385 (js2-report-scan-error "msg.invalid.re.flag" t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2386 js2-ts-cursor 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2387 (setq js2-ts-string (js2-collect-string js2-ts-string-buffer)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2388 js2-ts-regexp-flags (js2-collect-string flags)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2389 js2-token-end js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2390 ;; tell `parse-partial-sexp' to ignore this range of chars
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2391 (put-text-property js2-token-beg js2-token-end 'syntax-class '(2)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2392
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2393 (defun js2-get-first-xml-token ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2394 (setq js2-ts-xml-open-tags-count 0
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2395 js2-ts-is-xml-attribute nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2396 js2-ts-xml-is-tag-content nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2397 (js2-unget-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2398 (js2-get-next-xml-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2399
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2400 (defsubst js2-xml-discard-string ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2401 "Throw away the string in progress and flag an XML parse error."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2402 (setq js2-ts-string-buffer nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2403 js2-ts-string nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2404 (js2-report-scan-error "msg.XML.bad.form" t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2405
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2406 (defun js2-get-next-xml-token ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2407 (setq js2-ts-string-buffer nil ; for recording the XML
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2408 js2-token-beg js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2409 (let (c result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2410 (setq result
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2411 (catch 'return
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2412 (while t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2413 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2414 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2415 ((= c js2-EOF_CHAR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2416 (throw 'return js2-ERROR))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2417
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2418 (js2-ts-xml-is-tag-content
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2419 (case c
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2420 (?>
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2421 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2422 (setq js2-ts-xml-is-tag-content nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2423 js2-ts-is-xml-attribute nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2424 (?/
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2425 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2426 (when (eq ?> (js2-peek-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2427 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2428 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2429 (setq js2-ts-xml-is-tag-content nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2430 (decf js2-ts-xml-open-tags-count)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2431 (?{
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2432 (js2-unget-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2433 (setq js2-ts-string (js2-get-string-from-buffer))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2434 (throw 'return js2-XML))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2435 ((?\' ?\")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2436 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2437 (unless (js2-read-quoted-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2438 (throw 'return js2-ERROR)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2439 (?=
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2440 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2441 (setq js2-ts-is-xml-attribute t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2442 ((? ?\t ?\r ?\n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2443 (js2-add-to-string c))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2444 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2445 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2446 (setq js2-ts-is-xml-attribute nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2447 (when (and (not js2-ts-xml-is-tag-content)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2448 (zerop js2-ts-xml-open-tags-count))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2449 (setq js2-ts-string (js2-get-string-from-buffer))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2450 (throw 'return js2-XMLEND)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2451
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2452 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2453 ;; else not tag content
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2454 (case c
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2455 (?<
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2456 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2457 (setq c (js2-peek-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2458 (case c
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2459 (?!
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2460 (setq c (js2-get-char)) ;; skip !
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2461 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2462 (setq c (js2-peek-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2463 (case c
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2464 (?-
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2465 (setq c (js2-get-char)) ;; skip -
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2466 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2467 (if (eq c ?-)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2468 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2469 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2470 (unless (js2-read-xml-comment)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2471 (throw 'return js2-ERROR)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2472 (js2-xml-discard-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2473 (throw 'return js2-ERROR)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2474 (?\[
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2475 (setq c (js2-get-char)) ;; skip [
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2476 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2477 (if (and (= (js2-get-char) ?C)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2478 (= (js2-get-char) ?D)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2479 (= (js2-get-char) ?A)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2480 (= (js2-get-char) ?T)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2481 (= (js2-get-char) ?A)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2482 (= (js2-get-char) ?\[))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2483 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2484 (js2-add-to-string ?C)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2485 (js2-add-to-string ?D)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2486 (js2-add-to-string ?A)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2487 (js2-add-to-string ?T)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2488 (js2-add-to-string ?A)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2489 (js2-add-to-string ?\[)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2490 (unless (js2-read-cdata)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2491 (throw 'return js2-ERROR)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2492 (js2-xml-discard-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2493 (throw 'return js2-ERROR)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2494 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2495 (unless (js2-read-entity)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2496 (throw 'return js2-ERROR)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2497 (??
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2498 (setq c (js2-get-char)) ;; skip ?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2499 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2500 (unless (js2-read-PI)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2501 (throw 'return js2-ERROR)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2502 (?/
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2503 ;; end tag
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2504 (setq c (js2-get-char)) ;; skip /
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2505 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2506 (when (zerop js2-ts-xml-open-tags-count)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2507 (js2-xml-discard-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2508 (throw 'return js2-ERROR))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2509 (setq js2-ts-xml-is-tag-content t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2510 (decf js2-ts-xml-open-tags-count))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2511 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2512 ;; start tag
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2513 (setq js2-ts-xml-is-tag-content t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2514 (incf js2-ts-xml-open-tags-count))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2515 (?{
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2516 (js2-unget-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2517 (setq js2-ts-string (js2-get-string-from-buffer))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2518 (throw 'return js2-XML))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2519 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2520 (js2-add-to-string c))))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2521 (setq js2-token-end js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2522 result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2523
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2524 (defun js2-read-quoted-string (quote)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2525 (let (c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2526 (catch 'return
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2527 (while (/= (setq c (js2-get-char)) js2-EOF_CHAR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2528 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2529 (if (eq c quote)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2530 (throw 'return t)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2531 (js2-xml-discard-string) ;; throw away string in progress
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2532 nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2533
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2534 (defun js2-read-xml-comment ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2535 (let ((c (js2-get-char)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2536 (catch 'return
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2537 (while (/= c js2-EOF_CHAR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2538 (catch 'continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2539 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2540 (when (and (eq c ?-) (eq ?- (js2-peek-char)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2541 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2542 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2543 (if (eq (js2-peek-char) ?>)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2544 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2545 (setq c (js2-get-char)) ;; skip >
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2546 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2547 (throw 'return t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2548 (throw 'continue nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2549 (setq c (js2-get-char))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2550 (js2-xml-discard-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2551 nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2552
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2553 (defun js2-read-cdata ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2554 (let ((c (js2-get-char)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2555 (catch 'return
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2556 (while (/= c js2-EOF_CHAR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2557 (catch 'continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2558 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2559 (when (and (eq c ?\]) (eq (js2-peek-char) ?\]))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2560 (setq c (js2-get-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2561 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2562 (if (eq (js2-peek-char) ?>)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2563 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2564 (setq c (js2-get-char)) ;; Skip >
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2565 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2566 (throw 'return t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2567 (throw 'continue nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2568 (setq c (js2-get-char))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2569 (js2-xml-discard-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2570 nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2571
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2572 (defun js2-read-entity ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2573 (let ((decl-tags 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2574 c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2575 (catch 'return
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2576 (while (/= js2-EOF_CHAR (setq c (js2-get-char)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2577 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2578 (case c
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2579 (?<
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2580 (incf decl-tags))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2581 (?>
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2582 (decf decl-tags)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2583 (if (zerop decl-tags)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2584 (throw 'return t)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2585 (js2-xml-discard-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2586 nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2587
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2588 (defun js2-read-PI ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2589 "Scan an XML processing instruction."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2590 (let (c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2591 (catch 'return
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2592 (while (/= js2-EOF_CHAR (setq c (js2-get-char)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2593 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2594 (when (and (eq c ??) (eq (js2-peek-char) ?>))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2595 (setq c (js2-get-char)) ;; Skip >
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2596 (js2-add-to-string c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2597 (throw 'return t)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2598 (js2-xml-discard-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2599 nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2600
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2601 (defun js2-scanner-get-line ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2602 "Return the text of the current scan line."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2603 (buffer-substring (point-at-bol) (point-at-eol)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2604
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2605 (provide 'js2-scan)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2606
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2607 ;;; js2-scan.el ends here
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2608 ;;; js2-messages: localizable messages for js2-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2609
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2610 ;; Author: Steve Yegge (steve.yegge@gmail.com)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2611 ;; Keywords: javascript languages
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2612
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2613 ;;; Commentary:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2614
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2615 ;; Messages are copied from Rhino's Messages.properties.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2616 ;; Many of the Java-specific messages have been elided.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2617 ;; Add any js2-specific ones at the end, so we can keep
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2618 ;; this file synced with changes to Rhino's.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2619 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2620 ;; TODO:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2621 ;; - move interpreter messages into separate file
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2622
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2623 ;;; Code:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2624
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2625 (defvar js2-message-table
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2626 (make-hash-table :test 'equal :size 250)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2627 "Contains localized messages for js2-mode.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2628
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2629 ;; TODO: construct this hashtable at compile-time.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2630 (defmacro js2-msg (key &rest strings)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2631 `(puthash ,key (funcall #'concat ,@strings)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2632 js2-message-table))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2633
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2634 (defun js2-get-msg (msg-key)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2635 "Look up a localized message.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2636 MSG-KEY is a list of (MSG ARGS). If the message takes parameters,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2637 the correct number of ARGS must be provided."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2638 (let* ((key (if (listp msg-key) (car msg-key) msg-key))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2639 (args (if (listp msg-key) (cdr msg-key)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2640 (msg (gethash key js2-message-table)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2641 (if msg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2642 (apply #'format msg args)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2643 key))) ; default to showing the key
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2644
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2645 (js2-msg "msg.dup.parms"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2646 "Duplicate parameter name '%s'.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2647
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2648 (js2-msg "msg.too.big.jump"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2649 "Program too complex: jump offset too big.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2650
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2651 (js2-msg "msg.too.big.index"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2652 "Program too complex: internal index exceeds 64K limit.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2653
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2654 (js2-msg "msg.while.compiling.fn"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2655 "Encountered code generation error while compiling function '%s': %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2656
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2657 (js2-msg "msg.while.compiling.script"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2658 "Encountered code generation error while compiling script: %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2659
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2660 ;; Context
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2661 (js2-msg "msg.ctor.not.found"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2662 "Constructor for '%s' not found.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2663
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2664 (js2-msg "msg.not.ctor"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2665 "'%s' is not a constructor.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2666
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2667 ;; FunctionObject
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2668 (js2-msg "msg.varargs.ctor"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2669 "Method or constructor '%s' must be static "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2670 "with the signature (Context cx, Object[] args, "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2671 "Function ctorObj, boolean inNewExpr) "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2672 "to define a variable arguments constructor.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2673
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2674 (js2-msg "msg.varargs.fun"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2675 "Method '%s' must be static with the signature "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2676 "(Context cx, Scriptable thisObj, Object[] args, Function funObj) "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2677 "to define a variable arguments function.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2678
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2679 (js2-msg "msg.incompat.call"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2680 "Method '%s' called on incompatible object.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2681
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2682 (js2-msg "msg.bad.parms"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2683 "Unsupported parameter type '%s' in method '%s'.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2684
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2685 (js2-msg "msg.bad.method.return"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2686 "Unsupported return type '%s' in method '%s'.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2687
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2688 (js2-msg "msg.bad.ctor.return"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2689 "Construction of objects of type '%s' is not supported.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2690
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2691 (js2-msg "msg.no.overload"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2692 "Method '%s' occurs multiple times in class '%s'.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2693
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2694 (js2-msg "msg.method.not.found"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2695 "Method '%s' not found in '%s'.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2696
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2697 ;; IRFactory
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2698
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2699 (js2-msg "msg.bad.for.in.lhs"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2700 "Invalid left-hand side of for..in loop.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2701
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2702 (js2-msg "msg.mult.index"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2703 "Only one variable allowed in for..in loop.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2704
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2705 (js2-msg "msg.bad.for.in.destruct"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2706 "Left hand side of for..in loop must be an array of "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2707 "length 2 to accept key/value pair.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2708
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2709 (js2-msg "msg.cant.convert"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2710 "Can't convert to type '%s'.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2711
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2712 (js2-msg "msg.bad.assign.left"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2713 "Invalid assignment left-hand side.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2714
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2715 (js2-msg "msg.bad.decr"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2716 "Invalid decerement operand.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2717
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2718 (js2-msg "msg.bad.incr"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2719 "Invalid increment operand.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2720
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2721 (js2-msg "msg.bad.yield"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2722 "yield must be in a function.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2723
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2724 (js2-msg "msg.yield.parenthesized"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2725 "yield expression must be parenthesized.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2726
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2727 ;; NativeGlobal
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2728 (js2-msg "msg.cant.call.indirect"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2729 "Function '%s' must be called directly, and not by way of a "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2730 "function of another name.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2731
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2732 (js2-msg "msg.eval.nonstring"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2733 "Calling eval() with anything other than a primitive "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2734 "string value will simply return the value. "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2735 "Is this what you intended?")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2736
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2737 (js2-msg "msg.eval.nonstring.strict"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2738 "Calling eval() with anything other than a primitive "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2739 "string value is not allowed in strict mode.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2740
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2741 (js2-msg "msg.bad.destruct.op"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2742 "Invalid destructuring assignment operator")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2743
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2744 ;; NativeCall
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2745 (js2-msg "msg.only.from.new"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2746 "'%s' may only be invoked from a `new' expression.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2747
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2748 (js2-msg "msg.deprec.ctor"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2749 "The '%s' constructor is deprecated.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2750
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2751 ;; NativeFunction
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2752 (js2-msg "msg.no.function.ref.found"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2753 "no source found to decompile function reference %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2754
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2755 (js2-msg "msg.arg.isnt.array"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2756 "second argument to Function.prototype.apply must be an array")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2757
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2758 ;; NativeGlobal
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2759 (js2-msg "msg.bad.esc.mask"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2760 "invalid string escape mask")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2761
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2762 ;; NativeRegExp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2763 (js2-msg "msg.bad.quant"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2764 "Invalid quantifier %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2765
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2766 (js2-msg "msg.overlarge.backref"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2767 "Overly large back reference %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2768
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2769 (js2-msg "msg.overlarge.min"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2770 "Overly large minimum %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2771
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2772 (js2-msg "msg.overlarge.max"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2773 "Overly large maximum %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2774
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2775 (js2-msg "msg.zero.quant"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2776 "Zero quantifier %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2777
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2778 (js2-msg "msg.max.lt.min"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2779 "Maximum %s less than minimum")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2780
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2781 (js2-msg "msg.unterm.quant"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2782 "Unterminated quantifier %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2783
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2784 (js2-msg "msg.unterm.paren"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2785 "Unterminated parenthetical %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2786
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2787 (js2-msg "msg.unterm.class"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2788 "Unterminated character class %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2789
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2790 (js2-msg "msg.bad.range"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2791 "Invalid range in character class.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2792
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2793 (js2-msg "msg.trail.backslash"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2794 "Trailing \\ in regular expression.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2795
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2796 (js2-msg "msg.re.unmatched.right.paren"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2797 "unmatched ) in regular expression.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2798
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2799 (js2-msg "msg.no.regexp"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2800 "Regular expressions are not available.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2801
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2802 (js2-msg "msg.bad.backref"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2803 "back-reference exceeds number of capturing parentheses.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2804
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2805 (js2-msg "msg.bad.regexp.compile"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2806 "Only one argument may be specified if the first "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2807 "argument to RegExp.prototype.compile is a RegExp object.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2808
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2809 ;; Parser
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2810 (js2-msg "msg.got.syntax.errors"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2811 "Compilation produced %s syntax errors.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2812
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2813 (js2-msg "msg.var.redecl"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2814 "TypeError: redeclaration of var %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2815
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2816 (js2-msg "msg.const.redecl"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2817 "TypeError: redeclaration of const %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2818
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2819 (js2-msg "msg.let.redecl"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2820 "TypeError: redeclaration of variable %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2821
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2822 (js2-msg "msg.parm.redecl"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2823 "TypeError: redeclaration of formal parameter %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2824
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2825 (js2-msg "msg.fn.redecl"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2826 "TypeError: redeclaration of function %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2827
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2828 (js2-msg "msg.let.decl.not.in.block"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2829 "SyntaxError: let declaration not directly within block")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2830
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2831 ;; NodeTransformer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2832 (js2-msg "msg.dup.label"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2833 "duplicated label")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2834
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2835 (js2-msg "msg.undef.label"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2836 "undefined label")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2837
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2838 (js2-msg "msg.bad.break"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2839 "unlabelled break must be inside loop or switch")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2840
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2841 (js2-msg "msg.continue.outside"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2842 "continue must be inside loop")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2843
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2844 (js2-msg "msg.continue.nonloop"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2845 "continue can only use labels of iteration statements")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2846
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2847 (js2-msg "msg.bad.throw.eol"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2848 "Line terminator is not allowed between the throw "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2849 "keyword and throw expression.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2850
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2851 (js2-msg "msg.no.paren.parms"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2852 "missing ( before function parameters.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2853
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2854 (js2-msg "msg.no.parm"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2855 "missing formal parameter")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2856
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2857 (js2-msg "msg.no.paren.after.parms"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2858 "missing ) after formal parameters")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2859
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2860 (js2-msg "msg.no.brace.body"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2861 "missing '{' before function body")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2862
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2863 (js2-msg "msg.no.brace.after.body"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2864 "missing } after function body")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2865
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2866 (js2-msg "msg.no.paren.cond"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2867 "missing ( before condition")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2868
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2869 (js2-msg "msg.no.paren.after.cond"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2870 "missing ) after condition")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2871
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2872 (js2-msg "msg.no.semi.stmt"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2873 "missing ; before statement")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2874
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2875 (js2-msg "msg.missing.semi"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2876 "missing ; after statement")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2877
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2878 (js2-msg "msg.no.name.after.dot"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2879 "missing name after . operator")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2880
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2881 (js2-msg "msg.no.name.after.coloncolon"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2882 "missing name after :: operator")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2883
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2884 (js2-msg "msg.no.name.after.dotdot"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2885 "missing name after .. operator")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2886
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2887 (js2-msg "msg.no.name.after.xmlAttr"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2888 "missing name after .@")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2889
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2890 (js2-msg "msg.no.bracket.index"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2891 "missing ] in index expression")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2892
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2893 (js2-msg "msg.no.paren.switch"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2894 "missing ( before switch expression")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2895
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2896 (js2-msg "msg.no.paren.after.switch"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2897 "missing ) after switch expression")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2898
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2899 (js2-msg "msg.no.brace.switch"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2900 "missing '{' before switch body")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2901
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2902 (js2-msg "msg.bad.switch"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2903 "invalid switch statement")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2904
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2905 (js2-msg "msg.no.colon.case"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2906 "missing : after case expression")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2907
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2908 (js2-msg "msg.double.switch.default"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2909 "double default label in the switch statement")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2910
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2911 (js2-msg "msg.no.while.do"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2912 "missing while after do-loop body")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2913
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2914 (js2-msg "msg.no.paren.for"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2915 "missing ( after for")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2916
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2917 (js2-msg "msg.no.semi.for"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2918 "missing ; after for-loop initializer")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2919
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2920 (js2-msg "msg.no.semi.for.cond"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2921 "missing ; after for-loop condition")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2922
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2923 (js2-msg "msg.in.after.for.name"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2924 "missing in after for")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2925
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2926 (js2-msg "msg.no.paren.for.ctrl"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2927 "missing ) after for-loop control")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2928
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2929 (js2-msg "msg.no.paren.with"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2930 "missing ( before with-statement object")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2931
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2932 (js2-msg "msg.no.paren.after.with"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2933 "missing ) after with-statement object")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2934
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2935 (js2-msg "msg.no.paren.after.let"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2936 "missing ( after let")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2937
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2938 (js2-msg "msg.no.paren.let"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2939 "missing ) after variable list")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2940
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2941 (js2-msg "msg.no.curly.let"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2942 "missing } after let statement")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2943
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2944 (js2-msg "msg.bad.return"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2945 "invalid return")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2946
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2947 (js2-msg "msg.no.brace.block"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2948 "missing } in compound statement")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2949
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2950 (js2-msg "msg.bad.label"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2951 "invalid label")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2952
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2953 (js2-msg "msg.bad.var"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2954 "missing variable name")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2955
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2956 (js2-msg "msg.bad.var.init"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2957 "invalid variable initialization")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2958
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2959 (js2-msg "msg.no.colon.cond"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2960 "missing : in conditional expression")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2961
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2962 (js2-msg "msg.no.paren.arg"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2963 "missing ) after argument list")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2964
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2965 (js2-msg "msg.no.bracket.arg"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2966 "missing ] after element list")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2967
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2968 (js2-msg "msg.bad.prop"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2969 "invalid property id")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2970
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2971 (js2-msg "msg.no.colon.prop"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2972 "missing : after property id")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2973
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2974 (js2-msg "msg.no.brace.prop"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2975 "missing } after property list")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2976
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2977 (js2-msg "msg.no.paren"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2978 "missing ) in parenthetical")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2979
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2980 (js2-msg "msg.reserved.id"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2981 "identifier is a reserved word")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2982
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2983 (js2-msg "msg.no.paren.catch"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2984 "missing ( before catch-block condition")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2985
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2986 (js2-msg "msg.bad.catchcond"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2987 "invalid catch block condition")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2988
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2989 (js2-msg "msg.catch.unreachable"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2990 "any catch clauses following an unqualified catch are unreachable")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2991
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2992 (js2-msg "msg.no.brace.try"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2993 "missing '{' before try block")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2994
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2995 (js2-msg "msg.no.brace.catchblock"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2996 "missing '{' before catch-block body")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2997
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2998 (js2-msg "msg.try.no.catchfinally"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2999 "'try' without 'catch' or 'finally'")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3000
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3001 (js2-msg "msg.no.return.value"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3002 "function %s does not always return a value")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3003
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3004 (js2-msg "msg.anon.no.return.value"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3005 "anonymous function does not always return a value")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3006
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3007 (js2-msg "msg.return.inconsistent"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3008 "return statement is inconsistent with previous usage")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3009
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3010 (js2-msg "msg.generator.returns"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3011 "TypeError: generator function '%s' returns a value")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3012
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3013 (js2-msg "msg.anon.generator.returns"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3014 "TypeError: anonymous generator function returns a value")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3015
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3016 (js2-msg "msg.syntax"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3017 "syntax error")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3018
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3019 (js2-msg "msg.unexpected.eof"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3020 "Unexpected end of file")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3021
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3022 (js2-msg "msg.XML.bad.form"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3023 "illegally formed XML syntax")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3024
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3025 (js2-msg "msg.XML.not.available"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3026 "XML runtime not available")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3027
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3028 (js2-msg "msg.too.deep.parser.recursion"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3029 "Too deep recursion while parsing")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3030
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3031 (js2-msg "msg.no.side.effects"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3032 "Code has no side effects")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3033
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3034 (js2-msg "msg.extra.trailing.comma"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3035 "Trailing comma is not legal in an ECMA-262 object initializer")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3036
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3037 (js2-msg "msg.array.trailing.comma"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3038 "Trailing comma yields different behavior across browsers")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3039
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3040 (js2-msg "msg.equal.as.assign"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3041 (concat "Test for equality (==) mistyped as assignment (=)?"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3042 " (parenthesize to suppress warning)"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3043
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3044 (js2-msg "msg.var.hides.arg"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3045 "Variable %s hides argument")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3046
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3047 (js2-msg "msg.destruct.assign.no.init"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3048 "Missing = in destructuring declaration")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3049
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3050 ;; ScriptRuntime
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3051 (js2-msg "msg.no.properties"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3052 "%s has no properties.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3053
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3054 (js2-msg "msg.invalid.iterator"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3055 "Invalid iterator value")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3056
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3057 (js2-msg "msg.iterator.primitive"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3058 "__iterator__ returned a primitive value")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3059
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3060 (js2-msg "msg.assn.create.strict"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3061 "Assignment to undeclared variable %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3062
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3063 (js2-msg "msg.ref.undefined.prop"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3064 "Reference to undefined property '%s'")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3065
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3066 (js2-msg "msg.prop.not.found"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3067 "Property %s not found.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3068
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3069 (js2-msg "msg.invalid.type"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3070 "Invalid JavaScript value of type %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3071
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3072 (js2-msg "msg.primitive.expected"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3073 "Primitive type expected (had %s instead)")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3074
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3075 (js2-msg "msg.namespace.expected"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3076 "Namespace object expected to left of :: (found %s instead)")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3077
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3078 (js2-msg "msg.null.to.object"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3079 "Cannot convert null to an object.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3080
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3081 (js2-msg "msg.undef.to.object"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3082 "Cannot convert undefined to an object.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3083
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3084 (js2-msg "msg.cyclic.value"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3085 "Cyclic %s value not allowed.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3086
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3087 (js2-msg "msg.is.not.defined"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3088 "'%s' is not defined.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3089
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3090 (js2-msg "msg.undef.prop.read"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3091 "Cannot read property '%s' from %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3092
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3093 (js2-msg "msg.undef.prop.write"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3094 "Cannot set property '%s' of %s to '%s'")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3095
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3096 (js2-msg "msg.undef.prop.delete"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3097 "Cannot delete property '%s' of %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3098
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3099 (js2-msg "msg.undef.method.call"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3100 "Cannot call method '%s' of %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3101
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3102 (js2-msg "msg.undef.with"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3103 "Cannot apply 'with' to %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3104
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3105 (js2-msg "msg.isnt.function"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3106 "%s is not a function, it is %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3107
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3108 (js2-msg "msg.isnt.function.in"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3109 "Cannot call property %s in object %s. "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3110 "It is not a function, it is '%s'.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3111
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3112 (js2-msg "msg.function.not.found"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3113 "Cannot find function %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3114
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3115 (js2-msg "msg.function.not.found.in"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3116 "Cannot find function %s in object %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3117
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3118 (js2-msg "msg.isnt.xml.object"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3119 "%s is not an xml object.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3120
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3121 (js2-msg "msg.no.ref.to.get"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3122 "%s is not a reference to read reference value.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3123
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3124 (js2-msg "msg.no.ref.to.set"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3125 "%s is not a reference to set reference value to %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3126
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3127 (js2-msg "msg.no.ref.from.function"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3128 "Function %s can not be used as the left-hand "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3129 "side of assignment or as an operand of ++ or -- operator.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3130
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3131 (js2-msg "msg.bad.default.value"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3132 "Object's getDefaultValue() method returned an object.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3133
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3134 (js2-msg "msg.instanceof.not.object"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3135 "Can't use instanceof on a non-object.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3136
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3137 (js2-msg "msg.instanceof.bad.prototype"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3138 "'prototype' property of %s is not an object.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3139
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3140 (js2-msg "msg.bad.radix"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3141 "illegal radix %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3142
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3143 ;; ScriptableObject
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3144 (js2-msg "msg.default.value"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3145 "Cannot find default value for object.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3146
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3147 (js2-msg "msg.zero.arg.ctor"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3148 "Cannot load class '%s' which has no zero-parameter constructor.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3149
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3150 (js2-msg "msg.ctor.multiple.parms"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3151 "Can't define constructor or class %s since more than "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3152 "one constructor has multiple parameters.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3153
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3154 (js2-msg "msg.extend.scriptable"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3155 "%s must extend ScriptableObject in order to define property %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3156
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3157 (js2-msg "msg.bad.getter.parms"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3158 "In order to define a property, getter %s must have zero "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3159 "parameters or a single ScriptableObject parameter.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3160
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3161 (js2-msg "msg.obj.getter.parms"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3162 "Expected static or delegated getter %s to take "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3163 "a ScriptableObject parameter.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3164
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3165 (js2-msg "msg.getter.static"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3166 "Getter and setter must both be static or neither be static.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3167
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3168 (js2-msg "msg.setter.return"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3169 "Setter must have void return type: %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3170
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3171 (js2-msg "msg.setter2.parms"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3172 "Two-parameter setter must take a ScriptableObject as "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3173 "its first parameter.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3174
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3175 (js2-msg "msg.setter1.parms"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3176 "Expected single parameter setter for %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3177
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3178 (js2-msg "msg.setter2.expected"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3179 "Expected static or delegated setter %s to take two parameters.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3180
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3181 (js2-msg "msg.setter.parms"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3182 "Expected either one or two parameters for setter.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3183
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3184 (js2-msg "msg.setter.bad.type"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3185 "Unsupported parameter type '%s' in setter '%s'.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3186
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3187 (js2-msg "msg.add.sealed"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3188 "Cannot add a property to a sealed object: %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3189
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3190 (js2-msg "msg.remove.sealed"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3191 "Cannot remove a property from a sealed object: %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3192
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3193 (js2-msg "msg.modify.sealed"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3194 "Cannot modify a property of a sealed object: %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3195
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3196 (js2-msg "msg.modify.readonly"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3197 "Cannot modify readonly property: %s.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3198
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3199 ;; TokenStream
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3200 (js2-msg "msg.missing.exponent"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3201 "missing exponent")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3202
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3203 (js2-msg "msg.caught.nfe"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3204 "number format error")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3205
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3206 (js2-msg "msg.unterminated.string.lit"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3207 "unterminated string literal")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3208
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3209 (js2-msg "msg.unterminated.comment"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3210 "unterminated comment")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3211
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3212 (js2-msg "msg.unterminated.re.lit"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3213 "unterminated regular expression literal")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3214
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3215 (js2-msg "msg.invalid.re.flag"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3216 "invalid flag after regular expression")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3217
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3218 (js2-msg "msg.no.re.input.for"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3219 "no input for %s")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3220
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3221 (js2-msg "msg.illegal.character"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3222 "illegal character")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3223
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3224 (js2-msg "msg.invalid.escape"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3225 "invalid Unicode escape sequence")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3226
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3227 (js2-msg "msg.bad.namespace"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3228 "not a valid default namespace statement. "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3229 "Syntax is: default xml namespace = EXPRESSION;")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3230
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3231 ;; TokensStream warnings
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3232 (js2-msg "msg.bad.octal.literal"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3233 "illegal octal literal digit %s; "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3234 "interpreting it as a decimal digit")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3235
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3236 (js2-msg "msg.reserved.keyword"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3237 "illegal usage of future reserved keyword %s; "
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3238 "interpreting it as ordinary identifier")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3239
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3240 (js2-msg "msg.script.is.not.constructor"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3241 "Script objects are not constructors.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3242
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3243 ;; Arrays
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3244 (js2-msg "msg.arraylength.bad"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3245 "Inappropriate array length.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3246
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3247 ;; Arrays
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3248 (js2-msg "msg.arraylength.too.big"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3249 "Array length %s exceeds supported capacity limit.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3250
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3251 ;; URI
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3252 (js2-msg "msg.bad.uri"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3253 "Malformed URI sequence.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3254
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3255 ;; Number
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3256 (js2-msg "msg.bad.precision"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3257 "Precision %s out of range.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3258
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3259 ;; NativeGenerator
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3260 (js2-msg "msg.send.newborn"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3261 "Attempt to send value to newborn generator")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3262
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3263 (js2-msg "msg.already.exec.gen"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3264 "Already executing generator")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3265
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3266 (js2-msg "msg.StopIteration.invalid"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3267 "StopIteration may not be changed to an arbitrary object.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3268
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3269 ;; Interpreter
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3270 (js2-msg "msg.yield.closing"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3271 "Yield from closing generator")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3272
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3273 (provide 'js2-messages)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3274 ;;; js2-ast.el --- JavaScript syntax tree node definitions
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3275
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3276 ;; Author: Steve Yegge (steve.yegge@gmail.com)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3277 ;; Keywords: javascript languages
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3278
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3279 ;;; Code:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3280
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3281 (eval-and-compile
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3282 (require 'cl))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3283
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3284
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3285 ;; flags for ast node property 'member-type (used for e4x operators)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3286 (defvar js2-property-flag #x1 "property access: element is valid name")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3287 (defvar js2-attribute-flag #x2 "x.@y or x..@y")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3288 (defvar js2-descendants-flag #x4 "x..y or x..@i")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3289
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3290 (defsubst js2-relpos (pos anchor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3291 "Convert POS to be relative to ANCHOR.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3292 If POS is nil, returns nil."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3293 (and pos (- pos anchor)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3294
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3295 (defsubst js2-make-pad (indent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3296 (if (zerop indent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3297 ""
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3298 (make-string (* indent js2-basic-offset) ? )))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3299
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3300 (defsubst js2-visit-ast (node callback)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3301 "Visit every node in ast NODE with visitor CALLBACK.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3302
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3303 CALLBACK is a function that takes two arguments: (NODE END-P). It is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3304 called twice: once to visit the node, and again after all the node's
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3305 children have been processed. The END-P argument is nil on the first
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3306 call and non-nil on the second call. The return value of the callback
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3307 affects the traversal: if non-nil, the children of NODE are processed.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3308 If the callback returns nil, or if the node has no children, then the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3309 callback is called immediately with a non-nil END-P argument.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3310
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3311 The node traversal is approximately lexical-order, although there
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3312 are currently no guarantees around this."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3313 (let ((vfunc (get (aref node 0) 'js2-visitor)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3314 ;; visit the node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3315 (when (funcall callback node nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3316 ;; visit the kids
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3317 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3318 ((eq vfunc 'js2-visit-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3319 nil) ; don't even bother calling it
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3320 ;; Each AST node type has to define a `js2-visitor' function
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3321 ;; that takes a node and a callback, and calls `js2-visit-ast'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3322 ;; on each child of the node.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3323 (vfunc
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3324 (funcall vfunc node callback))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3325 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3326 (error "%s does not define a visitor-traversal function"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3327 (aref node 0)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3328 ;; call the end-visit
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3329 (funcall callback node t)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3330
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3331 (defstruct (js2-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3332 (:constructor nil)) ; abstract
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3333 "Base AST node type."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3334 (type -1) ; token type
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3335 (pos -1) ; start position of this AST node in parsed input
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3336 (len 1) ; num characters spanned by the node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3337 props ; optional node property list (an alist)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3338 parent) ; link to parent node; null for root
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3339
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3340 (defsubst js2-node-get-prop (node prop &optional default)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3341 (or (cadr (assoc prop (js2-node-props node))) default))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3342
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3343 (defsubst js2-node-set-prop (node prop value)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3344 (setf (js2-node-props node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3345 (cons (list prop value) (js2-node-props node))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3346
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3347 (defsubst js2-fixup-starts (n nodes)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3348 "Adjust the start positions of NODES to be relative to N.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3349 Any node in the list may be nil, for convenience."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3350 (dolist (node nodes)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3351 (when node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3352 (setf (js2-node-pos node) (- (js2-node-pos node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3353 (js2-node-pos n))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3354
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3355 (defsubst js2-node-add-children (parent &rest nodes)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3356 "Set parent node of NODES to PARENT, and return PARENT.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3357 Does nothing if we're not recording parent links.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3358 If any given node in NODES is nil, doesn't record that link."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3359 (js2-fixup-starts parent nodes)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3360 (dolist (node nodes)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3361 (and node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3362 (setf (js2-node-parent node) parent))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3363
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3364 ;; Non-recursive since it's called a frightening number of times.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3365 (defsubst js2-node-abs-pos (n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3366 (let ((pos (js2-node-pos n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3367 (while (setq n (js2-node-parent n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3368 (setq pos (+ pos (js2-node-pos n))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3369 pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3370
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3371 (defsubst js2-node-abs-end (n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3372 "Return absolute buffer position of end of N."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3373 (+ (js2-node-abs-pos n) (js2-node-len n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3374
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3375 ;; It's important to make sure block nodes have a lisp list for the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3376 ;; child nodes, to limit printing recursion depth in an AST that
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3377 ;; otherwise consists of defstruct vectors. Emacs will crash printing
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3378 ;; a sufficiently large vector tree.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3379
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3380 (defstruct (js2-block-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3381 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3382 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3383 (:constructor make-js2-block-node (&key (type js2-BLOCK)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3384 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3385 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3386 props
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3387 kids)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3388 "A block of statements."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3389 kids) ; a lisp list of the child statement nodes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3390
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3391 (put 'cl-struct-js2-block-node 'js2-visitor 'js2-visit-block)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3392 (put 'cl-struct-js2-block-node 'js2-printer 'js2-print-block)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3393
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3394 (defsubst js2-visit-block (ast callback)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3395 "Visit the `js2-block-node' children of AST."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3396 (dolist (kid (js2-block-node-kids ast))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3397 (js2-visit-ast kid callback)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3398
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3399 (defun js2-print-block (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3400 (let ((pad (js2-make-pad i)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3401 (insert pad "{\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3402 (dolist (kid (js2-block-node-kids n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3403 (js2-print-ast kid (1+ i)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3404 (insert pad "}")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3405
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3406 (defstruct (js2-scope
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3407 (:include js2-block-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3408 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3409 (:constructor make-js2-scope (&key (type js2-BLOCK)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3410 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3411 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3412 kids)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3413 ;; The symbol-table is a LinkedHashMap<String,Symbol> in Rhino.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3414 ;; I don't have one of those handy, so I'll use an alist for now.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3415 ;; It's as fast as an emacs hashtable for up to about 50 elements,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3416 ;; and is much lighter-weight to construct (both CPU and mem).
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3417 ;; The keys are interned strings (symbols) for faster lookup.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3418 ;; Should switch to hybrid alist/hashtable eventually.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3419 symbol-table ; an alist of (symbol . js2-symbol)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3420 parent-scope ; a `js2-scope'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3421 top) ; top-level `js2-scope' (script/function)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3422
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3423 (put 'cl-struct-js2-scope 'js2-visitor 'js2-visit-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3424 (put 'cl-struct-js2-scope 'js2-printer 'js2-print-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3425
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3426 (defun js2-scope-set-parent-scope (scope parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3427 (setf (js2-scope-parent-scope scope) parent
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3428 (js2-scope-top scope) (if (null parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3429 scope
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3430 (js2-scope-top parent))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3431
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3432 (defun js2-node-get-enclosing-scope (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3433 "Return the innermost `js2-scope' node surrounding NODE.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3434 Returns nil if there is no enclosing scope node."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3435 (let ((parent (js2-node-parent node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3436 (while (not (js2-scope-p parent))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3437 (setq parent (js2-node-parent parent)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3438 parent))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3439
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3440 (defun js2-get-defining-scope (scope name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3441 "Search up scope chain from SCOPE looking for NAME, a string or symbol.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3442 Returns `js2-scope' in which NAME is defined, or nil if not found."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3443 (let ((sym (if (symbolp name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3444 name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3445 (intern name)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3446 table
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3447 result
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3448 (continue t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3449 (while (and scope continue)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3450 (if (and (setq table (js2-scope-symbol-table scope))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3451 (assq sym table))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3452 (setq continue nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3453 result scope)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3454 (setq scope (js2-scope-parent-scope scope))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3455 result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3456
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3457 (defsubst js2-scope-get-symbol (scope name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3458 "Return symbol table entry for NAME in SCOPE.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3459 NAME can be a string or symbol. Returns a `js2-symbol' or nil if not found."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3460 (and (js2-scope-symbol-table scope)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3461 (cdr (assq (if (symbolp name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3462 name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3463 (intern name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3464 (js2-scope-symbol-table scope)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3465
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3466 (defsubst js2-scope-put-symbol (scope name symbol)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3467 "Enter SYMBOL into symbol-table for SCOPE under NAME.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3468 NAME can be a lisp symbol or string. SYMBOL is a `js2-symbol'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3469 (let* ((table (js2-scope-symbol-table scope))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3470 (sym (if (symbolp name) name (intern name)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3471 (entry (assq sym table)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3472 (if entry
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3473 (setcdr entry symbol)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3474 (push (cons sym symbol)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3475 (js2-scope-symbol-table scope)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3476
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3477 (defstruct (js2-symbol
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3478 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3479 (:constructor make-js2-symbol (decl-type name &optional ast-node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3480 "A symbol table entry."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3481 ;; One of js2-FUNCTION, js2-LP (for parameters), js2-VAR,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3482 ;; js2-LET, or js2-CONST
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3483 decl-type
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3484 name ; string
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3485 ast-node) ; a `js2-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3486
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3487 (defstruct (js2-error-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3488 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3489 (:constructor nil) ; silence emacs21 byte-compiler
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3490 (:constructor make-js2-error-node (&key (type js2-ERROR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3491 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3492 len)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3493 "AST node representing a parse error.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3494
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3495 (put 'cl-struct-js2-error-node 'js2-visitor 'js2-visit-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3496 (put 'cl-struct-js2-error-node 'js2-printer 'js2-print-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3497
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3498 (defstruct (js2-script-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3499 (:include js2-scope)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3500 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3501 (:constructor make-js2-script-node (&key (type js2-SCRIPT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3502 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3503 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3504 var-decls
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3505 fun-decls)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3506 functions ; lisp list of nested functions
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3507 regexps ; lisp list of (string . flags)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3508 symbols ; alist (every symbol gets unique index)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3509 (param-count 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3510 var-names ; vector of string names
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3511 consts ; bool-vector matching var-decls
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3512 (temp-number 0)) ; for generating temp variables
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3513
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3514 (put 'cl-struct-js2-script-node 'js2-visitor 'js2-visit-block)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3515 (put 'cl-struct-js2-script-node 'js2-printer 'js2-print-script)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3516
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3517 (defun js2-print-script (node indent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3518 (dolist (kid (js2-block-node-kids node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3519 (js2-print-ast kid indent)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3520
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3521 (defstruct (js2-ast-root
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3522 (:include js2-script-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3523 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3524 (:constructor make-js2-ast-root (&key (type js2-SCRIPT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3525 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3526 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3527 buffer)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3528 "The root node of a js2 AST."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3529 buffer ; the source buffer from which the code was parsed
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3530 comments ; a lisp list of comments, ordered by start position
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3531 errors ; a lisp list of errors found during parsing
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3532 warnings ; a lisp list of warnings found during parsing
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3533 node-count) ; number of nodes in the tree, including the root
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3534
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3535 (put 'cl-struct-js2-ast-root 'js2-visitor 'js2-visit-ast-root)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3536 (put 'cl-struct-js2-ast-root 'js2-printer 'js2-print-script)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3537
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3538 (defun js2-visit-ast-root (ast callback)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3539 (dolist (kid (js2-ast-root-kids ast))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3540 (js2-visit-ast kid callback))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3541 (dolist (comment (js2-ast-root-comments ast))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3542 (js2-visit-ast comment callback)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3543
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3544 (defstruct (js2-comment-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3545 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3546 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3547 (:constructor make-js2-comment-node (&key (type js2-COMMENT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3548 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3549 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3550 (format js2-ts-comment-type))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3551 format) ; 'line, 'block, 'jsdoc or 'html
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3552
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3553 (put 'cl-struct-js2-comment-node 'js2-visitor 'js2-visit-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3554 (put 'cl-struct-js2-comment-node 'js2-printer 'js2-print-comment)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3555
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3556 (defun js2-print-comment (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3557 ;; We really ought to link end-of-line comments to their nodes.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3558 ;; Or maybe we could add a new comment type, 'endline.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3559 (insert (js2-make-pad i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3560 (js2-node-string n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3561
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3562 (defstruct (js2-expr-stmt-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3563 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3564 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3565 (:constructor make-js2-expr-stmt-node (&key (type js2-EXPR_VOID)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3566 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3567 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3568 expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3569 "An expression statement."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3570 expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3571
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3572 (defsubst js2-expr-stmt-node-set-has-result (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3573 "Change the node type to `js2-EXPR_RESULT'. Used for code generation."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3574 (setf (js2-node-type node) js2-EXPR_RESULT))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3575
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3576 (put 'cl-struct-js2-expr-stmt-node 'js2-visitor 'js2-visit-expr-stmt-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3577 (put 'cl-struct-js2-expr-stmt-node 'js2-printer 'js2-print-expr-stmt-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3578
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3579 (defun js2-visit-expr-stmt-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3580 (js2-visit-ast (js2-expr-stmt-node-expr n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3581
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3582 (defun js2-print-expr-stmt-node (n indent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3583 (js2-print-ast (js2-expr-stmt-node-expr n) indent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3584 (insert ";\n"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3585
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3586 (defstruct (js2-loop-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3587 (:include js2-scope)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3588 (:constructor nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3589 "Abstract supertype of loop nodes."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3590 body ; a `js2-block-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3591 lp ; position of left-paren, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3592 rp) ; position of right-paren, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3593
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3594 (defstruct (js2-do-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3595 (:include js2-loop-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3596 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3597 (:constructor make-js2-do-node (&key (type js2-DO)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3598 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3599 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3600 body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3601 condition
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3602 while-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3603 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3604 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3605 "AST node for do-loop."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3606 condition ; while (expression)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3607 while-pos) ; buffer position of 'while' keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3608
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3609 (put 'cl-struct-js2-do-node 'js2-visitor 'js2-visit-do-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3610 (put 'cl-struct-js2-do-node 'js2-printer 'js2-print-do-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3611
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3612 (defun js2-visit-do-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3613 (js2-visit-ast (js2-do-node-body n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3614 (js2-visit-ast (js2-do-node-condition n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3615
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3616 (defun js2-print-do-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3617 (let ((pad (js2-make-pad i)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3618 (insert pad "do {\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3619 (dolist (kid (js2-block-node-kids (js2-do-node-body n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3620 (js2-print-ast kid (1+ i)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3621 (insert pad "} while (")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3622 (js2-print-ast (js2-do-node-condition n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3623 (insert ");\n")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3624
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3625 (defstruct (js2-while-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3626 (:include js2-loop-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3627 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3628 (:constructor make-js2-while-node (&key (type js2-WHILE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3629 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3630 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3631 body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3632 condition
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3633 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3634 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3635 "AST node for while-loop."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3636 condition) ; while-condition
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3637
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3638 (put 'cl-struct-js2-while-node 'js2-visitor 'js2-visit-while-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3639 (put 'cl-struct-js2-while-node 'js2-printer 'js2-print-while-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3640
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3641 (defun js2-visit-while-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3642 (js2-visit-ast (js2-while-node-condition n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3643 (js2-visit-ast (js2-while-node-body n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3644
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3645 (defun js2-print-while-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3646 (let ((pad (js2-make-pad i)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3647 (insert pad "while (")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3648 (js2-print-ast (js2-while-node-condition n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3649 (insert ") {\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3650 (js2-print-body (js2-while-node-body n) (1+ i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3651 (insert pad "}\n")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3652
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3653 (defstruct (js2-for-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3654 (:include js2-loop-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3655 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3656 (:constructor make-js2-for-node (&key (type js2-FOR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3657 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3658 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3659 body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3660 init
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3661 condition
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3662 update
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3663 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3664 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3665 "AST node for a C-style for-loop."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3666 init ; initialization expression
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3667 condition ; loop condition
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3668 update) ; update clause
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3669
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3670 (put 'cl-struct-js2-for-node 'js2-visitor 'js2-visit-for-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3671 (put 'cl-struct-js2-for-node 'js2-printer 'js2-print-for-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3672
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3673 (defun js2-visit-for-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3674 (js2-visit-ast (js2-for-node-init n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3675 (js2-visit-ast (js2-for-node-condition n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3676 (js2-visit-ast (js2-for-node-update n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3677 (js2-visit-ast (js2-for-node-body n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3678
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3679 (defun js2-print-for-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3680 (let ((pad (js2-make-pad i)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3681 (insert pad "for (")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3682 (js2-print-ast (js2-for-node-init n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3683 (insert "; ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3684 (js2-print-ast (js2-for-node-condition n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3685 (insert "; ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3686 (js2-print-ast (js2-for-node-update n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3687 (insert ") {\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3688 (js2-print-body (js2-for-node-body n) (1+ i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3689 (insert pad "}\n")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3690
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3691 (defstruct (js2-for-in-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3692 (:include js2-loop-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3693 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3694 (:constructor make-js2-for-in-node (&key (type js2-FOR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3695 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3696 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3697 body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3698 iterator
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3699 object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3700 in-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3701 each-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3702 foreach-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3703 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3704 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3705 "AST node for a for..in loop."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3706 iterator ; [var] foo in ...
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3707 object ; object over which we're iterating
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3708 in-pos ; buffer position of 'in' keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3709 each-pos ; buffer position of 'each' keyword, if foreach-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3710 foreach-p) ; t if it's a for-each loop
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3711
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3712 (put 'cl-struct-js2-for-in-node 'js2-visitor 'js2-visit-for-in-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3713 (put 'cl-struct-js2-for-in-node 'js2-printer 'js2-print-for-in-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3714
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3715 (defun js2-visit-for-in-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3716 (js2-visit-ast (js2-for-in-node-iterator n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3717 (js2-visit-ast (js2-for-in-node-object n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3718 (js2-visit-ast (js2-for-in-node-body n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3719
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3720 (defun js2-print-for-in-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3721 (let ((pad (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3722 (foreach (js2-for-in-node-foreach-p n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3723 (insert pad "for ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3724 (if foreach
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3725 (insert "each "))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3726 (insert "(")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3727 (js2-print-ast (js2-for-in-node-iterator n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3728 (insert " in ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3729 (js2-print-ast (js2-for-in-node-object n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3730 (insert ") {\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3731 (js2-print-body (js2-for-in-node-body n) (1+ i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3732 (insert pad "}\n")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3733
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3734 (defstruct (js2-return-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3735 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3736 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3737 (:constructor make-js2-return-node (&key (type js2-RETURN)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3738 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3739 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3740 retval)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3741 "AST node for a return statement."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3742 retval) ; expression to return, or 'undefined
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3743
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3744 (put 'cl-struct-js2-return-node 'js2-visitor 'js2-visit-return-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3745 (put 'cl-struct-js2-return-node 'js2-printer 'js2-print-return-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3746
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3747 (defun js2-visit-return-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3748 (if (js2-return-node-retval n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3749 (js2-visit-ast (js2-return-node-retval n) v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3750
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3751 (defun js2-print-return-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3752 (insert (js2-make-pad i) "return")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3753 (when (js2-return-node-retval n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3754 (insert " ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3755 (js2-print-ast (js2-return-node-retval n) 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3756 (insert ";\n"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3757
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3758 (defstruct (js2-if-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3759 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3760 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3761 (:constructor make-js2-if-node (&key (type js2-IF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3762 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3763 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3764 condition
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3765 then-part
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3766 else-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3767 else-part
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3768 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3769 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3770 "AST node for an if-statement."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3771 condition ; expression
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3772 then-part ; statement or block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3773 else-pos ; optional buffer position of 'else' keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3774 else-part ; optional statement or block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3775 lp ; position of left-paren, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3776 rp) ; position of right-paren, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3777
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3778 (put 'cl-struct-js2-if-node 'js2-visitor 'js2-visit-if-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3779 (put 'cl-struct-js2-if-node 'js2-printer 'js2-print-if-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3780
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3781 (defun js2-visit-if-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3782 (js2-visit-ast (js2-if-node-condition n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3783 (js2-visit-ast (js2-if-node-then-part n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3784 (if (js2-if-node-else-part n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3785 (js2-visit-ast (js2-if-node-else-part n) v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3786
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3787 (defun js2-print-if-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3788 (let ((pad (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3789 (then-part (js2-if-node-then-part n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3790 (else-part (js2-if-node-else-part n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3791 (insert pad "if (")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3792 (js2-print-ast (js2-if-node-condition n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3793 (insert ") {\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3794 (js2-print-body then-part (1+ i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3795 (insert pad "}")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3796 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3797 ((not else-part)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3798 (insert "\n"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3799 ((js2-if-node-p else-part)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3800 (insert " else ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3801 (js2-print-body else-part i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3802 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3803 (insert " else {\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3804 (js2-print-body else-part (1+ i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3805 (insert pad "}\n")))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3806
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3807 (defstruct (js2-try-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3808 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3809 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3810 (:constructor make-js2-try-node (&key (type js2-TRY)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3811 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3812 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3813 try-block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3814 catch-clauses
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3815 finally-block)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3816 "AST node for a try-statement."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3817 try-block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3818 catch-clauses ; a lisp list of `js2-catch-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3819 finally-block) ; a `js2-finally-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3820
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3821 (put 'cl-struct-js2-try-node 'js2-visitor 'js2-visit-try-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3822 (put 'cl-struct-js2-try-node 'js2-printer 'js2-print-try-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3823
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3824 (defun js2-visit-try-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3825 (js2-visit-ast (js2-try-node-try-block n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3826 (dolist (clause (js2-try-node-catch-clauses n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3827 (js2-visit-ast clause v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3828 (if (js2-try-node-finally-block n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3829 (js2-visit-ast (js2-try-node-finally-block n) v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3830
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3831 (defun js2-print-try-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3832 (let ((pad (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3833 (catches (js2-try-node-catch-clauses n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3834 (finally (js2-try-node-finally-block n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3835 (insert pad "try {\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3836 (js2-print-body (js2-try-node-try-block n) (1+ i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3837 (insert pad "}")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3838 (when catches
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3839 (dolist (catch catches)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3840 (js2-print-ast catch i)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3841 (if finally
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3842 (js2-print-ast finally i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3843 (insert "\n"))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3844
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3845 (defstruct (js2-catch-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3846 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3847 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3848 (:constructor make-js2-catch-node (&key (type js2-CATCH)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3849 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3850 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3851 var-name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3852 guard-kwd
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3853 guard-expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3854 block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3855 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3856 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3857 "AST node for a catch clause."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3858 var-name ; a `js2-name-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3859 guard-kwd ; relative buffer position of "if" in "catch (x if ...)"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3860 guard-expr ; catch condition, a `js2-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3861 block ; statements, a `js2-block-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3862 lp ; buffer position of left-paren, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3863 rp) ; buffer position of right-paren, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3864
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3865 (put 'cl-struct-js2-catch-node 'js2-visitor 'js2-visit-catch-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3866 (put 'cl-struct-js2-catch-node 'js2-printer 'js2-print-catch-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3867
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3868 (defun js2-visit-catch-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3869 (js2-visit-ast (js2-catch-node-var-name n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3870 (when (js2-catch-node-guard-kwd n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3871 (js2-visit-ast (js2-catch-node-guard-expr n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3872 (js2-visit-ast (js2-catch-node-block n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3873
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3874 (defun js2-print-catch-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3875 (let ((pad (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3876 (guard-kwd (js2-catch-node-guard-kwd n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3877 (guard-expr (js2-catch-node-guard-expr n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3878 (insert " catch (")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3879 (js2-print-ast (js2-catch-node-var-name n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3880 (when guard-kwd
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3881 (insert " if ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3882 (js2-print-ast guard-expr 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3883 (insert ") {\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3884 (js2-print-body (js2-catch-node-block n) (1+ i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3885 (insert pad "}")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3886
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3887 (defstruct (js2-finally-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3888 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3889 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3890 (:constructor make-js2-finally-node (&key (type js2-FINALLY)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3891 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3892 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3893 body)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3894 "AST node for a finally clause."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3895 body) ; a `js2-node', often but not always a block node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3896
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3897 (put 'cl-struct-js2-finally-node 'js2-visitor 'js2-visit-finally-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3898 (put 'cl-struct-js2-finally-node 'js2-printer 'js2-print-finally-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3899
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3900 (defun js2-visit-finally-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3901 (js2-visit-ast (js2-finally-node-body n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3902
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3903 (defun js2-print-finally-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3904 (let ((pad (js2-make-pad i)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3905 (insert " finally {\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3906 (js2-print-body (js2-finally-node-body n) (1+ i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3907 (insert pad "}\n")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3908
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3909 (defstruct (js2-switch-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3910 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3911 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3912 (:constructor make-js2-switch-node (&key (type js2-SWITCH)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3913 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3914 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3915 discriminant
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3916 cases
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3917 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3918 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3919 "AST node for a switch statement."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3920 discriminant ; a `js2-node' (switch expression)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3921 cases ; a lisp list of `js2-case-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3922 lp ; position of open-paren for discriminant, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3923 rp) ; position of close-paren for discriminant, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3924
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3925 (put 'cl-struct-js2-switch-node 'js2-visitor 'js2-visit-switch-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3926 (put 'cl-struct-js2-switch-node 'js2-printer 'js2-print-switch-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3927
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3928 (defun js2-visit-switch-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3929 (js2-visit-ast (js2-switch-node-discriminant n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3930 (dolist (c (js2-switch-node-cases n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3931 (js2-visit-ast c v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3932
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3933 (defun js2-print-switch-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3934 (let ((pad (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3935 (cases (js2-switch-node-cases n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3936 (insert pad "switch (")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3937 (js2-print-ast (js2-switch-node-discriminant n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3938 (insert ") {\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3939 (dolist (case cases)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3940 (js2-print-ast case i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3941 (insert pad "}\n")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3942
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3943 (defstruct (js2-case-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3944 (:include js2-block-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3945 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3946 (:constructor make-js2-case-node (&key (type js2-CASE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3947 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3948 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3949 kids
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3950 expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3951 "AST node for a case clause of a switch statement."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3952 expr) ; the case expression (nil for default)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3953
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3954 (put 'cl-struct-js2-case-node 'js2-visitor 'js2-visit-case-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3955 (put 'cl-struct-js2-case-node 'js2-printer 'js2-print-case-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3956
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3957 (defun js2-visit-case-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3958 (if (js2-case-node-expr n) ; nil for default: case
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3959 (js2-visit-ast (js2-case-node-expr n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3960 (js2-visit-block n v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3961
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3962 (defun js2-print-case-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3963 (let ((pad (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3964 (expr (js2-case-node-expr n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3965 (insert pad)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3966 (if (null expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3967 (insert "default:\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3968 (insert "case ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3969 (js2-print-ast expr 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3970 (insert ":\n"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3971 (dolist (kid (js2-case-node-kids n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3972 (js2-print-ast kid (1+ i)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3973
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3974 (defstruct (js2-throw-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3975 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3976 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3977 (:constructor make-js2-throw-node (&key (type js2-THROW)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3978 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3979 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3980 expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3981 "AST node for a throw statement."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3982 expr) ; the expression to throw
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3983
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3984 (put 'cl-struct-js2-throw-node 'js2-visitor 'js2-visit-throw-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3985 (put 'cl-struct-js2-throw-node 'js2-printer 'js2-print-throw-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3986
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3987 (defun js2-visit-throw-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3988 (js2-visit-ast (js2-throw-node-expr n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3989
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3990 (defun js2-print-throw-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3991 (insert (js2-make-pad i) "throw ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3992 (js2-print-ast (js2-throw-node-expr n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3993 (insert ";\n"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3994
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3995 (defstruct (js2-with-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3996 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3997 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3998 (:constructor make-js2-with-node (&key (type js2-WITH)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3999 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4000 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4001 object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4002 body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4003 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4004 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4005 "AST node for a with-statement."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4006 object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4007 body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4008 lp ; buffer position of left-paren around object, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4009 rp) ; buffer position of right-paren around object, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4010
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4011 (put 'cl-struct-js2-with-node 'js2-visitor 'js2-visit-with-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4012 (put 'cl-struct-js2-with-node 'js2-printer 'js2-print-with-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4013
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4014 (defun js2-visit-with-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4015 (js2-visit-ast (js2-with-node-object n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4016 (js2-visit-ast (js2-with-node-body n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4017
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4018 (defun js2-print-with-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4019 (let ((pad (js2-make-pad i)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4020 (insert pad "with (")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4021 (js2-print-ast (js2-with-node-object n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4022 (insert ") {\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4023 (js2-print-body (js2-with-node-body n) (1+ i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4024 (insert pad "}\n")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4025
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4026 (defstruct (js2-label-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4027 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4028 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4029 (:constructor make-js2-label-node (&key (type js2-LABEL)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4030 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4031 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4032 name)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4033 "AST node for a statement label or case label."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4034 name ; a string
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4035 loop) ; for validating and code-generating continue-to-label
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4036
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4037 (put 'cl-struct-js2-label-node 'js2-visitor 'js2-visit-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4038 (put 'cl-struct-js2-label-node 'js2-printer 'js2-print-label)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4039
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4040 (defun js2-print-label (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4041 (insert (js2-make-pad i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4042 (js2-label-node-name n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4043 ":\n"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4044
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4045 (defstruct (js2-labeled-stmt-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4046 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4047 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4048 ;; type needs to be in `js2-side-effecting-tokens' to avoid spurious
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4049 ;; no-side-effects warnings, hence js2-EXPR_RESULT.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4050 (:constructor make-js2-labeled-stmt-node (&key (type js2-EXPR_RESULT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4051 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4052 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4053 labels
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4054 stmt)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4055 "AST node for a statement with one or more labels.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4056 Multiple labels for a statement are collapsed into the labels field."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4057 labels ; lisp list of `js2-label-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4058 stmt) ; the statement these labels are for
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4059
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4060 (put 'cl-struct-js2-labeled-stmt-node 'js2-visitor 'js2-visit-labeled-stmt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4061 (put 'cl-struct-js2-labeled-stmt-node 'js2-printer 'js2-print-labeled-stmt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4062
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4063 (defun js2-get-label-by-name (lbl-stmt name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4064 "Return a `js2-label-node' by NAME from LBL-STMT's labels list.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4065 Returns nil if no such label is in the list."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4066 (let ((label-list (js2-labeled-stmt-node-labels lbl-stmt))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4067 result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4068 (while (and label-list (not result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4069 (if (string= (js2-label-node-name (car label-list)) name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4070 (setq result (car label-list))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4071 (setq label-list (cdr label-list))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4072 result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4073
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4074 (defun js2-visit-labeled-stmt (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4075 (dolist (label (js2-labeled-stmt-node-labels n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4076 (js2-visit-ast label v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4077 (js2-visit-ast (js2-labeled-stmt-node-stmt n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4078
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4079 (defun js2-print-labeled-stmt (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4080 (dolist (label (js2-labeled-stmt-node-labels n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4081 (js2-print-ast label i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4082 (js2-print-ast (js2-labeled-stmt-node-stmt n) (1+ i)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4083
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4084 (defun js2-labeled-stmt-node-contains (node label)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4085 "Return t if NODE contains LABEL in its label set.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4086 NODE is a `js2-labels-node'. LABEL is an identifier."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4087 (loop for nl in (js2-labeled-stmt-node-labels node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4088 if (string= label (js2-label-node-name nl))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4089 return t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4090 finally return nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4091
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4092 (defsubst js2-labeled-stmt-node-add-label (node label)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4093 "Add a `js2-label-node' to the label set for this statement."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4094 (setf (js2-labeled-stmt-node-labels node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4095 (nconc (js2-labeled-stmt-node-labels node) (list label))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4096
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4097 (defstruct (js2-jump-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4098 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4099 (:constructor nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4100 "Abstract supertype of break and continue nodes."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4101 label ; `js2-name-node' for location of label identifier, if present
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4102 target) ; target js2-labels-node or loop/switch statement
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4103
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4104 (defun js2-visit-jump-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4105 ;; we don't visit the target, since it's a back-link
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4106 (if (js2-jump-node-label n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4107 (js2-visit-ast (js2-jump-node-label n) v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4108
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4109 (defstruct (js2-break-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4110 (:include js2-jump-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4111 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4112 (:constructor make-js2-break-node (&key (type js2-BREAK)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4113 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4114 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4115 label
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4116 target)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4117 "AST node for a break statement.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4118 The label field is a `js2-name-node', possibly nil, for the named label
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4119 if provided. E.g. in 'break foo', it represents 'foo'. The target field
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4120 is the target of the break - a label node or enclosing loop/switch statement.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4121
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4122 (put 'cl-struct-js2-break-node 'js2-visitor 'js2-visit-jump-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4123 (put 'cl-struct-js2-break-node 'js2-printer 'js2-print-break-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4124
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4125 (defun js2-print-break-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4126 (insert (js2-make-pad i) "break")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4127 (when (js2-break-node-label n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4128 (insert " ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4129 (js2-print-ast (js2-break-node-label n) 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4130 (insert ";\n"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4131
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4132 (defstruct (js2-continue-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4133 (:include js2-jump-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4134 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4135 (:constructor make-js2-continue-node (&key (type js2-CONTINUE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4136 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4137 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4138 label
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4139 target)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4140 "AST node for a continue statement.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4141 The label field is the user-supplied enclosing label name, a `js2-name-node'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4142 It is nil if continue specifies no label. The target field is the jump target:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4143 a `js2-label-node' or the innermost enclosing loop.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4144
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4145 (put 'cl-struct-js2-continue-node 'js2-visitor 'js2-visit-jump-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4146 (put 'cl-struct-js2-continue-node 'js2-printer 'js2-print-continue-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4147
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4148 (defun js2-print-continue-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4149 (insert (js2-make-pad i) "continue")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4150 (when (js2-continue-node-label n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4151 (insert " ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4152 (js2-print-ast (js2-continue-node-label n) 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4153 (insert ";\n"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4154
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4155 (defstruct (js2-function-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4156 (:include js2-script-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4157 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4158 (:constructor make-js2-function-node (&key (type js2-FUNCTION)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4159 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4160 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4161 (ftype 'FUNCTION)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4162 (form 'FUNCTION_STATEMENT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4163 (name "")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4164 params
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4165 body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4166 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4167 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4168 "AST node for a function declaration.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4169 The `params' field is a lisp list of nodes. Each node is either a simple
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4170 `js2-name-node', or if it's a destructuring-assignment parameter, a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4171 `js2-array-node' or `js2-object-node'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4172 ftype ; FUNCTION, GETTER or SETTER
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4173 form ; FUNCTION_{STATEMENT|EXPRESSION|EXPRESSION_STATEMENT}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4174 name ; function name (a `js2-name-node', or nil if anonymous)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4175 params ; a lisp list of destructuring forms or simple name nodes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4176 body ; a `js2-block-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4177 lp ; position of arg-list open-paren, or nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4178 rp ; position of arg-list close-paren, or nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4179 ignore-dynamic ; ignore value of the dynamic-scope flag (interpreter only)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4180 needs-activation ; t if we need an activation object for this frame
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4181 is-generator ; t if this function contains a yield
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4182 member-expr) ; nonstandard Ecma extension from Rhino
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4183
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4184 (put 'cl-struct-js2-function-node 'js2-visitor 'js2-visit-function-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4185 (put 'cl-struct-js2-function-node 'js2-printer 'js2-print-function-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4186
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4187 (defun js2-visit-function-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4188 (if (js2-function-node-name n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4189 (js2-visit-ast (js2-function-node-name n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4190 (dolist (p (js2-function-node-params n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4191 (js2-visit-ast p v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4192 (js2-visit-ast (js2-function-node-body n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4193
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4194 (defun js2-print-function-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4195 (let ((pad (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4196 (getter (js2-node-get-prop n 'GETTER_SETTER))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4197 (name (js2-function-node-name n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4198 (params (js2-function-node-params n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4199 (body (js2-function-node-body n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4200 (expr (eq (js2-function-node-form n) 'FUNCTION_EXPRESSION)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4201 (unless getter
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4202 (insert pad "function"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4203 (when name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4204 (insert " ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4205 (js2-print-ast name 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4206 (insert "(")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4207 (loop with len = (length params)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4208 for param in params
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4209 for count from 1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4210 do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4211 (js2-print-ast param 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4212 (if (< count len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4213 (insert ", ")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4214 (insert ") {")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4215 (unless expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4216 (insert "\n"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4217 ;; TODO: fix this to be smarter about indenting, etc.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4218 (js2-print-body body (1+ i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4219 (insert pad "}")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4220 (unless expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4221 (insert "\n"))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4222
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4223 (defsubst js2-function-name (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4224 "Return function name for NODE, a `js2-function-node', or nil if anonymous."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4225 (and (js2-function-node-name node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4226 (js2-name-node-name (js2-function-node-name node))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4227
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4228 ;; Having this be an expression node makes it more flexible.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4229 ;; There are IDE contexts, such as indentation in a for-loop initializer,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4230 ;; that work better if you assume it's an expression. Whenever we have
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4231 ;; a standalone var/const declaration, we just wrap with an expr stmt.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4232 ;; Eclipse apparently screwed this up and now has two versions, expr and stmt.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4233 (defstruct (js2-var-decl-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4234 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4235 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4236 (:constructor make-js2-var-decl-node (&key (type js2-VAR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4237 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4238 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4239 kids
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4240 decl-type)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4241 "AST node for a variable declaration list (VAR, CONST or LET).
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4242 The node bounds differ depending on the declaration type. For VAR or
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4243 CONST declarations, the bounds include the var/const keyword. For LET
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4244 declarations, the node begins at the position of the first child."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4245 kids ; a lisp list of `js2-var-init-node' structs.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4246 decl-type) ; js2-VAR, js2-CONST or js2-LET
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4247
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4248 (put 'cl-struct-js2-var-decl-node 'js2-visitor 'js2-visit-var-decl)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4249 (put 'cl-struct-js2-var-decl-node 'js2-printer 'js2-print-var-decl)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4250
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4251 (defun js2-visit-var-decl (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4252 (dolist (kid (js2-var-decl-node-kids n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4253 (js2-visit-ast kid v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4254
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4255 (defun js2-print-var-decl (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4256 (let ((pad (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4257 (tt (js2-var-decl-node-decl-type n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4258 (insert pad)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4259 (insert (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4260 ((= tt js2-VAR) "var ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4261 ((= tt js2-LET) "") ; handled by parent let-{expr/stmt}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4262 ((= tt js2-CONST) "const ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4263 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4264 (error "malformed var-decl node"))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4265 (loop with kids = (js2-var-decl-node-kids n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4266 with len = (length kids)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4267 for kid in kids
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4268 for count from 1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4269 do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4270 (js2-print-ast kid 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4271 (if (< count len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4272 (insert ", ")))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4273
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4274 (defstruct (js2-var-init-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4275 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4276 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4277 (:constructor make-js2-var-init-node (&key (type js2-VAR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4278 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4279 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4280 target
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4281 initializer)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4282 "AST node for a variable declaration.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4283 The type field will be js2-CONST for a const decl."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4284 target ; `js2-name-node', `js2-object-node', or `js2-array-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4285 initializer) ; initializer expression, a `js2-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4286
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4287 (put 'cl-struct-js2-var-init-node 'js2-visitor 'js2-visit-var-init-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4288 (put 'cl-struct-js2-var-init-node 'js2-printer 'js2-print-var-init-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4289
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4290 (defun js2-visit-var-init-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4291 (js2-visit-ast (js2-var-init-node-target n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4292 (if (js2-var-init-node-initializer n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4293 (js2-visit-ast (js2-var-init-node-initializer n) v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4294
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4295 (defun js2-print-var-init-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4296 (let ((pad (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4297 (name (js2-var-init-node-target n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4298 (init (js2-var-init-node-initializer n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4299 (insert pad)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4300 (js2-print-ast name 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4301 (when init
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4302 (insert " = ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4303 (js2-print-ast init 0))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4304
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4305 (defstruct (js2-cond-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4306 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4307 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4308 (:constructor make-js2-cond-node (&key (type js2-HOOK)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4309 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4310 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4311 test-expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4312 true-expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4313 false-expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4314 q-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4315 c-pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4316 "AST node for the ternary operator"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4317 test-expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4318 true-expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4319 false-expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4320 q-pos ; buffer position of ?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4321 c-pos) ; buffer position of :
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4322
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4323 (put 'cl-struct-js2-cond-node 'js2-visitor 'js2-visit-cond-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4324 (put 'cl-struct-js2-cond-node 'js2-printer 'js2-print-cond-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4325
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4326 (defun js2-visit-cond-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4327 (js2-visit-ast (js2-cond-node-test-expr n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4328 (js2-visit-ast (js2-cond-node-true-expr n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4329 (js2-visit-ast (js2-cond-node-false-expr n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4330
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4331 (defun js2-print-cond-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4332 (let ((pad (js2-make-pad i)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4333 (insert pad)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4334 (js2-print-ast (js2-cond-node-test-expr n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4335 (insert " ? ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4336 (js2-print-ast (js2-cond-node-true-expr n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4337 (insert " : ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4338 (js2-print-ast (js2-cond-node-false-expr n) 0)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4339
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4340 (defstruct (js2-infix-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4341 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4342 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4343 (:constructor make-js2-infix-node (&key type
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4344 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4345 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4346 op-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4347 left
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4348 right)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4349 "Represents infix expressions.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4350 Includes assignment ops like `|=', and the comma operator.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4351 The type field inherited from `js2-node' holds the operator."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4352 op-pos ; buffer position where operator begins
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4353 left ; any `js2-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4354 right) ; any `js2-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4355
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4356 (put 'cl-struct-js2-infix-node 'js2-visitor 'js2-visit-infix-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4357 (put 'cl-struct-js2-infix-node 'js2-printer 'js2-print-infix-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4358
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4359 (defun js2-visit-infix-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4360 (when (js2-infix-node-left n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4361 (js2-visit-ast (js2-infix-node-left n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4362 (when (js2-infix-node-right n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4363 (js2-visit-ast (js2-infix-node-right n) v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4364
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4365 (defconst js2-operator-tokens
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4366 (let ((table (make-hash-table :test 'eq))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4367 (tokens
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4368 (list (cons js2-IN "in")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4369 (cons js2-TYPEOF "typeof")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4370 (cons js2-INSTANCEOF "instanceof")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4371 (cons js2-DELPROP "delete")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4372 (cons js2-COMMA ",")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4373 (cons js2-COLON ":")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4374 (cons js2-OR "||")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4375 (cons js2-AND "&&")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4376 (cons js2-INC "++")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4377 (cons js2-DEC "--")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4378 (cons js2-BITOR "|")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4379 (cons js2-BITXOR "^")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4380 (cons js2-BITAND "&")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4381 (cons js2-EQ "==")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4382 (cons js2-NE "!=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4383 (cons js2-LT "<")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4384 (cons js2-LE "<=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4385 (cons js2-GT ">")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4386 (cons js2-GE ">=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4387 (cons js2-LSH "<<")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4388 (cons js2-RSH ">>")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4389 (cons js2-URSH ">>>")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4390 (cons js2-ADD "+") ; infix plus
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4391 (cons js2-SUB "-") ; infix minus
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4392 (cons js2-MUL "*")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4393 (cons js2-DIV "/")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4394 (cons js2-MOD "%")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4395 (cons js2-NOT "!")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4396 (cons js2-BITNOT "~")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4397 (cons js2-POS "+") ; unary plus
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4398 (cons js2-NEG "-") ; unary minus
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4399 (cons js2-SHEQ "===") ; shallow equality
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4400 (cons js2-SHNE "!==") ; shallow inequality
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4401 (cons js2-ASSIGN "=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4402 (cons js2-ASSIGN_BITOR "|=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4403 (cons js2-ASSIGN_BITXOR "^=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4404 (cons js2-ASSIGN_BITAND "&=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4405 (cons js2-ASSIGN_LSH "<<=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4406 (cons js2-ASSIGN_RSH ">>=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4407 (cons js2-ASSIGN_URSH ">>>=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4408 (cons js2-ASSIGN_ADD "+=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4409 (cons js2-ASSIGN_SUB "-=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4410 (cons js2-ASSIGN_MUL "*=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4411 (cons js2-ASSIGN_DIV "/=")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4412 (cons js2-ASSIGN_MOD "%="))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4413 (loop for (k . v) in tokens do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4414 (puthash k v table))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4415 table))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4416
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4417 (defun js2-print-infix-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4418 (let* ((tt (js2-node-type n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4419 (op (gethash tt js2-operator-tokens)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4420 (unless op
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4421 (error "unrecognized infix operator %s" (js2-node-type n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4422 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4423 (js2-print-ast (js2-infix-node-left n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4424 (unless (= tt js2-COMMA)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4425 (insert " "))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4426 (insert op)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4427 (insert " ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4428 (js2-print-ast (js2-infix-node-right n) 0)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4429
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4430 (defstruct (js2-assign-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4431 (:include js2-infix-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4432 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4433 (:constructor make-js2-assign-node (&key type
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4434 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4435 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4436 op-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4437 left
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4438 right)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4439 "Represents any assignment.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4440 The type field holds the actual assignment operator.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4441
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4442 (put 'cl-struct-js2-assign-node 'js2-visitor 'js2-visit-infix-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4443 (put 'cl-struct-js2-assign-node 'js2-printer 'js2-print-infix-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4444
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4445 (defstruct (js2-unary-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4446 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4447 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4448 (:constructor make-js2-unary-node (&key type ; required
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4449 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4450 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4451 operand)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4452 "AST node type for unary operator nodes.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4453 The type field can be NOT, BITNOT, POS, NEG, INC, DEC,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4454 TYPEOF, or DELPROP. For INC or DEC, a 'postfix node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4455 property is added if the operator follows the operand."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4456 operand) ; a `js2-node' expression
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4457
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4458 (put 'cl-struct-js2-unary-node 'js2-visitor 'js2-visit-unary-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4459 (put 'cl-struct-js2-unary-node 'js2-printer 'js2-print-unary-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4460
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4461 (defun js2-visit-unary-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4462 (js2-visit-ast (js2-unary-node-operand n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4463
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4464 (defun js2-print-unary-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4465 (let* ((tt (js2-node-type n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4466 (op (gethash tt js2-operator-tokens))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4467 (postfix (js2-node-get-prop n 'postfix)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4468 (unless op
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4469 (error "unrecognized unary operator %s" tt))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4470 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4471 (unless postfix
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4472 (insert op))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4473 (if (or (= tt js2-TYPEOF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4474 (= tt js2-DELPROP))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4475 (insert " "))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4476 (js2-print-ast (js2-unary-node-operand n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4477 (when postfix
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4478 (insert op))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4479
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4480 (defstruct (js2-let-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4481 (:include js2-scope)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4482 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4483 (:constructor make-js2-let-node (&key (type js2-LETEXPR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4484 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4485 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4486 vars
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4487 body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4488 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4489 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4490 "AST node for a let expression or a let statement.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4491 Note that a let declaration such as let x=6, y=7 is a `js2-var-decl-node'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4492 vars ; a `js2-var-decl-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4493 body ; a `js2-node' representing the expression or body block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4494 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4495 rp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4496
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4497 (put 'cl-struct-js2-let-node 'js2-visitor 'js2-visit-let-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4498 (put 'cl-struct-js2-let-node 'js2-printer 'js2-print-let-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4499
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4500 (defun js2-visit-let-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4501 (when (js2-let-node-vars n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4502 (js2-visit-ast (js2-let-node-vars n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4503 (when (js2-let-node-body n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4504 (js2-visit-ast (js2-let-node-body n) v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4505
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4506 (defun js2-print-let-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4507 (insert (js2-make-pad i) "let (")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4508 (js2-print-ast (js2-let-node-vars n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4509 (insert ") ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4510 (js2-print-ast (js2-let-node-body n) i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4511
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4512 (defstruct (js2-keyword-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4513 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4514 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4515 (:constructor make-js2-keyword-node (&key type
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4516 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4517 (len (- js2-ts-cursor pos)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4518 "AST node representing a literal keyword such as `null'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4519 Used for `null', `this', `true', `false' and `debugger'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4520 The node type is set to js2-NULL, js2-THIS, etc.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4521
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4522 (put 'cl-struct-js2-keyword-node 'js2-visitor 'js2-visit-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4523 (put 'cl-struct-js2-keyword-node 'js2-printer 'js2-print-keyword-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4524
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4525 (defun js2-print-keyword-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4526 (insert (js2-make-pad i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4527 (let ((tt (js2-node-type n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4528 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4529 ((= tt 'js2-THIS) "this")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4530 ((= tt 'js2-NULL) "null")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4531 ((= tt 'js2-TRUE) "true")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4532 ((= tt 'js2-FALSE) "false")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4533 ((= tt 'js2-DEBUGGER) "debugger")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4534 (t (error "Invalid keyword literal type: %d" tt))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4535
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4536 (defsubst js2-this-node-p (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4537 "Return t if this node is a `js2-literal-node' of type js2-THIS."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4538 (eq (js2-node-type node) js2-THIS))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4539
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4540 (defstruct (js2-new-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4541 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4542 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4543 (:constructor make-js2-new-node (&key (type js2-NEW)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4544 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4545 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4546 target
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4547 args
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4548 initializer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4549 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4550 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4551 "AST node for new-expression such as new Foo()."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4552 target ; an identifier or reference
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4553 args ; a lisp list of argument nodes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4554 lp ; position of left-paren, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4555 rp ; position of right-paren, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4556 initializer) ; experimental Rhino syntax: optional `js2-object-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4557
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4558 (put 'cl-struct-js2-new-node 'js2-visitor 'js2-visit-new-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4559 (put 'cl-struct-js2-new-node 'js2-printer 'js2-print-new-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4560
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4561 (defun js2-visit-new-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4562 (js2-visit-ast (js2-new-node-target n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4563 (dolist (arg (js2-new-node-args n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4564 (js2-visit-ast arg v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4565 (when (js2-new-node-initializer n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4566 (js2-visit-ast (js2-new-node-initializer n) v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4567
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4568 (defun js2-print-new-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4569 (insert (js2-make-pad i) "new ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4570 (js2-print-ast (js2-new-node-target n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4571 (insert "(")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4572 (js2-print-list (js2-new-node-args n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4573 (insert ")")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4574 (when (js2-new-node-initializer n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4575 (insert " ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4576 (js2-print-ast (js2-new-node-initializer n))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4577
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4578 (defstruct (js2-name-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4579 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4580 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4581 (:constructor make-js2-name-node (&key (type js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4582 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4583 (len (- js2-ts-cursor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4584 js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4585 (name js2-ts-string))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4586 "AST node for a JavaScript identifier"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4587 name ; a string
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4588 scope) ; a `js2-scope' (optional, used for codegen)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4589
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4590 (put 'cl-struct-js2-name-node 'js2-visitor 'js2-visit-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4591 (put 'cl-struct-js2-name-node 'js2-printer 'js2-print-name-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4592
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4593 (defun js2-print-name-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4594 (insert (js2-make-pad i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4595 (js2-name-node-name n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4596
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4597 (defsubst js2-name-node-length (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4598 "Return identifier length of NODE, a `js2-name-node'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4599 Returns 0 if NODE is nil or its identifier field is nil."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4600 (if node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4601 (length (js2-name-node-name node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4602 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4603
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4604 (defstruct (js2-number-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4605 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4606 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4607 (:constructor make-js2-number-node (&key (type js2-NUMBER)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4608 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4609 (len (- js2-ts-cursor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4610 js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4611 (value js2-ts-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4612 (num-value js2-ts-number))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4613 "AST node for a number literal."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4614 value ; the original string, e.g. "6.02e23"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4615 num-value) ; the parsed number value
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4616
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4617 (put 'cl-struct-js2-number-node 'js2-visitor 'js2-visit-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4618 (put 'cl-struct-js2-number-node 'js2-printer 'js2-print-number-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4619
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4620 (defun js2-print-number-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4621 (insert (js2-make-pad i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4622 (number-to-string (js2-number-node-value n))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4623
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4624 (defstruct (js2-regexp-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4625 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4626 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4627 (:constructor make-js2-regexp-node (&key (type js2-REGEXP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4628 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4629 (len (- js2-ts-cursor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4630 js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4631 value
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4632 flags)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4633 "AST node for a regular expression literal."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4634 value ; the regexp string, without // delimiters
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4635 flags) ; a string of flags, e.g. `mi'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4636
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4637 (put 'cl-struct-js2-regexp-node 'js2-visitor 'js2-visit-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4638 (put 'cl-struct-js2-regexp-node 'js2-printer 'js2-print-regexp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4639
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4640 (defun js2-print-regexp (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4641 (insert (js2-make-pad i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4642 "/"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4643 (js2-regexp-node-value n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4644 "/")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4645 (if (js2-regexp-node-flags n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4646 (insert (js2-regexp-node-flags n))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4647
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4648 (defstruct (js2-string-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4649 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4650 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4651 (:constructor make-js2-string-node (&key (type js2-STRING)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4652 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4653 (len (- js2-ts-cursor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4654 js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4655 (value js2-ts-string))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4656 "String literal.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4657 Escape characters are not evaluated; e.g. \n is 2 chars in value field.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4658 You can tell the quote type by looking at the first character."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4659 value) ; the characters of the string, including the quotes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4660
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4661 (put 'cl-struct-js2-string-node 'js2-visitor 'js2-visit-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4662 (put 'cl-struct-js2-string-node 'js2-printer 'js2-print-string-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4663
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4664 (defun js2-print-string-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4665 (insert (js2-make-pad i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4666 (js2-node-string n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4667
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4668 (defstruct (js2-array-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4669 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4670 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4671 (:constructor make-js2-array-node (&key (type js2-ARRAYLIT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4672 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4673 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4674 elems)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4675 "AST node for an array literal."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4676 elems) ; list of expressions. [foo,,bar] yields a nil middle element.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4677
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4678 (put 'cl-struct-js2-array-node 'js2-visitor 'js2-visit-array-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4679 (put 'cl-struct-js2-array-node 'js2-printer 'js2-print-array-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4680
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4681 (defun js2-visit-array-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4682 (dolist (e (js2-array-node-elems n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4683 (when e ; can be nil, e.g. [a, ,b]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4684 (js2-visit-ast e v))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4685
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4686 (defun js2-print-array-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4687 (insert (js2-make-pad i) "[")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4688 (js2-print-list (js2-array-node-elems n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4689 (insert "]"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4690
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4691 (defstruct (js2-object-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4692 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4693 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4694 (:constructor make-js2-object-node (&key (type js2-OBJECTLIT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4695 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4696 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4697 elems)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4698 "AST node for an object literal expression."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4699 elems) ; a lisp list of `js2-object-prop-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4700
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4701 (put 'cl-struct-js2-object-node 'js2-visitor 'js2-visit-object-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4702 (put 'cl-struct-js2-object-node 'js2-printer 'js2-print-object-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4703
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4704 (defun js2-visit-object-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4705 (dolist (e (js2-object-node-elems n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4706 (js2-visit-ast e v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4707
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4708 (defun js2-print-object-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4709 (insert (js2-make-pad i) "{")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4710 (js2-print-list (js2-object-node-elems n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4711 (insert "}"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4712
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4713 (defstruct (js2-object-prop-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4714 (:include js2-infix-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4715 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4716 (:constructor make-js2-object-prop-node (&key (type js2-COLON)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4717 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4718 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4719 left
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4720 right
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4721 op-pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4722 "AST node for an object literal prop:value entry.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4723 The `left' field is the property: a name node, string node or number node.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4724 The `right' field is a `js2-node' representing the initializer value.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4725
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4726 (put 'cl-struct-js2-object-prop-node 'js2-visitor 'js2-visit-infix-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4727 (put 'cl-struct-js2-object-prop-node 'js2-printer 'js2-print-object-prop-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4728
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4729 (defun js2-print-object-prop-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4730 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4731 (js2-print-ast (js2-object-prop-node-left n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4732 (insert ":")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4733 (js2-print-ast (js2-object-prop-node-right n) 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4734
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4735 (defstruct (js2-getter-setter-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4736 (:include js2-infix-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4737 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4738 (:constructor make-js2-getter-setter-node (&key type ; GET or SET
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4739 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4740 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4741 left
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4742 right)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4743 "AST node for a getter/setter property in an object literal.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4744 The `left' field is the `js2-name-node' naming the getter/setter prop.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4745 The `right' field is always an anonymous `js2-function-node' with a node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4746 property `GETTER_SETTER' set to js2-GET or js2-SET. ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4747
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4748 (put 'cl-struct-js2-getter-setter-node 'js2-visitor 'js2-visit-infix-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4749 (put 'cl-struct-js2-getter-setter-node 'js2-printer 'js2-print-getter-setter)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4750
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4751 (defun js2-print-getter-setter (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4752 (let ((pad (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4753 (left (js2-getter-setter-node-left n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4754 (right (js2-getter-setter-node-right n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4755 (insert pad)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4756 (insert (if (= (js2-node-type n) js2-GET) "get " "set "))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4757 (js2-print-ast left 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4758 (js2-print-ast right 0)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4759
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4760 (defstruct (js2-prop-get-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4761 (:include js2-infix-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4762 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4763 (:constructor make-js2-prop-get-node (&key (type js2-GETPROP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4764 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4765 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4766 left
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4767 right)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4768 "AST node for a dotted property reference, e.g. foo.bar or foo().bar")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4769
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4770 (put 'cl-struct-js2-prop-get-node 'js2-visitor 'js2-visit-prop-get-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4771 (put 'cl-struct-js2-prop-get-node 'js2-printer 'js2-print-prop-get-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4772
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4773 (defun js2-visit-prop-get-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4774 (when (js2-prop-get-node-left n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4775 (js2-visit-ast (js2-prop-get-node-left n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4776 (when (js2-prop-get-node-right n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4777 (js2-visit-ast (js2-prop-get-node-right n) v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4778
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4779 (defun js2-print-prop-get-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4780 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4781 (js2-print-ast (js2-prop-get-node-left n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4782 (insert ".")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4783 (js2-print-ast (js2-prop-get-node-right n) 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4784
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4785 (defstruct (js2-elem-get-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4786 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4787 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4788 (:constructor make-js2-elem-get-node (&key (type js2-GETELEM)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4789 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4790 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4791 target
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4792 element
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4793 lb
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4794 rb)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4795 "AST node for an array index expression such as foo[bar]."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4796 target ; a `js2-node' - the expression preceding the "."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4797 element ; a `js2-node' - the expression in brackets
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4798 lb ; position of left-bracket, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4799 rb) ; position of right-bracket, nil if omitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4800
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4801 (put 'cl-struct-js2-elem-get-node 'js2-visitor 'js2-visit-elem-get-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4802 (put 'cl-struct-js2-elem-get-node 'js2-printer 'js2-print-elem-get-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4803
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4804 (defun js2-visit-elem-get-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4805 (when (js2-elem-get-node-target n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4806 (js2-visit-ast (js2-elem-get-node-target n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4807 (when (js2-elem-get-node-element n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4808 (js2-visit-ast (js2-elem-get-node-element n) v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4809
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4810 (defun js2-print-elem-get-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4811 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4812 (js2-print-ast (js2-elem-get-node-target n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4813 (insert "[")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4814 (js2-print-ast (js2-elem-get-node-element n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4815 (insert "]"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4816
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4817 (defstruct (js2-call-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4818 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4819 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4820 (:constructor make-js2-call-node (&key (type js2-CALL)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4821 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4822 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4823 target
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4824 args
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4825 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4826 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4827 "AST node for a JavaScript function call."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4828 target ; a `js2-node' evaluating to the function to call
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4829 args ; a lisp list of `js2-node' arguments
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4830 lp ; position of open-paren, or nil if missing
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4831 rp) ; position of close-paren, or nil if missing
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4832
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4833 (put 'cl-struct-js2-call-node 'js2-visitor 'js2-visit-call-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4834 (put 'cl-struct-js2-call-node 'js2-printer 'js2-print-call-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4835
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4836 (defun js2-visit-call-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4837 (js2-visit-ast (js2-call-node-target n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4838 (dolist (arg (js2-call-node-args n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4839 (js2-visit-ast arg v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4840
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4841 (defun js2-print-call-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4842 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4843 (js2-print-ast (js2-call-node-target n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4844 (insert "(")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4845 (js2-print-list (js2-call-node-args n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4846 (insert ")"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4847
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4848 (defstruct (js2-yield-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4849 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4850 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4851 (:constructor make-js2-yield-node (&key (type js2-YIELD)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4852 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4853 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4854 value)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4855 "AST node for yield statement or expression."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4856 value) ; optional: value to be yielded
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4857
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4858 (put 'cl-struct-js2-yield-node 'js2-visitor 'js2-visit-yield-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4859 (put 'cl-struct-js2-yield-node 'js2-printer 'js2-print-yield-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4860
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4861 (defun js2-visit-yield-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4862 (js2-visit-ast (js2-yield-node-value n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4863
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4864 (defun js2-print-yield-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4865 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4866 (insert "yield")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4867 (when (js2-yield-node-value n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4868 (insert " ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4869 (js2-print-ast (js2-yield-node-value n) 0)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4870
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4871 (defstruct (js2-paren-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4872 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4873 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4874 (:constructor make-js2-paren-node (&key (type js2-LP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4875 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4876 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4877 expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4878 "AST node for a parenthesized expression.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4879 In particular, used when the parens are syntactically optional,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4880 as opposed to required parens such as those enclosing an if-conditional."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4881 expr) ; `js2-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4882
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4883 (put 'cl-struct-js2-paren-node 'js2-visitor 'js2-visit-paren-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4884 (put 'cl-struct-js2-paren-node 'js2-printer 'js2-print-paren-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4885
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4886 (defun js2-visit-paren-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4887 (js2-visit-ast (js2-paren-node-expr n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4888
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4889 (defun js2-print-paren-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4890 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4891 (insert "(")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4892 (js2-print-ast (js2-paren-node-expr n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4893 (insert ")"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4894
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4895 (defstruct (js2-array-comp-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4896 (:include js2-scope)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4897 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4898 (:constructor make-js2-array-comp-node (&key (type js2-ARRAYCOMP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4899 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4900 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4901 result
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4902 loops
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4903 filter
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4904 if-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4905 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4906 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4907 "AST node for an Array comprehension such as [[x,y] for (x in foo) for (y in bar)]."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4908 result ; result expression (just after left-bracket)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4909 loops ; a lisp list of `js2-array-comp-loop-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4910 filter ; guard/filter expression
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4911 if-pos ; buffer pos of 'if' keyword, if present, else nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4912 lp ; buffer position of if-guard left-paren, or nil if not present
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4913 rp) ; buffer position of if-guard right-paren, or nil if not present
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4914
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4915 (put 'cl-struct-js2-array-comp-node 'js2-visitor 'js2-visit-array-comp-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4916 (put 'cl-struct-js2-array-comp-node 'js2-printer 'js2-print-array-comp-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4917
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4918 (defun js2-visit-array-comp-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4919 (js2-visit-ast (js2-array-comp-node-result n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4920 (dolist (l (js2-array-comp-node-loops n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4921 (js2-visit-ast l v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4922 (if (js2-array-comp-node-filter n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4923 (js2-visit-ast (js2-array-comp-node-filter n) v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4924
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4925 (defun js2-print-array-comp-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4926 (let ((pad (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4927 (result (js2-array-comp-node-result n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4928 (loops (js2-array-comp-node-loops n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4929 (filter (js2-array-comp-node-filter n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4930 (insert pad "[")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4931 (js2-print-ast result 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4932 (dolist (l loops)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4933 (insert " ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4934 (js2-print-ast l 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4935 (when filter
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4936 (insert " if (")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4937 (js2-print-ast filter 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4938 (insert ")]")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4939
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4940 (defstruct (js2-array-comp-loop-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4941 (:include js2-for-in-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4942 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4943 (:constructor make-js2-array-comp-loop-node (&key (type js2-FOR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4944 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4945 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4946 iterator
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4947 object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4948 in-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4949 foreach-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4950 each-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4951 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4952 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4953 "AST subtree for each 'for (foo in bar)' loop in an array comprehension.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4954
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4955 (put 'cl-struct-js2-array-comp-loop-node 'js2-visitor 'js2-visit-array-comp-loop)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4956 (put 'cl-struct-js2-array-comp-loop-node 'js2-printer 'js2-print-array-comp-loop)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4957
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4958 (defun js2-visit-array-comp-loop (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4959 (js2-visit-ast (js2-array-comp-loop-node-iterator n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4960 (js2-visit-ast (js2-array-comp-loop-node-object n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4961
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4962 (defun js2-print-array-comp-loop (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4963 (insert "for (")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4964 (js2-print-ast (js2-array-comp-loop-node-iterator n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4965 (insert " in ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4966 (js2-print-ast (js2-array-comp-loop-node-object n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4967 (insert ")"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4968
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4969 (defstruct (js2-empty-expr-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4970 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4971 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4972 (:constructor make-js2-empty-expr-node (&key (type js2-EMPTY)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4973 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4974 len)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4975 "AST node for an empty expression.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4976
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4977 (put 'cl-struct-js2-empty-expr-node 'js2-visitor 'js2-visit-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4978 (put 'cl-struct-js2-empty-expr-node 'js2-printer 'js2-print-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4979
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4980 (defstruct (js2-xml-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4981 (:include js2-block-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4982 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4983 (:constructor make-js2-xml-node (&key (type js2-XML)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4984 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4985 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4986 kids)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4987 "AST node for initial parse of E4X literals.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4988 The kids field is a list of XML fragments, each a `js2-string-node' or
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4989 a `js2-xml-js-expr-node'. Equivalent to Rhino's XmlLiteral node.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4990
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4991 (put 'cl-struct-js2-xml-node 'js2-visitor 'js2-visit-block)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4992 (put 'cl-struct-js2-xml-node 'js2-printer 'js2-print-xml-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4993
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4994 (defun js2-print-xml-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4995 (dolist (kid (js2-xml-node-kids n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4996 (js2-print-ast kid i)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4997
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4998 (defstruct (js2-xml-js-expr-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4999 (:include js2-xml-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5000 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5001 (:constructor make-js2-xml-js-expr-node (&key (type js2-XML)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5002 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5003 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5004 expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5005 "AST node for an embedded JavaScript {expression} in an E4X literal.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5006 The start and end fields correspond to the curly-braces."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5007 expr) ; a `js2-expr-node' of some sort
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5008
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5009 (put 'cl-struct-js2-xml-js-expr-node 'js2-visitor 'js2-visit-xml-js-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5010 (put 'cl-struct-js2-xml-js-expr-node 'js2-printer 'js2-print-xml-js-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5011
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5012 (defun js2-visit-xml-js-expr (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5013 (js2-visit-ast (js2-xml-js-expr-node-expr n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5014
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5015 (defun js2-print-xml-js-expr (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5016 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5017 (insert "{")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5018 (js2-print-ast (js2-xml-js-expr-node-expr n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5019 (insert "}"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5020
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5021 (defstruct (js2-xml-dot-query-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5022 (:include js2-infix-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5023 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5024 (:constructor make-js2-xml-dot-query-node (&key (type js2-DOTQUERY)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5025 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5026 op-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5027 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5028 left
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5029 right
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5030 rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5031 "AST node for an E4X foo.(bar) filter expression.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5032 Note that the left-paren is automatically the character immediately
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5033 following the dot (.) in the operator. No whitespace is permitted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5034 between the dot and the lp by the scanner."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5035 rp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5036
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5037 (put 'cl-struct-js2-xml-dot-query-node 'js2-visitor 'js2-visit-infix-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5038 (put 'cl-struct-js2-xml-dot-query-node 'js2-printer 'js2-print-xml-dot-query)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5039
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5040 (defun js2-print-xml-dot-query (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5041 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5042 (js2-print-ast (js2-xml-dot-query-node-left n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5043 (insert ".(")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5044 (js2-print-ast (js2-xml-dot-query-node-right n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5045 (insert ")"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5046
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5047 (defstruct (js2-xml-ref-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5048 (:include js2-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5049 (:constructor nil)) ; abstract
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5050 "Base type for E4X XML attribute-access or property-get expressions.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5051 Such expressions can take a variety of forms. The general syntax has
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5052 three parts:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5053
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5054 - (optional) an @ (specifying an attribute access)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5055 - (optional) a namespace (a `js2-name-node') and double-colon
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5056 - (required) either a `js2-name-node' or a bracketed [expression]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5057
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5058 The property-name expressions (examples: ns::name, @name) are
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5059 represented as `js2-xml-prop-ref' nodes. The bracketed-expression
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5060 versions (examples: ns::[name], @[name]) become `js2-xml-elem-ref' nodes.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5061
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5062 This node type (or more specifically, its subclasses) will sometimes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5063 be the right-hand child of a `js2-prop-get-node' or a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5064 `js2-infix-node' of type `js2-DOTDOT', the .. xml-descendants operator.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5065 The `js2-xml-ref-node' may also be a standalone primary expression with
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5066 no explicit target, which is valid in certain expression contexts such as
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5067
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5068 company..employee.(@id < 100)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5069
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5070 in this case, the @id is a `js2-xml-ref' that is part of an infix '<'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5071 expression whose parent is a `js2-xml-dot-query-node'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5072 namespace
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5073 at-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5074 colon-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5075
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5076 (defsubst js2-xml-ref-node-attr-access-p (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5077 "Return non-nil if this expression began with an @-token."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5078 (and (numberp (js2-xml-ref-node-at-pos node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5079 (plusp (js2-xml-ref-node-at-pos node))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5080
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5081 (defstruct (js2-xml-prop-ref-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5082 (:include js2-xml-ref-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5083 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5084 (:constructor make-js2-xml-prop-ref-node (&key (type js2-REF_NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5085 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5086 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5087 propname
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5088 namespace
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5089 at-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5090 colon-pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5091 "AST node for an E4X XML [expr] property-ref expression.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5092 The JavaScript syntax is an optional @, an optional ns::, and a name.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5093
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5094 [ '@' ] [ name '::' ] name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5095
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5096 Examples include name, ns::name, ns::*, *::name, *::*, @attr, @ns::attr,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5097 @ns::*, @*::attr, @*::*, and @*.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5098
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5099 The node starts at the @ token, if present. Otherwise it starts at the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5100 namespace name. The node bounds extend through the closing right-bracket,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5101 or if it is missing due to a syntax error, through the end of the index
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5102 expression."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5103 propname)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5104
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5105 (put 'cl-struct-js2-xml-prop-ref-node 'js2-visitor 'js2-visit-xml-prop-ref-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5106 (put 'cl-struct-js2-xml-prop-ref-node 'js2-printer 'js2-print-xml-prop-ref-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5107
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5108 (defun js2-visit-xml-prop-ref-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5109 (if (js2-xml-prop-ref-node-namespace n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5110 (js2-visit-ast (js2-xml-prop-ref-node-namespace n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5111 (if (js2-xml-prop-ref-node-propname n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5112 (js2-visit-ast (js2-xml-prop-ref-node-propname n) v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5113
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5114 (defun js2-print-xml-prop-ref-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5115 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5116 (if (js2-xml-ref-node-attr-access-p n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5117 (insert "@"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5118 (when (js2-xml-prop-ref-node-namespace n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5119 (js2-print-ast (js2-xml-prop-ref-node-namespace n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5120 (insert "::"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5121 (if (js2-xml-prop-ref-node-propname n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5122 (js2-print-ast (js2-xml-prop-ref-node-propname n) 0)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5123
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5124 (defstruct (js2-xml-elem-ref-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5125 (:include js2-xml-ref-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5126 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5127 (:constructor make-js2-xml-elem-ref-node (&key (type js2-REF_MEMBER)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5128 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5129 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5130 expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5131 lb
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5132 rb
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5133 namespace
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5134 at-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5135 colon-pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5136 "AST node for an E4X XML [expr] member-ref expression.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5137 Syntax:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5138
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5139 [ '@' ] [ name '::' ] '[' expr ']'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5140
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5141 Examples include ns::[expr], @ns::[expr], @[expr], *::[expr] and @*::[expr].
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5142
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5143 Note that the form [expr] (i.e. no namespace or attribute-qualifier)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5144 is not a legal E4X XML element-ref expression, since it's already used
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5145 for standard JavaScript element-get array indexing. Hence, a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5146 `js2-xml-elem-ref-node' always has either the attribute-qualifier, a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5147 non-nil namespace node, or both.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5148
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5149 The node starts at the @ token, if present. Otherwise it starts
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5150 at the namespace name. The node bounds extend through the closing
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5151 right-bracket, or if it is missing due to a syntax error, through the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5152 end of the index expression."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5153 expr ; the bracketed index expression
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5154 lb
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5155 rb)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5156
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5157 (put 'cl-struct-js2-xml-elem-ref-node 'js2-visitor 'js2-visit-xml-elem-ref-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5158 (put 'cl-struct-js2-xml-elem-ref-node 'js2-printer 'js2-print-xml-elem-ref-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5159
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5160 (defun js2-visit-xml-elem-ref-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5161 (if (js2-xml-elem-ref-node-namespace n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5162 (js2-visit-ast (js2-xml-elem-ref-node-namespace n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5163 (if (js2-xml-elem-ref-node-expr n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5164 (js2-visit-ast (js2-xml-elem-ref-node-expr n) v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5165
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5166 (defun js2-print-xml-elem-ref-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5167 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5168 (if (js2-xml-ref-node-attr-access-p n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5169 (insert "@"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5170 (when (js2-xml-elem-ref-node-namespace n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5171 (js2-print-ast (js2-xml-elem-ref-node-namespace n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5172 (insert "::"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5173 (insert "[")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5174 (if (js2-xml-elem-ref-node-expr n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5175 (js2-print-ast (js2-xml-elem-ref-node-expr n) 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5176 (insert "]"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5177
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5178 ;;; Placeholder nodes for when we try parsing the XML literals structurally.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5179
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5180 (defstruct (js2-xml-start-tag-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5181 (:include js2-xml-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5182 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5183 (:constructor make-js2-xml-start-tag-node (&key (type js2-XML)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5184 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5185 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5186 name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5187 attrs
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5188 kids
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5189 empty-p)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5190 "AST node for an XML start-tag. Not currently used.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5191 The `kids' field is a lisp list of child content nodes."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5192 name ; a `js2-xml-name-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5193 attrs ; a lisp list of `js2-xml-attr-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5194 empty-p) ; t if this is an empty element such as <foo bar="baz"/>
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5195
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5196 (put 'cl-struct-js2-xml-start-tag-node 'js2-visitor 'js2-visit-xml-start-tag)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5197 (put 'cl-struct-js2-xml-start-tag-node 'js2-printer 'js2-print-xml-start-tag)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5198
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5199 (defun js2-visit-xml-start-tag (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5200 (js2-visit-ast (js2-xml-start-tag-node-name n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5201 (dolist (attr (js2-xml-start-tag-node-attrs n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5202 (js2-visit-ast attr v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5203 (js2-visit-block n v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5204
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5205 (defun js2-print-xml-start-tag (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5206 (insert (js2-make-pad i) "<")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5207 (js2-print-ast (js2-xml-start-tag-node-name n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5208 (when (js2-xml-start-tag-node-attrs n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5209 (insert " ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5210 (js2-print-list (js2-xml-start-tag-node-attrs n) " "))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5211 (insert ">"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5212
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5213 ;; I -think- I'm going to make the parent node the corresponding start-tag,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5214 ;; and add the end-tag to the kids list of the parent as well.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5215 (defstruct (js2-xml-end-tag-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5216 (:include js2-xml-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5217 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5218 (:constructor make-js2-xml-end-tag-node (&key (type js2-XML)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5219 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5220 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5221 name)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5222 "AST node for an XML end-tag. Not currently used."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5223 name) ; a `js2-xml-name-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5224
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5225 (put 'cl-struct-js2-xml-end-tag-node 'js2-visitor 'js2-visit-xml-end-tag)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5226 (put 'cl-struct-js2-xml-end-tag-node 'js2-printer 'js2-print-xml-end-tag)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5227
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5228 (defun js2-visit-xml-end-tag (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5229 (js2-visit-ast (js2-xml-end-tag-node-name n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5230
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5231 (defun js2-print-xml-end-tag (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5232 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5233 (insert "</")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5234 (js2-print-ast (js2-xml-end-tag-node-name n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5235 (insert ">"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5236
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5237 (defstruct (js2-xml-name-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5238 (:include js2-xml-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5239 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5240 (:constructor make-js2-xml-name-node (&key (type js2-XML)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5241 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5242 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5243 namespace
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5244 kids)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5245 "AST node for an E4X XML name. Not currently used.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5246 Any XML name can be qualified with a namespace, hence the namespace field.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5247 Further, any E4X name can be comprised of arbitrary JavaScript {} expressions.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5248 The kids field is a list of `js2-name-node' and `js2-xml-js-expr-node'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5249 For a simple name, the kids list has exactly one node, a `js2-name-node'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5250 namespace) ; a `js2-string-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5251
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5252 (put 'cl-struct-js2-xml-name-node 'js2-visitor 'js2-visit-xml-name-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5253 (put 'cl-struct-js2-xml-name-node 'js2-printer 'js2-print-xml-name-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5254
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5255 (defun js2-visit-xml-name-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5256 (js2-visit-ast (js2-xml-name-node-namespace n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5257
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5258 (defun js2-print-xml-name-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5259 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5260 (when (js2-xml-name-node-namespace n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5261 (js2-print-ast (js2-xml-name-node-namespace n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5262 (insert "::"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5263 (dolist (kid (js2-xml-name-node-kids n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5264 (js2-print-ast kid 0)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5265
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5266 (defstruct (js2-xml-pi-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5267 (:include js2-xml-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5268 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5269 (:constructor make-js2-xml-pi-node (&key (type js2-XML)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5270 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5271 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5272 name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5273 attrs)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5274 "AST node for an E4X XML processing instruction. Not currently used."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5275 name ; a `js2-xml-name-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5276 attrs) ; a list of `js2-xml-attr-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5277
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5278 (put 'cl-struct-js2-xml-pi-node 'js2-visitor 'js2-visit-xml-pi-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5279 (put 'cl-struct-js2-xml-pi-node 'js2-printer 'js2-print-xml-pi-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5280
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5281 (defun js2-visit-xml-pi-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5282 (js2-visit-ast (js2-xml-pi-node-name n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5283 (dolist (attr (js2-xml-pi-node-attrs n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5284 (js2-visit-ast attr v)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5285
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5286 (defun js2-print-xml-pi-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5287 (insert (js2-make-pad i) "<?")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5288 (js2-print-ast (js2-xml-pi-node-name n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5289 (when (js2-xml-pi-node-attrs n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5290 (insert " ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5291 (js2-print-list (js2-xml-pi-node-attrs n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5292 (insert "?>"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5293
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5294 (defstruct (js2-xml-cdata-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5295 (:include js2-xml-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5296 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5297 (:constructor make-js2-xml-cdata-node (&key (type js2-XML)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5298 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5299 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5300 content)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5301 "AST node for a CDATA escape section. Not currently used."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5302 content) ; a `js2-string-node' with node-property 'quote-type 'cdata
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5303
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5304 (put 'cl-struct-js2-xml-cdata-node 'js2-visitor 'js2-visit-xml-cdata-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5305 (put 'cl-struct-js2-xml-cdata-node 'js2-printer 'js2-print-xml-cdata-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5306
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5307 (defun js2-visit-xml-cdata-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5308 (js2-visit-ast (js2-xml-cdata-node-content n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5309
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5310 (defun js2-print-xml-cdata-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5311 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5312 (js2-print-ast (js2-xml-cdata-node-content n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5313
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5314 (defstruct (js2-xml-attr-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5315 (:include js2-xml-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5316 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5317 (:constructor make-js2-attr-node (&key (type js2-XML)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5318 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5319 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5320 name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5321 value
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5322 eq-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5323 quote-type)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5324 "AST node representing a foo='bar' XML attribute value. Not yet used."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5325 name ; a `js2-xml-name-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5326 value ; a `js2-xml-name-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5327 eq-pos ; buffer position of "=" sign
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5328 quote-type) ; 'single or 'double
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5329
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5330 (put 'cl-struct-js2-xml-attr-node 'js2-visitor 'js2-visit-xml-attr-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5331 (put 'cl-struct-js2-xml-attr-node 'js2-printer 'js2-print-xml-attr-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5332
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5333 (defun js2-visit-xml-attr-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5334 (js2-visit-ast (js2-xml-attr-node-name n) v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5335 (js2-visit-ast (js2-xml-attr-node-value n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5336
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5337 (defun js2-print-xml-attr-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5338 (let ((quote (if (eq (js2-xml-attr-node-quote-type n) 'single)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5339 "'"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5340 "\"")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5341 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5342 (js2-print-ast (js2-xml-attr-node-name n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5343 (insert "=" quote)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5344 (js2-print-ast (js2-xml-attr-node-value n) 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5345 (insert quote)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5346
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5347 (defstruct (js2-xml-text-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5348 (:include js2-xml-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5349 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5350 (:constructor make-js2-text-node (&key (type js2-XML)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5351 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5352 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5353 content)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5354 "AST node for an E4X XML text node. Not currently used."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5355 content) ; a lisp list of `js2-string-node' and `js2-xml-js-expr-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5356
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5357 (put 'cl-struct-js2-xml-text-node 'js2-visitor 'js2-visit-xml-text-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5358 (put 'cl-struct-js2-xml-text-node 'js2-printer 'js2-print-xml-text-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5359
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5360 (defun js2-visit-xml-text-node (n v)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5361 (js2-visit-ast (js2-xml-text-node-content n) v))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5362
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5363 (defun js2-print-xml-text-node (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5364 (insert (js2-make-pad i))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5365 (dolist (kid (js2-xml-text-node-content n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5366 (js2-print-ast kid)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5367
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5368 (defstruct (js2-xml-comment-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5369 (:include js2-xml-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5370 (:constructor nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5371 (:constructor make-js2-xml-comment-node (&key (type js2-XML)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5372 (pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5373 len)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5374 "AST node for E4X XML comment. Not currently used.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5375
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5376 (put 'cl-struct-js2-xml-comment-node 'js2-visitor 'js2-visit-none)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5377 (put 'cl-struct-js2-xml-comment-node 'js2-printer 'js2-print-xml-comment)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5378
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5379 (defun js2-print-xml-comment (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5380 (insert (js2-make-pad i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5381 (js2-node-string n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5382
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5383 ;;; Node utilities
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5384
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5385 (defsubst js2-node-line (n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5386 "Fetch the source line number at the start of node N.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5387 This is O(n) in the length of the source buffer; use prudently."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5388 (1+ (count-lines (point-min) (js2-node-abs-pos n))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5389
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5390 (defsubst js2-block-node-kid (n i)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5391 "Return child I of node N, or nil if there aren't that many."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5392 (nth i (js2-block-node-kids n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5393
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5394 (defsubst js2-block-node-first (n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5395 "Return first child of block node N, or nil if there is none."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5396 (first (js2-block-node-kids n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5397
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5398 (defun js2-node-root (n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5399 "Return the root of the AST containing N.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5400 If N has no parent pointer, returns N."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5401 (let ((parent (js2-node-parent n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5402 (if parent
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5403 (js2-node-root parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5404 n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5405
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5406 (defun js2-node-position-in-parent (node &optional parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5407 "Return the position of NODE in parent's block-kids list.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5408 PARENT can be supplied if known. Positioned returned is zero-indexed.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5409 Returns 0 if NODE is not a child of a block statement, or if NODE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5410 is not a statement node."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5411 (let ((p (or parent (js2-node-parent node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5412 (i 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5413 (if (not (js2-block-node-p p))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5414 i
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5415 (or (js2-position node (js2-block-node-kids p))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5416 0))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5417
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5418 (defsubst js2-node-short-name (n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5419 "Return the short name of node N as a string, e.g. `js2-if-node'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5420 (substring (symbol-name (aref n 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5421 (length "cl-struct-")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5422
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5423 (defsubst js2-node-child-list (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5424 "Return the child list for NODE, a lisp list of nodes.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5425 Works for block nodes, array nodes, obj literals, funarg lists,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5426 var decls and try nodes (for catch clauses). Note that you should call
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5427 `js2-block-node-kids' on the function body for the body statements.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5428 Returns nil for zero-length child lists or unsupported nodes."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5429 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5430 ((js2-function-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5431 (js2-function-node-params node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5432 ((js2-block-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5433 (js2-block-node-kids node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5434 ((js2-try-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5435 (js2-try-node-catch-clauses node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5436 ((js2-array-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5437 (js2-array-node-elems node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5438 ((js2-object-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5439 (js2-object-node-elems node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5440 ((js2-call-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5441 (js2-call-node-args node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5442 ((js2-new-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5443 (js2-new-node-args node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5444 ((js2-var-decl-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5445 (js2-var-decl-node-kids node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5446 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5447 nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5448
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5449 (defsubst js2-node-set-child-list (node kids)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5450 "Set the child list for NODE to KIDS."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5451 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5452 ((js2-function-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5453 (setf (js2-function-node-params node) kids))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5454 ((js2-block-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5455 (setf (js2-block-node-kids node) kids))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5456 ((js2-try-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5457 (setf (js2-try-node-catch-clauses node) kids))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5458 ((js2-array-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5459 (setf (js2-array-node-elems node) kids))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5460 ((js2-object-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5461 (setf (js2-object-node-elems node) kids))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5462 ((js2-call-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5463 (setf (js2-call-node-args node) kids))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5464 ((js2-new-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5465 (setf (js2-new-node-args node) kids))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5466 ((js2-var-decl-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5467 (setf (js2-var-decl-node-kids node) kids))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5468 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5469 (error "Unsupported node type: %s" (js2-node-short-name node))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5470 kids)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5471
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5472 ;; All because Common Lisp doesn't support multiple inheritance for defstructs.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5473 (defconst js2-paren-expr-nodes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5474 '(cl-struct-js2-array-comp-loop-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5475 cl-struct-js2-array-comp-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5476 cl-struct-js2-call-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5477 cl-struct-js2-catch-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5478 cl-struct-js2-do-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5479 cl-struct-js2-elem-get-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5480 cl-struct-js2-for-in-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5481 cl-struct-js2-for-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5482 cl-struct-js2-function-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5483 cl-struct-js2-if-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5484 cl-struct-js2-let-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5485 cl-struct-js2-new-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5486 cl-struct-js2-paren-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5487 cl-struct-js2-switch-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5488 cl-struct-js2-while-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5489 cl-struct-js2-with-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5490 cl-struct-js2-xml-dot-query-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5491 "Node types that can have a parenthesized child expression.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5492 In particular, nodes that respond to `js2-node-lp' and `js2-node-rp'.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5493
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5494 (defsubst js2-paren-expr-node-p (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5495 "Return t for nodes that typically have a parenthesized child expression.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5496 Useful for computing the indentation anchors for arg-lists and conditions.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5497 Note that it may return a false positive, for instance when NODE is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5498 a `js2-new-node' and there are no arguments or parentheses."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5499 (memq (aref node 0) js2-paren-expr-nodes))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5500
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5501 ;; Fake polymorphism... yech.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5502 (defsubst js2-node-lp (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5503 "Return relative left-paren position for NODE, if applicable.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5504 For `js2-elem-get-node' structs, returns left-bracket position.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5505 Note that the position may be nil in the case of a parse error."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5506 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5507 ((js2-elem-get-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5508 (js2-elem-get-node-lb node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5509 ((js2-loop-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5510 (js2-loop-node-lp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5511 ((js2-function-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5512 (js2-function-node-lp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5513 ((js2-if-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5514 (js2-if-node-lp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5515 ((js2-new-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5516 (js2-new-node-lp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5517 ((js2-call-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5518 (js2-call-node-lp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5519 ((js2-paren-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5520 (js2-node-pos node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5521 ((js2-switch-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5522 (js2-switch-node-lp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5523 ((js2-catch-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5524 (js2-catch-node-lp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5525 ((js2-let-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5526 (js2-let-node-lp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5527 ((js2-array-comp-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5528 (js2-array-comp-node-lp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5529 ((js2-with-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5530 (js2-with-node-lp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5531 ((js2-xml-dot-query-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5532 (1+ (js2-infix-node-op-pos node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5533 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5534 (error "Unsupported node type: %s" (js2-node-short-name node)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5535
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5536 ;; Fake polymorphism... blech.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5537 (defsubst js2-node-rp (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5538 "Return relative right-paren position for NODE, if applicable.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5539 For `js2-elem-get-node' structs, returns right-bracket position.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5540 Note that the position may be nil in the case of a parse error."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5541 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5542 ((js2-elem-get-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5543 (js2-elem-get-node-lb node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5544 ((js2-loop-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5545 (js2-loop-node-rp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5546 ((js2-function-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5547 (js2-function-node-rp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5548 ((js2-if-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5549 (js2-if-node-rp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5550 ((js2-new-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5551 (js2-new-node-rp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5552 ((js2-call-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5553 (js2-call-node-rp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5554 ((js2-paren-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5555 (+ (js2-node-pos node) (js2-node-len node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5556 ((js2-switch-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5557 (js2-switch-node-rp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5558 ((js2-catch-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5559 (js2-catch-node-rp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5560 ((js2-let-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5561 (js2-let-node-rp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5562 ((js2-array-comp-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5563 (js2-array-comp-node-rp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5564 ((js2-with-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5565 (js2-with-node-rp node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5566 ((js2-xml-dot-query-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5567 (1+ (js2-xml-dot-query-node-rp node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5568 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5569 (error "Unsupported node type: %s" (js2-node-short-name node)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5570
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5571 (defsubst js2-node-first-child (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5572 "Returns the first element of `js2-node-child-list' for NODE."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5573 (car (js2-node-child-list node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5574
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5575 (defsubst js2-node-last-child (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5576 "Returns the last element of `js2-node-last-child' for NODE."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5577 (car (last (js2-node-child-list node))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5578
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5579 (defun js2-node-prev-sibling (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5580 "Return the previous statement in parent.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5581 Works for parents supported by `js2-node-child-list'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5582 Returns nil if NODE is not in the parent, or PARENT is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5583 not a supported node, or if NODE is the first child."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5584 (let* ((p (js2-node-parent node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5585 (kids (js2-node-child-list p))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5586 (sib (car kids)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5587 (while (and kids
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5588 (neq node (cadr kids)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5589 (setq kids (cdr kids)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5590 sib (car kids)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5591 sib))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5592
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5593 (defun js2-node-next-sibling (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5594 "Return the next statement in parent block.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5595 Returns nil if NODE is not in the block, or PARENT is not
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5596 a block node, or if NODE is the last statement."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5597 (let* ((p (js2-node-parent node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5598 (kids (js2-node-child-list p)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5599 (while (and kids
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5600 (neq node (car kids)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5601 (setq kids (cdr kids)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5602 (cadr kids)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5603
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5604 (defun js2-node-find-child-before (pos parent &optional after)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5605 "Find the last child that starts before POS in parent.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5606 If AFTER is non-nil, returns first child starting after POS.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5607 POS is an absolute buffer position. PARENT is any node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5608 supported by `js2-node-child-list'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5609 Returns nil if no applicable child is found."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5610 (let ((kids (if (js2-function-node-p parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5611 (js2-block-node-kids (js2-function-node-body parent))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5612 (js2-node-child-list parent)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5613 (beg (if (js2-function-node-p parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5614 (js2-node-abs-pos (js2-function-node-body parent))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5615 (js2-node-abs-pos parent)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5616 kid
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5617 result
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5618 fn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5619 (continue t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5620 (setq fn (if after '> '<))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5621 (while (and kids continue)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5622 (setq kid (car kids))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5623 (if (funcall fn (+ beg (js2-node-pos kid)) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5624 (setq result kid
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5625 continue (if after nil t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5626 (setq continue (if after t nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5627 (setq kids (cdr kids)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5628 result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5629
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5630 (defun js2-node-find-child-after (pos parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5631 "Find first child that starts after POS in parent.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5632 POS is an absolute buffer position. PARENT is any node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5633 supported by `js2-node-child-list'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5634 Returns nil if no applicable child is found."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5635 (js2-node-find-child-before pos parent 'after))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5636
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5637 (defun js2-node-replace-child (pos parent new-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5638 "Replace node at index POS in PARENT with NEW-NODE.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5639 Only works for parents supported by `js2-node-child-list'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5640 (let ((kids (js2-node-child-list parent))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5641 (i 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5642 (while (< i pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5643 (setq kids (cdr kids)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5644 i (1+ i)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5645 (setcar kids new-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5646 (js2-node-add-children parent new-node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5647
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5648 (defun js2-node-buffer (n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5649 "Return the buffer associated with AST N.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5650 Returns nil if the buffer is not set as a property on the root
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5651 node, or if parent links were not recorded during parsing."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5652 (let ((root (js2-node-root n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5653 (and root
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5654 (js2-ast-root-p root)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5655 (js2-ast-root-buffer root))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5656
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5657 (defsubst js2-block-node-push (n kid)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5658 "Push js2-node KID onto the end of js2-block-node N's child list.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5659 KID is always added to the -end- of the kids list.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5660 Function also calls `js2-node-add-children' to add the parent link."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5661 (let ((kids (js2-node-child-list n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5662 (if kids
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5663 (setcdr kids (nconc (cdr kids) (list kid)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5664 (js2-node-set-child-list n (list kid)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5665 (js2-node-add-children n kid)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5666
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5667 (defun js2-node-string (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5668 (let ((buf (js2-node-buffer node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5669 pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5670 (unless buf
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5671 (error "No buffer available for node %s" node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5672 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5673 (set-buffer buf)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5674 (buffer-substring-no-properties (setq pos (js2-node-abs-pos node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5675 (+ pos (js2-node-len node))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5676
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5677 ;; Container for storing the node we're looking for in a traversal.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5678 (defvar js2-discovered-node nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5679 (make-variable-buffer-local 'js2-discovered-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5680
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5681 ;; Keep track of absolute node position during traversals.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5682 (defvar js2-visitor-offset nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5683 (make-variable-buffer-local 'js2-visitor-offset)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5684
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5685 (defvar js2-node-search-point nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5686 (make-variable-buffer-local 'js2-node-search-point)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5687
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5688 (when js2-mode-dev-mode-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5689 (defun js2-find-node-at-point ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5690 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5691 (let ((node (js2-node-at-point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5692 (message "%s" (or node "No node found at point"))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5693 (defun js2-node-name-at-point ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5694 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5695 (let ((node (js2-node-at-point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5696 (message "%s" (if node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5697 (js2-node-short-name node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5698 "No node found at point.")))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5699
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5700 (defun js2-node-at-point (&optional pos skip-comments)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5701 "Return AST node at POS, a buffer position, defaulting to current point.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5702 The `js2-mode-ast' variable must be set to the current parse tree.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5703 Signals an error if the AST (`js2-mode-ast') is nil.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5704 Always returns a node - if it can't find one, it returns the root.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5705 If SKIP-COMMENTS is non-nil, comment nodes are ignored."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5706 (let ((ast js2-mode-ast)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5707 result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5708 (unless ast
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5709 (error "No JavaScript AST available"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5710 ;; Look through comments first, since they may be inside nodes that
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5711 ;; would otherwise report a match.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5712 (setq pos (or pos (point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5713 result (if (> pos (js2-node-abs-end ast))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5714 ast
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5715 (if (not skip-comments)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5716 (js2-comment-at-point pos))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5717 (unless result
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5718 (setq js2-discovered-node nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5719 js2-visitor-offset 0
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5720 js2-node-search-point pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5721 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5722 (catch 'js2-visit-done
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5723 (js2-visit-ast ast #'js2-node-at-point-visitor))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5724 (setq js2-visitor-offset nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5725 js2-node-search-point nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5726 (setq result js2-discovered-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5727 ;; may have found a comment beyond end of last child node,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5728 ;; since visiting the ast-root looks at the comment-list last.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5729 (if (and skip-comments
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5730 (js2-comment-node-p result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5731 (setq result nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5732 (or result js2-mode-ast)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5733
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5734 (defun js2-node-at-point-visitor (node end-p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5735 (let ((rel-pos (js2-node-pos node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5736 abs-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5737 abs-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5738 (point js2-node-search-point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5739 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5740 (end-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5741 ;; this evaluates to a non-nil return value, even if it's zero
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5742 (decf js2-visitor-offset rel-pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5743 ;; we already looked for comments before visiting, and don't want them now
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5744 ((js2-comment-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5745 nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5746 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5747 (setq abs-pos (incf js2-visitor-offset rel-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5748 ;; we only want to use the node if the point is before
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5749 ;; the last character position in the node, so we decrement
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5750 ;; the absolute end by 1.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5751 abs-end (+ abs-pos (js2-node-len node) -1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5752 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5753 ;; If this node starts after search-point, stop the search.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5754 ((> abs-pos point)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5755 (throw 'js2-visit-done nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5756 ;; If this node ends before the search-point, don't check kids.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5757 ((> point abs-end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5758 nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5759 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5760 ;; Otherwise point is within this node, possibly in a child.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5761 (setq js2-discovered-node node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5762 t)))))) ; keep processing kids to look for more specific match
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5763
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5764 (defsubst js2-block-comment-p (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5765 "Return non-nil if NODE is a comment node of format `jsdoc' or `block'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5766 (and (js2-comment-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5767 (memq (js2-comment-node-format node) '(jsdoc block))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5768
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5769 ;; TODO: put the comments in a vector and binary-search them instead
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5770 (defun js2-comment-at-point (&optional pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5771 "Look through scanned comment nodes for one containing POS.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5772 POS is a buffer position that defaults to current point.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5773 Function returns nil if POS was not in any comment node."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5774 (let ((ast js2-mode-ast)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5775 (x (or pos (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5776 beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5777 end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5778 (unless ast
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5779 (error "No JavaScript AST available"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5780 (catch 'done
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5781 ;; Comments are stored in lexical order.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5782 (dolist (comment (js2-ast-root-comments ast) nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5783 (setq beg (js2-node-abs-pos comment)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5784 end (+ beg (js2-node-len comment)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5785 (if (and (>= x beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5786 (<= x end))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5787 (throw 'done comment))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5788
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5789 (defun js2-mode-find-parent-fn (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5790 "Find function enclosing NODE.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5791 Returns nil if NODE is not inside a function."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5792 (setq node (js2-node-parent node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5793 (while (and node (not (js2-function-node-p node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5794 (setq node (js2-node-parent node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5795 (and (js2-function-node-p node) node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5796
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5797 (defun js2-mode-find-enclosing-fn (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5798 "Find function or root enclosing NODE."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5799 (if (js2-ast-root-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5800 node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5801 (setq node (js2-node-parent node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5802 (while (not (or (js2-ast-root-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5803 (js2-function-node-p node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5804 (setq node (js2-node-parent node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5805 node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5806
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5807 (defun js2-mode-find-enclosing-node (beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5808 "Find script or function fully enclosing BEG and END."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5809 (let ((node (js2-node-at-point beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5810 pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5811 (continue t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5812 (while continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5813 (if (or (js2-ast-root-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5814 (and (js2-function-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5815 (<= (setq pos (js2-node-abs-pos node)) beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5816 (>= (+ pos (js2-node-len node)) end)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5817 (setq continue nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5818 (setq node (js2-node-parent node))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5819 node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5820
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5821 (defun js2-node-parent-script-or-fn (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5822 "Find script or function immediately enclosing NODE.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5823 If NODE is the ast-root, returns nil."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5824 (if (js2-ast-root-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5825 nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5826 (setq node (js2-node-parent node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5827 (while (and node (not (or (js2-function-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5828 (js2-script-node-p node))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5829 (setq node (js2-node-parent node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5830 node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5831
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5832 (defsubst js2-nested-function-p (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5833 "Return t if NODE is a nested function, or is inside a nested function."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5834 (js2-function-node-p (if (js2-function-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5835 (js2-node-parent-script-or-fn node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5836 (js2-node-parent-script-or-fn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5837 (js2-node-parent-script-or-fn node)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5838
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5839 (defsubst js2-mode-shift-kids (kids start offset)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5840 (dolist (kid kids)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5841 (if (> (js2-node-pos kid) start)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5842 (incf (js2-node-pos kid) offset))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5843
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5844 (defsubst js2-mode-shift-children (parent start offset)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5845 "Update start-positions of all children of PARENT beyond START."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5846 (let ((root (js2-node-root parent)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5847 (js2-mode-shift-kids (js2-node-child-list parent) start offset)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5848 (js2-mode-shift-kids (js2-ast-root-comments root) start offset)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5849
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5850 (defsubst js2-node-is-descendant (node ancestor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5851 "Return t if NODE is a descendant of ANCESTOR."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5852 (while (and node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5853 (neq node ancestor))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5854 (setq node (js2-node-parent node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5855 node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5856
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5857 ;;; visitor infrastructure
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5858
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5859 (defun js2-visit-none (node callback)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5860 "Visitor for AST node that have no node children."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5861 nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5862
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5863 (defun js2-print-none (node indent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5864 "Visitor for AST node with no printed representation.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5865
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5866 (defun js2-print-body (node indent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5867 "Print a statement, or a block without braces."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5868 (if (js2-block-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5869 (dolist (kid (js2-block-node-kids node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5870 (js2-print-ast kid indent))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5871 (js2-print-ast node indent)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5872
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5873 (defun js2-print-list (args &optional delimiter)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5874 (loop with len = (length args)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5875 for arg in args
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5876 for count from 1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5877 do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5878 (js2-print-ast arg 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5879 (if (< count len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5880 (insert (or delimiter ", ")))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5881
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5882 (defun js2-print-tree (ast)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5883 "Prints an AST to the current buffer.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5884 Makes `js2-ast-parent-nodes' available to the printer functions."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5885 (let ((max-lisp-eval-depth (max max-lisp-eval-depth 1500)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5886 (js2-print-ast ast)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5887
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5888 (defun js2-print-ast (node &optional indent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5889 "Helper function for printing AST nodes.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5890 Requires `js2-ast-parent-nodes' to be non-nil.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5891 You should use `js2-print-tree' instead of this function."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5892 (let ((printer (get (aref node 0) 'js2-printer))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5893 (i (or indent 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5894 (pos (js2-node-abs-pos node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5895 ;; TODO: wedge comments in here somewhere
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5896 (if printer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5897 (funcall printer node i))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5898
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5899 (defconst js2-side-effecting-tokens
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5900 (let ((tokens (make-bool-vector js2-num-tokens nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5901 (dolist (tt (list js2-ASSIGN
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5902 js2-ASSIGN_ADD
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5903 js2-ASSIGN_BITAND
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5904 js2-ASSIGN_BITOR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5905 js2-ASSIGN_BITXOR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5906 js2-ASSIGN_DIV
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5907 js2-ASSIGN_LSH
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5908 js2-ASSIGN_MOD
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5909 js2-ASSIGN_MUL
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5910 js2-ASSIGN_RSH
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5911 js2-ASSIGN_SUB
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5912 js2-ASSIGN_URSH
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5913 js2-BLOCK
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5914 js2-BREAK
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5915 js2-CALL
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5916 js2-CATCH
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5917 js2-CATCH_SCOPE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5918 js2-CONST
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5919 js2-CONTINUE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5920 js2-DEBUGGER
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5921 js2-DEC
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5922 js2-DELPROP
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5923 js2-DEL_REF
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5924 js2-DO
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5925 js2-ELSE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5926 js2-EMPTY
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5927 js2-ENTERWITH
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5928 js2-EXPORT
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5929 js2-EXPR_RESULT
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5930 js2-FINALLY
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5931 js2-FOR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5932 js2-FUNCTION
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5933 js2-GOTO
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5934 js2-IF
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5935 js2-IFEQ
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5936 js2-IFNE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5937 js2-IMPORT
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5938 js2-INC
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5939 js2-JSR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5940 js2-LABEL
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5941 js2-LEAVEWITH
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5942 js2-LET
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5943 js2-LETEXPR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5944 js2-LOCAL_BLOCK
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5945 js2-LOOP
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5946 js2-NEW
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5947 js2-REF_CALL
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5948 js2-RETHROW
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5949 js2-RETURN
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5950 js2-RETURN_RESULT
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5951 js2-SEMI
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5952 js2-SETELEM
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5953 js2-SETELEM_OP
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5954 js2-SETNAME
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5955 js2-SETPROP
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5956 js2-SETPROP_OP
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5957 js2-SETVAR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5958 js2-SET_REF
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5959 js2-SET_REF_OP
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5960 js2-SWITCH
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5961 js2-TARGET
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5962 js2-THROW
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5963 js2-TRY
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5964 js2-VAR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5965 js2-WHILE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5966 js2-WITH
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5967 js2-WITHEXPR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5968 js2-YIELD))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5969 (aset tokens tt t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5970 (if js2-instanceof-has-side-effects
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5971 (aset tokens js2-INSTANCEOF t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5972 tokens))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5973
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5974 (defun js2-node-has-side-effects (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5975 "Return t if NODE has side effects."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5976 (when node ; makes it easier to handle malformed expressions
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5977 (let ((tt (js2-node-type node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5978 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5979 ;; This doubtless needs some work, since EXPR_VOID is used
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5980 ;; in several ways in Rhino, and I may not have caught them all.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5981 ;; I'll wait for people to notice incorrect warnings.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5982 ((and (= tt js2-EXPR_VOID)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5983 (js2-expr-stmt-node-p node)) ; but not if EXPR_RESULT
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5984 (js2-node-has-side-effects (js2-expr-stmt-node-expr node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5985
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5986 ((= tt js2-COMMA)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5987 (js2-node-has-side-effects (js2-infix-node-right node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5988
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5989 ((or (= tt js2-AND)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5990 (= tt js2-OR))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5991 (or (js2-node-has-side-effects (js2-infix-node-right node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5992 (js2-node-has-side-effects (js2-infix-node-left node))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5993
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5994 ((= tt js2-HOOK)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5995 (and (js2-node-has-side-effects (js2-cond-node-true-expr node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5996 (js2-node-has-side-effects (js2-cond-node-false-expr node))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5997
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5998 ((js2-paren-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5999 (js2-node-has-side-effects (js2-paren-node-expr node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6000
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6001 ((= tt js2-ERROR) ; avoid cascaded error messages
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6002 nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6003 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6004 (aref js2-side-effecting-tokens tt))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6005
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6006 (defun js2-member-expr-leftmost-name (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6007 "For an expr such as foo.bar.baz, return leftmost node foo.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6008 NODE is any `js2-node' object. If it represents a member expression,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6009 which is any sequence of property gets, element-gets, function calls,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6010 or xml descendants/filter operators, then we look at the lexically
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6011 leftmost (first) node in the chain. If it is a name-node we return it.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6012 Note that NODE can be a raw name-node and it will be returned as well.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6013 If NODE is not a name-node or member expression, or if it is a member
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6014 expression whose leftmost target is not a name node, returns nil."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6015 (let ((continue t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6016 result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6017 (while (and continue (not result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6018 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6019 ((js2-name-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6020 (setq result node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6021 ((js2-prop-get-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6022 (setq node (js2-prop-get-node-left node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6023 ;; TODO: handle call-nodes, xml-nodes, others?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6024 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6025 (setq continue nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6026 result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6027
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6028 (defconst js2-stmt-node-types
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6029 (list js2-BLOCK
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6030 js2-BREAK
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6031 js2-CONTINUE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6032 js2-DEFAULT ; e4x "default xml namespace" statement
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6033 js2-DO
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6034 js2-EXPR_RESULT
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6035 js2-EXPR_VOID
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6036 js2-FOR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6037 js2-IF
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6038 js2-RETURN
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6039 js2-SWITCH
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6040 js2-THROW
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6041 js2-TRY
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6042 js2-WHILE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6043 js2-WITH)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6044 "Node types that only appear in statement contexts.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6045 The list does not include nodes that always appear as the child
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6046 of another specific statement type, such as switch-cases,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6047 catch and finally blocks, and else-clauses. The list also excludes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6048 nodes like yield, let and var, which may appear in either expression
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6049 or statement context, and in the latter context always have a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6050 `js2-expr-stmt-node' parent. Finally, the list does not include
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6051 functions or scripts, which are treated separately from statements
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6052 by the JavaScript parser and runtime.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6053
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6054 (defun js2-stmt-node-p (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6055 "Heuristic for figuring out if NODE is a statement.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6056 Some node types can appear in either an expression context or a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6057 statement context, e.g. let-nodes, yield-nodes, and var-decl nodes.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6058 For these node types in a statement context, the parent will be a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6059 `js2-expr-stmt-node'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6060 Functions aren't included in the check."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6061 (memq (js2-node-type node) js2-stmt-node-types))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6062
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6063 (defsubst js2-mode-find-first-stmt (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6064 "Search upward starting from NODE looking for a statement.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6065 For purposes of this function, a `js2-function-node' counts."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6066 (while (not (or (js2-stmt-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6067 (js2-function-node-p node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6068 (setq node (js2-node-parent node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6069 node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6070
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6071 (defun js2-node-parent-stmt (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6072 "Return the node's first ancestor that is a statement.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6073 Returns nil if NODE is a `js2-ast-root'. Note that any expression
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6074 appearing in a statement context will have a parent that is a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6075 `js2-expr-stmt-node' that will be returned by this function."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6076 (let ((parent (js2-node-parent node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6077 (if (or (null parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6078 (js2-stmt-node-p parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6079 (and (js2-function-node-p parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6080 (neq (js2-function-node-form parent) 'FUNCTION_EXPRESSION)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6081 parent
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6082 (js2-node-parent-stmt parent))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6083
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6084 ;; Roshan James writes:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6085 ;; Does consistent-return analysis on the function body when strict mode is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6086 ;; enabled.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6087 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6088 ;; function (x) { return (x+1) }
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6089 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6090 ;; is ok, but
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6091 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6092 ;; function (x) { if (x < 0) return (x+1); }
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6093 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6094 ;; is not because the function can potentially return a value when the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6095 ;; condition is satisfied and if not, the function does not explicitly
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6096 ;; return a value.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6097 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6098 ;; This extends to checking mismatches such as "return" and "return <value>"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6099 ;; used in the same function. Warnings are not emitted if inconsistent
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6100 ;; returns exist in code that can be statically shown to be unreachable.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6101 ;; Ex.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6102 ;; function (x) { while (true) { ... if (..) { return value } ... } }
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6103 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6104 ;; emits no warning. However if the loop had a break statement, then a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6105 ;; warning would be emitted.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6106 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6107 ;; The consistency analysis looks at control structures such as loops, ifs,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6108 ;; switch, try-catch-finally blocks, examines the reachable code paths and
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6109 ;; warns the user about an inconsistent set of termination possibilities.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6110 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6111 ;; These flags enumerate the possible ways a statement/function can
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6112 ;; terminate. These flags are used by endCheck() and by the Parser to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6113 ;; detect inconsistent return usage.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6114 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6115 ;; END_UNREACHED is reserved for code paths that are assumed to always be
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6116 ;; able to execute (example: throw, continue)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6117 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6118 ;; END_DROPS_OFF indicates if the statement can transfer control to the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6119 ;; next one. Statement such as return dont. A compound statement may have
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6120 ;; some branch that drops off control to the next statement.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6121 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6122 ;; END_RETURNS indicates that the statement can return with no value.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6123 ;; END_RETURNS_VALUE indicates that the statement can return a value.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6124 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6125 ;; A compound statement such as
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6126 ;; if (condition) {
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6127 ;; return value;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6128 ;; }
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6129 ;; Will be detected as (END_DROPS_OFF | END_RETURN_VALUE) by endCheck()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6130
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6131 (defconst js2-END_UNREACHED 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6132 (defconst js2-END_DROPS_OFF 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6133 (defconst js2-END_RETURNS 2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6134 (defconst js2-END_RETURNS_VALUE 4)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6135 (defconst js2-END_YIELDS 8)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6136
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6137 (defun js2-has-consistent-return-usage (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6138 "Check that every return usage in a function body is consistent.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6139 Returns t if the function satisfies strict mode requirement."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6140 (let ((n (js2-end-check node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6141 ;; either it doesn't return a value in any branch...
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6142 (or (js2-flag-not-set-p n js2-END_RETURNS_VALUE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6143 ;; or it returns a value (or is unreached) at every branch
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6144 (js2-flag-not-set-p n (logior js2-END_DROPS_OFF
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6145 js2-END_RETURNS
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6146 js2-END_YIELDS)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6147
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6148 (defun js2-end-check-if (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6149 "Returns in the then and else blocks must be consistent with each other.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6150 If there is no else block, then the return statement can fall through.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6151 Returns logical OR of END_* flags"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6152 (let ((th (js2-if-node-then-part node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6153 (el (js2-if-node-else-part node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6154 (if (null th)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6155 js2-END_UNREACHED
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6156 (logior (js2-end-check th) (if el
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6157 (js2-end-check el)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6158 js2-END_DROPS_OFF)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6159
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6160 (defun js2-end-check-switch (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6161 "Consistency of return statements is checked between the case statements.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6162 If there is no default, then the switch can fall through. If there is a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6163 default, we check to see if all code paths in the default return or if
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6164 there is a code path that can fall through.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6165 Returns logical OR of END_* flags."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6166 (let ((rv js2-END_UNREACHED)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6167 default-case)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6168 ;; examine the cases
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6169 (catch 'break
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6170 (dolist (c (js2-switch-node-cases node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6171 (if (js2-case-node-expr c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6172 (js2-set-flag rv (js2-end-check-block c))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6173 (setq default-case c)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6174 (throw 'break nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6175
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6176 ;; we don't care how the cases drop into each other
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6177 (js2-clear-flag rv js2-END_DROPS_OFF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6178
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6179 ;; examine the default
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6180 (js2-set-flag rv (if default-case
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6181 (js2-end-check default-case)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6182 js2-END_DROPS_OFF))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6183 rv))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6184
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6185 (defun js2-end-check-try (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6186 "If the block has a finally, return consistency is checked in the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6187 finally block. If all code paths in the finally return, then the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6188 returns in the try-catch blocks don't matter. If there is a code path
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6189 that does not return or if there is no finally block, the returns
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6190 of the try and catch blocks are checked for mismatch.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6191 Returns logical OR of END_* flags."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6192 (let ((finally (js2-try-node-finally-block node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6193 rv)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6194 ;; check the finally if it exists
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6195 (setq rv (if finally
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6196 (js2-end-check (js2-finally-node-body finally))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6197 js2-END_DROPS_OFF))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6198
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6199 ;; If the finally block always returns, then none of the returns
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6200 ;; in the try or catch blocks matter.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6201 (when (js2-flag-set-p rv js2-END_DROPS_OFF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6202 (js2-clear-flag rv js2-END_DROPS_OFF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6203
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6204 ;; examine the try block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6205 (js2-set-flag rv (js2-end-check (js2-try-node-try-block node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6206
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6207 ;; check each catch block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6208 (dolist (cb (js2-try-node-catch-clauses node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6209 (js2-set-flag rv (js2-end-check (js2-catch-node-block cb)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6210 rv))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6211
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6212 (defun js2-end-check-loop (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6213 "Return statement in the loop body must be consistent. The default
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6214 assumption for any kind of a loop is that it will eventually terminate.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6215 The only exception is a loop with a constant true condition. Code that
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6216 follows such a loop is examined only if one can statically determine
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6217 that there is a break out of the loop.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6218
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6219 for(... ; ... ; ...) {}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6220 for(... in ... ) {}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6221 while(...) { }
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6222 do { } while(...)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6223
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6224 Returns logical OR of END_* flags."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6225 (let ((rv (js2-end-check (js2-loop-node-body node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6226 (condition (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6227 ((js2-while-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6228 (js2-while-node-condition node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6229 ((js2-do-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6230 (js2-do-node-condition node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6231 ((js2-for-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6232 (js2-for-node-condition node)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6233
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6234 ;; check to see if the loop condition is always true
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6235 (if (and condition
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6236 (eq (js2-always-defined-boolean-p condition) 'ALWAYS_TRUE))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6237 (js2-clear-flag rv js2-END_DROPS_OFF))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6238
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6239 ;; look for effect of breaks
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6240 (js2-set-flag rv (js2-node-get-prop node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6241 'CONTROL_BLOCK_PROP
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6242 js2-END_UNREACHED))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6243 rv))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6244
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6245 (defun js2-end-check-block (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6246 "A general block of code is examined statement by statement.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6247 If any statement (even a compound one) returns in all branches, then
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6248 subsequent statements are not examined.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6249 Returns logical OR of END_* flags."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6250 (let* ((rv js2-END_DROPS_OFF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6251 (kids (js2-block-node-kids node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6252 (n (car kids)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6253 ;; Check each statment. If the statement can continue onto the next
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6254 ;; one (i.e. END_DROPS_OFF is set), then check the next statement.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6255 (while (and n (js2-flag-set-p rv js2-END_DROPS_OFF))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6256 (js2-clear-flag rv js2-END_DROPS_OFF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6257 (js2-set-flag rv (js2-end-check n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6258 (setq kids (cdr kids)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6259 n (car kids)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6260 rv))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6261
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6262 (defun js2-end-check-label (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6263 "A labeled statement implies that there may be a break to the label.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6264 The function processes the labeled statement and then checks the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6265 CONTROL_BLOCK_PROP property to see if there is ever a break to the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6266 particular label.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6267 Returns logical OR of END_* flags."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6268 (let ((rv (js2-end-check (js2-labeled-stmt-node-stmt node))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6269 (logior rv (js2-node-get-prop node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6270 'CONTROL_BLOCK_PROP
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6271 js2-END_UNREACHED))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6272
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6273 (defun js2-end-check-break (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6274 "When a break is encountered annotate the statement being broken
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6275 out of by setting its CONTROL_BLOCK_PROP property.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6276 Returns logical OR of END_* flags."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6277 (and (js2-break-node-target node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6278 (js2-node-set-prop (js2-break-node-target node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6279 'CONTROL_BLOCK_PROP
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6280 js2-END_DROPS_OFF))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6281 js2-END_UNREACHED)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6282
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6283 (defun js2-end-check (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6284 "Examine the body of a function, doing a basic reachability analysis.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6285 Returns a combination of flags END_* flags that indicate
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6286 how the function execution can terminate. These constitute only the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6287 pessimistic set of termination conditions. It is possible that at
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6288 runtime certain code paths will never be actually taken. Hence this
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6289 analysis will flag errors in cases where there may not be errors.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6290 Returns logical OR of END_* flags"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6291 (let (kid)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6292 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6293 ((js2-break-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6294 (js2-end-check-break node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6295
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6296 ((js2-expr-stmt-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6297 (if (setq kid (js2-expr-stmt-node-expr node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6298 (js2-end-check kid)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6299 js2-END_DROPS_OFF))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6300
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6301 ((or (js2-continue-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6302 (js2-throw-node-p node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6303 js2-END_UNREACHED)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6304
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6305 ((js2-return-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6306 (if (setq kid (js2-return-node-retval node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6307 js2-END_RETURNS_VALUE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6308 js2-END_RETURNS))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6309
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6310 ((js2-loop-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6311 (js2-end-check-loop node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6312
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6313 ((js2-switch-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6314 (js2-end-check-switch node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6315
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6316 ((js2-labeled-stmt-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6317 (js2-end-check-label node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6318
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6319 ((js2-if-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6320 (js2-end-check-if node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6321
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6322 ((js2-try-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6323 (js2-end-check-try node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6324
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6325 ((js2-block-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6326 (if (null (js2-block-node-kids node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6327 js2-END_DROPS_OFF
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6328 (js2-end-check-block node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6329
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6330 ((js2-yield-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6331 js2-END_YIELDS)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6332
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6333 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6334 js2-END_DROPS_OFF))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6335
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6336 (defun js2-always-defined-boolean-p (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6337 "Check if NODE always evaluates to true or false in boolean context.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6338 Returns 'ALWAYS_TRUE, 'ALWAYS_FALSE, or nil if it's neither always true
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6339 nor always false."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6340 (let ((tt (js2-node-type node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6341 num)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6342 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6343 ((or (= tt js2-FALSE) (= tt js2-NULL))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6344 'ALWAYS_FALSE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6345 ((= tt js2-TRUE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6346 'ALWAYS_TRUE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6347 ((= tt js2-NUMBER)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6348 (setq num (js2-number-node-num-value node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6349 (if (and (not (eq num 0.0e+NaN))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6350 (not (zerop num)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6351 'ALWAYS_TRUE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6352 'ALWAYS_FALSE))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6353 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6354 nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6355
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6356 (provide 'js2-ast)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6357
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6358 ;;; js2-ast.el ends here
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6359 ;;; js2-highlight.el --- JavaScript syntax coloring support
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6360
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6361 ;; Author: Steve Yegge (steve.yegge@gmail.com)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6362 ;; Keywords: javascript languages
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6363
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6364 ;;; Code:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6365
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6366
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6367 (defsubst js2-set-face (beg end face &optional record)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6368 "Fontify a region. If RECORD is non-nil, record for later."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6369 (when (plusp js2-highlight-level)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6370 (setq beg (min (point-max) beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6371 beg (max (point-min) beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6372 end (min (point-max) end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6373 end (max (point-min) end))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6374 (if record
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6375 (push (list beg end face) js2-mode-fontifications)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6376 (put-text-property beg end 'face face))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6377
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6378 (defsubst js2-set-kid-face (pos kid len face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6379 "Set-face on a child node.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6380 POS is absolute buffer position of parent.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6381 KID is the child node.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6382 LEN is the length to fontify.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6383 FACE is the face to fontify with."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6384 (js2-set-face (+ pos (js2-node-pos kid))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6385 (+ pos (js2-node-pos kid) (js2-node-len kid))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6386 face))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6387
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6388 (defsubst js2-fontify-kwd (start length)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6389 (js2-set-face start (+ start length) 'font-lock-keyword-face))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6390
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6391 (defsubst js2-clear-face (beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6392 (remove-text-properties beg end '(face nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6393 help-echo nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6394 point-entered nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6395 c-in-sws nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6396
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6397 (defsubst js2-record-text-property (beg end prop value)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6398 "Record a text property to set when parsing finishes."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6399 (push (list beg end prop value) js2-mode-deferred-properties))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6400
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6401 (defconst js2-ecma-global-props
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6402 (concat "^"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6403 (regexp-opt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6404 '("Infinity" "NaN" "undefined" "arguments") t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6405 "$")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6406 "Value properties of the Ecma-262 Global Object.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6407 Shown at or above `js2-highlight-level' 2.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6408
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6409 ;; might want to add the name "arguments" to this list?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6410 (defconst js2-ecma-object-props
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6411 (concat "^"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6412 (regexp-opt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6413 '("prototype" "__proto__" "__parent__") t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6414 "$")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6415 "Value properties of the Ecma-262 Object constructor.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6416 Shown at or above `js2-highlight-level' 2.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6417
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6418 (defconst js2-ecma-global-funcs
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6419 (concat
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6420 "^"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6421 (regexp-opt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6422 '("decodeURI" "decodeURIComponent" "encodeURI" "encodeURIComponent"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6423 "eval" "isFinite" "isNaN" "parseFloat" "parseInt") t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6424 "$")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6425 "Function properties of the Ecma-262 Global object.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6426 Shown at or above `js2-highlight-level' 2.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6427
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6428 (defconst js2-ecma-number-props
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6429 (concat "^"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6430 (regexp-opt '("MAX_VALUE" "MIN_VALUE" "NaN"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6431 "NEGATIVE_INFINITY"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6432 "POSITIVE_INFINITY") t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6433 "$")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6434 "Properties of the Ecma-262 Number constructor.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6435 Shown at or above `js2-highlight-level' 2.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6436
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6437 (defconst js2-ecma-date-props "^\\(parse\\|UTC\\)$"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6438 "Properties of the Ecma-262 Date constructor.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6439 Shown at or above `js2-highlight-level' 2.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6440
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6441
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6442 (defconst js2-ecma-math-props
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6443 (concat "^"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6444 (regexp-opt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6445 '("E" "LN10" "LN2" "LOG2E" "LOG10E" "PI" "SQRT1_2" "SQRT2")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6446 t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6447 "$")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6448 "Properties of the Ecma-262 Math object.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6449 Shown at or above `js2-highlight-level' 2.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6450
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6451
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6452 (defconst js2-ecma-math-funcs
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6453 (concat "^"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6454 (regexp-opt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6455 '("abs" "acos" "asin" "atan" "atan2" "ceil" "cos" "exp" "floor"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6456 "log" "max" "min" "pow" "random" "round" "sin" "sqrt" "tan") t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6457 "$")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6458 "Function properties of the Ecma-262 Math object.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6459 Shown at or above `js2-highlight-level' 2.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6460
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6461 (defconst js2-ecma-function-props
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6462 (concat
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6463 "^"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6464 (regexp-opt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6465 '(;; properties of the Object prototype object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6466 "hasOwnProperty" "isPrototypeOf" "propertyIsEnumerable"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6467 "toLocaleString" "toString" "valueOf"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6468 ;; properties of the Function prototype object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6469 "apply" "call"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6470 ;; properties of the Array prototype object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6471 "concat" "join" "pop" "push" "reverse" "shift" "slice" "sort"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6472 "splice" "unshift"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6473 ;; properties of the String prototype object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6474 "charAt" "charCodeAt" "fromCharCode" "indexOf" "lastIndexOf"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6475 "localeCompare" "match" "replace" "search" "split" "substring"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6476 "toLocaleLowerCase" "toLocaleUpperCase" "toLowerCase"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6477 "toUpperCase"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6478 ;; properties of the Number prototype object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6479 "toExponential" "toFixed" "toPrecision"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6480 ;; properties of the Date prototype object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6481 "getDate" "getDay" "getFullYear" "getHours" "getMilliseconds"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6482 "getMinutes" "getMonth" "getSeconds" "getTime"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6483 "getTimezoneOffset" "getUTCDate" "getUTCDay" "getUTCFullYear"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6484 "getUTCHours" "getUTCMilliseconds" "getUTCMinutes" "getUTCMonth"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6485 "getUTCSeconds" "setDate" "setFullYear" "setHours"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6486 "setMilliseconds" "setMinutes" "setMonth" "setSeconds" "setTime"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6487 "setUTCDate" "setUTCFullYear" "setUTCHours" "setUTCMilliseconds"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6488 "setUTCMinutes" "setUTCMonth" "setUTCSeconds" "toDateString"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6489 "toLocaleDateString" "toLocaleString" "toLocaleTimeString"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6490 "toTimeString" "toUTCString"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6491 ;; properties of the RegExp prototype object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6492 "exec" "test"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6493 ;; SpiderMonkey/Rhino extensions, versions 1.5+
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6494 "toSource" "__defineGetter__" "__defineSetter__"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6495 "__lookupGetter__" "__lookupSetter__" "__noSuchMethod__"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6496 "every" "filter" "forEach" "lastIndexOf" "map" "some")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6497 t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6498 "$")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6499 "Built-in functions defined by Ecma-262 and SpiderMonkey extensions.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6500 Shown at or above `js2-highlight-level' 3.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6501
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6502 (defsubst js2-parse-highlight-prop-get (parent target prop call-p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6503 (let ((target-name (and target
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6504 (js2-name-node-p target)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6505 (js2-name-node-name target)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6506 (prop-name (if prop (js2-name-node-name prop)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6507 (level1 (>= js2-highlight-level 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6508 (level2 (>= js2-highlight-level 2))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6509 (level3 (>= js2-highlight-level 3))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6510 pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6511 face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6512 (when level2
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6513 (if call-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6514 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6515 ((and target prop)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6516 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6517 ((and level3 (string-match js2-ecma-function-props prop-name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6518 (setq face 'font-lock-builtin-face))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6519 ((and target-name prop)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6520 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6521 ((string= target-name "Date")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6522 (if (string-match js2-ecma-date-props prop-name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6523 (setq face 'font-lock-builtin-face)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6524 ((string= target-name "Math")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6525 (if (string-match js2-ecma-math-funcs prop-name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6526 (setq face 'font-lock-builtin-face)))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6527 (prop
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6528 (if (string-match js2-ecma-global-funcs prop-name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6529 (setq face 'font-lock-builtin-face))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6530 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6531 ((and target prop)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6532 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6533 ((string= target-name "Number")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6534 (if (string-match js2-ecma-number-props prop-name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6535 (setq face 'font-lock-constant-face)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6536 ((string= target-name "Math")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6537 (if (string-match js2-ecma-math-props prop-name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6538 (setq face 'font-lock-constant-face)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6539 (prop
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6540 (if (string-match js2-ecma-object-props prop-name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6541 (setq face 'font-lock-constant-face)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6542 (when face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6543 (js2-set-face (setq pos (+ (js2-node-pos parent) ; absolute
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6544 (js2-node-pos prop))) ; relative
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6545 (+ pos (js2-node-len prop))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6546 face)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6547
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6548 (defun js2-parse-highlight-member-expr-node (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6549 "Perform syntax highlighting of EcmaScript built-in properties.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6550 The variable `js2-highlight-level' governs this highighting."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6551 (let (face target prop name pos end parent call-p callee)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6552 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6553 ;; case 1: simple name, e.g. foo
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6554 ((js2-name-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6555 (setq name (js2-name-node-name node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6556 ;; possible for name to be nil in rare cases - saw it when
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6557 ;; running js2-mode on an elisp buffer. Might as well try to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6558 ;; make it so js2-mode never barfs.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6559 (when name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6560 (setq face (if (string-match js2-ecma-global-props name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6561 'font-lock-constant-face))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6562 (when face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6563 (setq pos (js2-node-pos node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6564 end (+ pos (js2-node-len node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6565 (js2-set-face pos end face))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6566
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6567 ;; case 2: property access or function call
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6568 ((or (js2-prop-get-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6569 ;; highlight function call if expr is a prop-get node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6570 ;; or a plain name (i.e. unqualified function call)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6571 (and (setq call-p (js2-call-node-p node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6572 (setq callee (js2-call-node-target node)) ; separate setq!
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6573 (or (js2-prop-get-node-p callee)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6574 (js2-name-node-p callee))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6575 (setq parent node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6576 node (if call-p callee node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6577 (if (and call-p (js2-name-node-p callee))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6578 (setq prop callee)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6579 (setq target (js2-prop-get-node-left node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6580 prop (js2-prop-get-node-right node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6581 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6582 ((js2-name-node-p target)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6583 (if (js2-name-node-p prop)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6584 ;; case 2a: simple target, simple prop name, e.g. foo.bar
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6585 (js2-parse-highlight-prop-get parent target prop call-p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6586 ;; case 2b: simple target, complex name, e.g. foo.x[y]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6587 (js2-parse-highlight-prop-get parent target nil call-p)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6588 ((js2-name-node-p prop)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6589 ;; case 2c: complex target, simple name, e.g. x[y].bar
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6590 (js2-parse-highlight-prop-get parent target prop call-p)))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6591
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6592 (defun js2-parse-highlight-member-expr-fn-name (expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6593 "Highlight the `baz' in function foo.bar.baz(args) {...}.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6594 This is experimental Rhino syntax. EXPR is the foo.bar.baz member expr.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6595 We currently only handle the case where the last component is a prop-get
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6596 of a simple name. Called before EXPR has a parent node."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6597 (let (pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6598 (name (and (js2-prop-get-node-p expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6599 (js2-prop-get-node-right expr))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6600 (when (js2-name-node-p name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6601 (js2-set-face (setq pos (+ (js2-node-pos expr) ; parent is absolute
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6602 (js2-node-pos name)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6603 (+ pos (js2-node-len name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6604 'font-lock-function-name-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6605 'record))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6606
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6607 ;; source: http://jsdoc.sourceforge.net/
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6608 ;; Note - this syntax is for Google's enhanced jsdoc parser that
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6609 ;; allows type specifications, and needs work before entering the wild.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6610
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6611 (defconst js2-jsdoc-param-tag-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6612 (concat "^\\s-*\\*+\\s-*\\(@"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6613 "\\(?:param\\|argument\\)"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6614 "\\)"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6615 "\\s-*\\({[^}]+}\\)?" ; optional type
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6616 "\\s-*\\([a-zA-Z0-9_$]+\\)?" ; name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6617 "\\>")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6618 "Matches jsdoc tags with optional type and optional param name.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6619
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6620 (defconst js2-jsdoc-typed-tag-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6621 (concat "^\\s-*\\*+\\s-*\\(@\\(?:"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6622 (regexp-opt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6623 '("requires" "return" "returns" "throw" "throws"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6624 "\\)\\)\\s-*\\({[^}]+}\\)?")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6625 "Matches jsdoc tags with optional type.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6626
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6627 (defconst js2-jsdoc-arg-tag-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6628 (concat "^\\s-*\\*+\\s-*\\(@\\(?:"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6629 (regexp-opt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6630 '("base" "extends" "member" "type" "version"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6631 "\\)\\)\\s-+\\([^ \t]+\\)")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6632 "Matches jsdoc tags with a single argument.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6633
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6634 (defconst js2-jsdoc-empty-tag-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6635 (concat "^\\s-*\\*+\\s-*\\(@\\(?:"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6636 (regexp-opt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6637 '("addon" "author" "class" "constructor" "deprecated" "exec"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6638 "exception" "fileoverview" "final" "ignore" "private"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6639 "\\)\\)\\s-*")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6640 "Matches empty jsdoc tags.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6641
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6642 (defconst js2-jsdoc-link-tag-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6643 "{\\(@link\\)\\s-+\\([^#}\n]+\\)\\(#.+\\)?}"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6644 "Matches a jsdoc link tag.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6645
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6646 (defconst js2-jsdoc-see-tag-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6647 "^\\s-*\\*+\\s-*\\(@see\\)\\s-+\\([^#}\n]+\\)\\(#.+\\)?"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6648 "Matches a jsdoc @see tag.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6649
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6650 (defconst js2-jsdoc-html-tag-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6651 "\\(</?\\)\\([a-zA-Z]+\\)\\s-*\\(/?>\\)"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6652 "Matches a simple (no attributes) html start- or end-tag.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6653
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6654 (defsubst js2-jsdoc-highlight-helper ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6655 (js2-set-face (match-beginning 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6656 (match-end 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6657 'js2-jsdoc-tag-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6658 (if (match-beginning 2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6659 (if (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6660 (goto-char (match-beginning 2))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6661 (= (char-after) ?{))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6662 (js2-set-face (1+ (match-beginning 2))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6663 (1- (match-end 2))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6664 'js2-jsdoc-type-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6665 (js2-set-face (match-beginning 2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6666 (match-end 2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6667 'js2-jsdoc-value-face)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6668 (if (match-beginning 3)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6669 (js2-set-face (match-beginning 3)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6670 (match-end 3)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6671 'js2-jsdoc-value-face)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6672
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6673 (defun js2-highlight-jsdoc (ast)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6674 "Highlight doc comment tags."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6675 (let ((comments (js2-ast-root-comments ast))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6676 beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6677 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6678 (dolist (node comments)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6679 (when (eq (js2-comment-node-format node) 'jsdoc)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6680 (setq beg (js2-node-abs-pos node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6681 end (+ beg (js2-node-len node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6682 (save-restriction
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6683 (narrow-to-region beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6684 (dolist (re (list js2-jsdoc-param-tag-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6685 js2-jsdoc-typed-tag-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6686 js2-jsdoc-arg-tag-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6687 js2-jsdoc-link-tag-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6688 js2-jsdoc-see-tag-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6689 js2-jsdoc-empty-tag-regexp))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6690 (goto-char beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6691 (while (re-search-forward re nil t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6692 (js2-jsdoc-highlight-helper)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6693 ;; simple highlighting for html tags
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6694 (goto-char beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6695 (while (re-search-forward js2-jsdoc-html-tag-regexp nil t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6696 (js2-set-face (match-beginning 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6697 (match-end 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6698 'js2-jsdoc-html-tag-delimiter-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6699 (js2-set-face (match-beginning 2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6700 (match-end 2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6701 'js2-jsdoc-html-tag-name-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6702 (js2-set-face (match-beginning 3)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6703 (match-end 3)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6704 'js2-jsdoc-html-tag-delimiter-face))))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6705
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6706 (defun js2-highlight-assign-targets (node left right)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6707 "Highlight function properties and external variables."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6708 (let (leftpos end name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6709 ;; highlight vars and props assigned function values
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6710 (when (js2-function-node-p right)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6711 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6712 ;; var foo = function() {...}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6713 ((js2-name-node-p left)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6714 (setq name left))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6715
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6716 ;; foo.bar.baz = function() {...}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6717 ((and (js2-prop-get-node-p left)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6718 (js2-name-node-p (js2-prop-get-node-right left)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6719 (setq name (js2-prop-get-node-right left))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6720
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6721 (when name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6722 (js2-set-face (setq leftpos (js2-node-abs-pos name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6723 (+ leftpos (js2-node-len name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6724 'font-lock-function-name-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6725 'record)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6726
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6727 ;; save variable assignments so we can check for undeclared later
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6728 ;; (can't do it here since var decls can come at end of script)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6729 (when (and js2-highlight-external-variables
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6730 (setq name (js2-member-expr-leftmost-name left)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6731 (push (list name js2-current-scope
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6732 (setq leftpos (js2-node-abs-pos name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6733 (setq end (+ leftpos (js2-node-len name))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6734 js2-recorded-assignments))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6735
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6736 (defun js2-highlight-undeclared-vars ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6737 "After entire parse is finished, look for undeclared variable assignments.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6738 Have to wait until entire buffer is parsed, since JavaScript permits var
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6739 decls to occur after they're used.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6740
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6741 We currently use a simple heuristic to rule out complaining about built-ins:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6742 if the name is capitalized we don't highlight it. This could be improved a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6743 bit by declaring all the Ecma global object, constructor and function names
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6744 in a hashtable, but we'd still wind up complaining about all the DHTML
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6745 builtins, the Mozilla builtins, etc."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6746 (let (name first-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6747 (dolist (entry js2-recorded-assignments)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6748 (destructuring-bind (name-node scope pos end) entry
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6749 (setq name (js2-name-node-name name-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6750 first-char (aref name 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6751 (unless (or (and (>= first-char ?A) (<= first-char ?Z))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6752 (js2-get-defining-scope scope name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6753 (js2-set-face pos end 'js2-external-variable-face 'record)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6754 (js2-record-text-property pos end 'help-echo "Undeclared variable")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6755 (js2-record-text-property pos end 'point-entered #'js2-echo-help))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6756 (setq js2-recorded-assignments nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6757
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6758 (provide 'js2-highlight)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6759
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6760 ;;; js2-highlight.el ends here
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6761 ;;; js2-browse.el --- browsing/hierarchy support for js2-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6762
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6763 ;; Author: Steve Yegge (steve.yegge@gmail.com)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6764 ;; Keywords: javascript languages
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6765
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6766 ;; Commentary:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6767 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6768 ;; We currently only support imenu, but eventually should support speedbar and
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6769 ;; possibly other browsing mechanisms.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6770 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6771 ;; The basic strategy is to identify function assignment targets of the form
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6772 ;; `foo.bar.baz', convert them to (list foo bar baz <position>), and push the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6773 ;; list into `js2-imenu-recorder'. The lists are merged into a trie-like tree
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6774 ;; for imenu after parsing is finished.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6775 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6776 ;; A `foo.bar.baz' assignment target may be expressed in many ways in
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6777 ;; JavaScript, and the general problem is undecidable. However, several forms
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6778 ;; are readily recognizable at parse-time; the forms we attempt to recognize
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6779 ;; include:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6780 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6781 ;; function foo() -- function declaration
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6782 ;; foo = function() -- function expression assigned to variable
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6783 ;; foo.bar.baz = function() -- function expr assigned to nested property-get
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6784 ;; foo = {bar: function()} -- fun prop in object literal assigned to var
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6785 ;; foo = {bar: {baz: function()}} -- inside nested object literal
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6786 ;; foo.bar = {baz: function()}} -- obj lit assigned to nested prop get
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6787 ;; a.b = {c: {d: function()}} -- nested obj lit assigned to nested prop get
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6788 ;; foo = {get bar() {...}} -- getter/setter in obj literal
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6789 ;; function foo() {function bar() {...}} -- nested function
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6790 ;; foo['a'] = function() -- fun expr assigned to deterministic element-get
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6791 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6792 ;; This list boils down to a few forms that can be combined recursively.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6793 ;; Top-level named function declarations include both the left-hand (name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6794 ;; and the right-hand (function value) expressions needed to produce an imenu
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6795 ;; entry. The other "right-hand" forms we need to look for are:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6796 ;; - functions declared as props/getters/setters in object literals
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6797 ;; - nested named function declarations
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6798 ;; The "left-hand" expressions that functions can be assigned to include:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6799 ;; - local/global variables
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6800 ;; - nested property-get expressions like a.b.c.d
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6801 ;; - element gets like foo[10] or foo['bar'] where the index
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6802 ;; expression can be trivially converted to a property name. They
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6803 ;; effectively then become property gets.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6804 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6805 ;; All the different definition types are canonicalized into the form
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6806 ;; foo.bar.baz = position-of-function-keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6807 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6808 ;; We need to build a trie-like structure for imenu. As an example,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6809 ;; consider the following JavaScript code:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6810 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6811 ;; a = function() {...} // function at position 5
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6812 ;; b = function() {...} // function at position 25
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6813 ;; foo = function() {...} // function at position 100
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6814 ;; foo.bar = function() {...} // function at position 200
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6815 ;; foo.bar.baz = function() {...} // function at position 300
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6816 ;; foo.bar.zab = function() {...} // function at position 400
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6817 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6818 ;; During parsing we accumulate an entry for each definition in
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6819 ;; the variable `js2-imenu-recorder', like so:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6820 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6821 ;; '((a 5)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6822 ;; (b 25)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6823 ;; (foo 100)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6824 ;; (foo bar 200)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6825 ;; (foo bar baz 300)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6826 ;; (foo bar zab 400))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6827 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6828 ;; After parsing these entries are merged into this alist-trie:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6829 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6830 ;; '((a . 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6831 ;; (b . 2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6832 ;; (foo (<definition> . 3)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6833 ;; (bar (<definition> . 6)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6834 ;; (baz . 100)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6835 ;; (zab . 200))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6836 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6837 ;; Note the wacky need for a <definition> name. The token can be anything
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6838 ;; that isn't a valid JavaScript identifier, because you might make foo
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6839 ;; a function and then start setting properties on it that are also functions.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6840
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6841 ;;; Code:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6842
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6843
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6844 (defsubst js2-prop-node-name (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6845 "Return the name of a node that may be a property-get/property-name.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6846 If NODE is not a valid name-node, string-node or integral number-node,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6847 returns nil. Otherwise returns the string name/value of the node."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6848 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6849 ((js2-name-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6850 (js2-name-node-name node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6851 ((js2-string-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6852 (js2-string-node-value node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6853 ((and (js2-number-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6854 (string-match "^[0-9]+$" (js2-number-node-value node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6855 (js2-number-node-value node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6856 ((js2-this-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6857 "this")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6858
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6859 (defsubst js2-node-qname-component (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6860 "Test function: return the name of this node, if it contributes to a qname.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6861 Returns nil if the node doesn't contribute."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6862 (copy-sequence
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6863 (or (js2-prop-node-name node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6864 (if (and (js2-function-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6865 (js2-function-node-name node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6866 (js2-name-node-name (js2-function-node-name node))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6867
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6868 (defsubst js2-record-function-qname (fn-node qname)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6869 "Associate FN-NODE with its QNAME for later lookup.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6870 This is used in postprocessing the chain list. When we find a chain
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6871 whose first element is a js2-THIS keyword node, we look up the parent
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6872 function and see (using this map) whether it is the tail of a chain.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6873 If so, we replace the this-node with a copy of the parent's qname."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6874 (unless js2-imenu-function-map
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6875 (setq js2-imenu-function-map (make-hash-table :test 'eq)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6876 (puthash fn-node qname js2-imenu-function-map))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6877
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6878 (defun js2-record-imenu-functions (node &optional var)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6879 "Record function definitions for imenu.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6880 NODE is a function node or an object literal.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6881 VAR, if non-nil, is the expression that NODE is being assigned to."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6882 (when js2-parse-ide-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6883 (let ((fun-p (js2-function-node-p node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6884 qname left fname-node pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6885 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6886 ;; non-anonymous function declaration?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6887 ((and fun-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6888 (not var)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6889 (setq fname-node (js2-function-node-name node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6890 (push (setq qname (list fname-node (js2-node-pos node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6891 js2-imenu-recorder)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6892 (js2-record-function-qname node qname))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6893
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6894 ;; for remaining forms, compute left-side tree branch first
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6895 ((and var (setq qname (js2-compute-nested-prop-get var)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6896 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6897 ;; foo.bar.baz = function
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6898 (fun-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6899 (push (nconc qname (list (js2-node-pos node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6900 js2-imenu-recorder)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6901 (js2-record-function-qname node qname))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6902 ;; foo.bar.baz = object-literal
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6903 ;; look for nested functions: {a: {b: function() {...} }}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6904 ((js2-object-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6905 (js2-record-object-literal node qname))))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6906
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6907 (defun js2-compute-nested-prop-get (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6908 "If NODE is of form foo.bar.baz, return component nodes as a list.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6909 Otherwise returns nil. Element-gets can be treated as property-gets
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6910 if the index expression is a name, a string, or a positive integer."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6911 (let (left right head)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6912 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6913 ((or (js2-name-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6914 (js2-this-node-p node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6915 (list node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6916 ;; foo.bar.baz is parenthesized as (foo.bar).baz => right operand is a leaf
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6917 ((js2-prop-get-node-p node) ; includes elem-get nodes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6918 (setq left (js2-prop-get-node-left node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6919 right (js2-prop-get-node-right node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6920 (if (and (or (js2-prop-get-node-p left) ; left == foo.bar
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6921 (js2-name-node-p left)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6922 (js2-this-node-p left)) ; or left == foo
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6923 (or (js2-name-node-p right) ; .bar
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6924 (js2-string-node-p right) ; ['bar']
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6925 (and (js2-number-node-p right) ; [10]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6926 (string-match "^[0-9]+$"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6927 (js2-number-node-value right)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6928 (if (setq head (js2-compute-nested-prop-get left))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6929 (nconc head (list right))))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6930
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6931 (defun js2-record-object-literal (node qname)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6932 "Recursively process an object literal looking for functions.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6933 NODE is an object literal that is the right-hand child of an assignment
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6934 expression. QNAME is a list of nodes representing the assignment target,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6935 e.g. for foo.bar.baz = {...}, QNAME is (foo-node bar-node baz-node).
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6936 We do a depth-first traversal of NODE. Any functions we find are prefixed
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6937 with QNAME plus the property name of the function and appended to the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6938 variable `js2-imenu-recorder'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6939 ;; Elements are relative to parent position, which is still absolute,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6940 ;; since the parser passes the assignment target and value expressions
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6941 ;; to us before they are added as children of the assignment node.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6942 (let ((pos (js2-node-pos node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6943 left right)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6944 (dolist (e (js2-object-node-elems node)) ; e is a `js2-object-prop-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6945 (setq left (js2-infix-node-left e))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6946 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6947 ;; foo: function() {...}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6948 ((js2-function-node-p (setq right (js2-infix-node-right e)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6949 (when (js2-prop-node-name left)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6950 ;; As a policy decision, we record the position of the property,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6951 ;; not the position of the `function' keyword, since the property
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6952 ;; is effectively the name of the function.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6953 (push (append qname (list left) (list (+ pos (js2-node-pos e))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6954 js2-imenu-recorder)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6955 (js2-record-function-qname right qname)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6956 ;; foo: {object-literal} -- add foo to qname and recurse
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6957 ((js2-object-node-p right)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6958 (js2-record-object-literal right
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6959 (append qname (list (js2-infix-node-left e)))))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6960
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6961 (defsubst js2-node-top-level-decl-p (node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6962 "Return t if NODE's name is defined in the top-level scope.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6963 Also returns t if NODE's name is not defined in any scope, since it implies
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6964 that it's an external variable, which must also be in the top-level scope."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6965 (let* ((name (js2-prop-node-name node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6966 (this-scope (js2-node-get-enclosing-scope node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6967 defining-scope)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6968 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6969 ((js2-this-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6970 nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6971 ((null this-scope)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6972 t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6973 ((setq defining-scope (js2-get-defining-scope this-scope name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6974 (js2-ast-root-p defining-scope))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6975 (t t))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6976
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6977 (defun js2-browse-postprocess-chains (chains)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6978 "Modify function-declaration name chains after parsing finishes.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6979 Some of the information is only available after the parse tree is complete.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6980 For instance, following a 'this' reference requires a parent function node."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6981 (let (result head fn parent-chain p elem)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6982 (dolist (chain chains)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6983 ;; examine the head of each node to get its defining scope
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6984 (setq head (car chain))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6985 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6986 ;; if top-level/external, keep as-is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6987 ((js2-node-top-level-decl-p head)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6988 (push chain result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6989 ;; check for a this-reference
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6990 ((eq (js2-node-type head) js2-THIS)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6991 (setq fn (js2-node-parent-script-or-fn head))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6992 ;; if there is no parent function, or if the parent function
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6993 ;; is nested, discard the head node and keep the rest of the chain.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6994 (if (or (null fn) (js2-nested-function-p fn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6995 (push (cdr chain) result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6996 ;; else look up parent in function-map. If not found, discard chain.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6997 (when (setq parent-chain (and js2-imenu-function-map
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6998 (gethash fn js2-imenu-function-map)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6999 ;; else discard head node and prefix parent fn qname, which is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7000 ;; the parent-chain sans tail, to this chain.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7001 (push (append (butlast parent-chain) (cdr chain)) result))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7002 ;; finally replace each node in each chain with its name.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7003 (dolist (chain result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7004 (setq p chain)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7005 (while p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7006 (if (js2-node-p (setq elem (car p)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7007 (setcar p (js2-node-qname-component elem)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7008 (setq p (cdr p))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7009 result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7010
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7011 ;; Merge name chains into a trie-like tree structure of nested lists.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7012 ;; To simplify construction of the trie, we first build it out using the rule
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7013 ;; that the trie consists of lists of pairs. Each pair is a 2-element array:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7014 ;; [key, num-or-list]. The second element can be a number; if so, this key
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7015 ;; is a leaf-node with only one value. (I.e. there is only one declaration
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7016 ;; associated with the key at this level.) Otherwise the second element is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7017 ;; a list of pairs, with the rule applied recursively. This symmetry permits
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7018 ;; a simple recursive formulation.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7019 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7020 ;; js2-mode is building the data structure for imenu. The imenu documentation
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7021 ;; claims that it's the structure above, but in practice it wants the children
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7022 ;; at the same list level as the key for that level, which is how I've drawn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7023 ;; the "Expected final result" above. We'll postprocess the trie to remove the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7024 ;; list wrapper around the children at each level.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7025 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7026 ;; A completed nested imenu-alist entry looks like this:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7027 ;; '(("foo"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7028 ;; ("<definition>" . 7)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7029 ;; ("bar"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7030 ;; ("a" . 40)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7031 ;; ("b" . 60))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7032 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7033 ;; In particular, the documentation for `imenu--index-alist' says that
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7034 ;; a nested sub-alist element looks like (INDEX-NAME SUB-ALIST).
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7035 ;; The sub-alist entries immediately follow INDEX-NAME, the head of the list.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7036
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7037 (defsubst js2-treeify (lst)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7038 "Convert (a b c d) to (a ((b ((c d)))))"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7039 (if (null (cddr lst)) ; list length <= 2
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7040 lst
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7041 (list (car lst) (list (js2-treeify (cdr lst))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7042
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7043 (defun js2-build-alist-trie (chains trie)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7044 "Merge declaration name chains into a trie-like alist structure for imenu.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7045 CHAINS is the qname chain list produced during parsing. TRIE is a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7046 list of elements built up so far."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7047 (let (head tail pos branch kids)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7048 (dolist (chain chains)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7049 (setq head (car chain)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7050 tail (cdr chain)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7051 pos (if (numberp (car tail)) (car tail))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7052 branch (js2-find-if (lambda (n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7053 (string= (car n) head))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7054 trie)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7055 kids (second branch))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7056 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7057 ;; case 1: this key isn't in the trie yet
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7058 ((null branch)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7059 (if trie
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7060 (setcdr (last trie) (list (js2-treeify chain)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7061 (setq trie (list (js2-treeify chain)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7062
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7063 ;; case 2: key is present with a single number entry: replace w/ list
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7064 ;; ("a1" 10) + ("a1" 20) => ("a1" (("<definition>" 10)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7065 ;; ("<definition>" 20)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7066 ((numberp kids)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7067 (setcar (cdr branch)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7068 (list (list "<definition-1>" kids)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7069 (if pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7070 (list "<definition-2>" pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7071 (js2-treeify tail)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7072
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7073 ;; case 3: key is there (with kids), and we're a number entry
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7074 (pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7075 (setcdr (last kids)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7076 (list
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7077 (list (format "<definition-%d>"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7078 (1+ (loop for kid in kids
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7079 count (eq ?< (aref (car kid) 0)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7080 pos))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7081
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7082 ;; case 4: key is there with kids, need to merge in our chain
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7083 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7084 (js2-build-alist-trie (list tail) kids))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7085 trie))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7086
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7087 (defun js2-flatten-trie (trie)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7088 "Convert TRIE to imenu-format.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7089 Recurses through nodes, and for each one whose second element is a list,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7090 appends the list's flattened elements to the current element. Also
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7091 changes the tails into conses. For instance, this pre-flattened trie
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7092
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7093 '(a ((b 20)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7094 (c ((d 30)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7095 (e 40)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7096
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7097 becomes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7098
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7099 '(a (b . 20)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7100 (c (d . 30)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7101 (e . 40)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7102
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7103 Note that the root of the trie has no key, just a list of chains.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7104 This is also true for the value of any key with multiple children,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7105 e.g. key 'c' in the example above."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7106 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7107 ((listp (car trie))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7108 (mapcar #'js2-flatten-trie trie))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7109 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7110 (if (numberp (second trie))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7111 (cons (car trie) (second trie))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7112 ;; else pop list and append its kids
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7113 (apply #'append (list (car trie)) (js2-flatten-trie (cdr trie)))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7114
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7115 (defun js2-build-imenu-index ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7116 "Turn `js2-imenu-recorder' into an imenu data structure."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7117 (unless (eq js2-imenu-recorder 'empty)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7118 (let* ((chains (js2-browse-postprocess-chains js2-imenu-recorder))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7119 (result (js2-build-alist-trie chains nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7120 (js2-flatten-trie result))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7121
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7122 (defun js2-test-print-chains (chains)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7123 "Print a list of qname chains.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7124 Each element of CHAINS is a list of the form (NODE [NODE *] pos);
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7125 i.e. one or more nodes, and an integer position as the list tail."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7126 (mapconcat (lambda (chain)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7127 (concat "("
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7128 (mapconcat (lambda (elem)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7129 (if (js2-node-p elem)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7130 (or (js2-node-qname-component elem)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7131 "nil")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7132 (number-to-string elem)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7133 chain
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7134 " ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7135 ")"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7136 chains
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7137 "\n"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7138
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7139
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7140 (provide 'js2-browse)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7141
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7142 ;;; js2-browse.el ends here
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7143 ;;; js2-parse.el --- JavaScript parser
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7144
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7145 ;; Author: Steve Yegge (steve.yegge@gmail.com)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7146 ;; Keywords: javascript languages
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7147
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7148 ;; Commentary:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7149
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7150 ;; This is based on Rhino's parser and tries to follow its code
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7151 ;; structure as closely as practical, so that changes to the Rhino
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7152 ;; parser can easily be propagated into this code. However, Rhino
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7153 ;; does not currently generate a usable AST representation, at least
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7154 ;; from an IDE perspective, so we build our own more suitable AST.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7155
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7156 ;; The AST node structures are defined in `js2-ast.el'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7157 ;; Every parser function that creates and returns an AST node has
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7158 ;; the following responsibilities:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7159
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7160 ;; 1) set the node start to the absolute buffer start position
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7161 ;; 2) set the node length to include any closing chars (RC, SEMI)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7162 ;; 3) fix up any child-node starts to be relative to this node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7163 ;; 4) set any field positions (e.g. keywords) relative to this node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7164 ;; 5) report any child nodes with `js2-node-add-children'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7165 ;; (note that this call fixes up start positions by default)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7166
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7167 ;; The resulting AST has all node start positions relative to the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7168 ;; parent nodes; only the root has an absolute start position.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7169
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7170 ;; Note: fontification is done inline while parsing. It used to be
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7171 ;; done in a second pass over the AST, but doing it inline is about
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7172 ;; twice as fast. Most of the fontification happens when tokens are
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7173 ;; scanned, and the parser has a few spots that perform extra
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7174 ;; fontification. In addition to speed, a second benefit of inline
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7175 ;; parsing is that if a long parse is interrupted, everything parsed
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7176 ;; so far is still fontified.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7177
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7178 ;; The editing mode that uses this parser, `js2-mode', directs the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7179 ;; parser to check periodically for user input. If user input
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7180 ;; arrives, the parse is abandoned, except for the highlighting that
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7181 ;; has occurred so far, and a re-parse is rescheduled for when Emacs
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7182 ;; becomes idle again. This works pretty well, but could be better.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7183 ;; In particular, when the user input has not resulted in changes to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7184 ;; the buffer (for instance, navigation input), the parse tree built
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7185 ;; so far should not be discarded, and the parse should continue where
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7186 ;; it left off. It will be some work to create what amounts to a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7187 ;; continuation, but it should not be unreasonably difficult.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7188
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7189 ;; TODO:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7190 ;; - make non-editing input restart parse at previous continuation
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7191 ;; - in Eclipse, sibling nodes never overlap start/end ranges
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7192 ;; - for getters, prop name and function nodes overlap
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7193 ;; - should write a debug tree visitor to look for overlaps
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7194 ;; - mark array and object literals as "destructuring" (node prop?)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7195 ;; so we can syntax-highlight them properly.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7196 ;; - figure out a way not to store value in string/name nodes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7197 ;; - needs a solution for synthetic nodes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7198
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7199 ;;; Code
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7200
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7201 (eval-and-compile
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7202 (require 'cl)) ; for delete-if
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7203
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7204
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7205 (defconst js2-version "1.7.0"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7206 "Version of JavaScript supported, plus minor js2 version.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7207
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7208 (defmacro js2-record-face (face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7209 "Record a style run of FACE for the current token."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7210 `(js2-set-face js2-token-beg js2-token-end ,face 'record))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7211
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7212 (defsubst js2-node-end (n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7213 "Computes the absolute end of node N.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7214 Use with caution! Assumes `js2-node-pos' is -absolute-, which
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7215 is only true until the node is added to its parent; i.e., while parsing."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7216 (+ (js2-node-pos n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7217 (js2-node-len n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7218
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7219 (defsubst js2-record-comment ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7220 (push (make-js2-comment-node :len (- js2-token-end js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7221 :format js2-ts-comment-type)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7222 js2-scanned-comments)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7223 (when js2-parse-ide-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7224 (js2-record-face 'font-lock-comment-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7225 (when (memq js2-ts-comment-type '(html preprocessor))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7226 ;; Tell cc-engine the bounds of the comment.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7227 (put-text-property js2-token-beg (1- js2-token-end) 'c-in-sws t))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7228
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7229 ;; This function is called depressingly often, so it should be fast.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7230 ;; Most of the time it's looking at the same token it peeked before.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7231 (defsubst js2-peek-token ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7232 "Returns the next token without consuming it.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7233 If previous token was consumed, calls scanner to get new token.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7234 If previous token was -not- consumed, returns it (idempotent).
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7235
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7236 This function will not return a newline (js2-EOL) - instead, it
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7237 gobbles newlines until it finds a non-newline token, and flags
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7238 that token as appearing just after a newline.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7239
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7240 This function will also not return a js2-COMMENT. Instead, it
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7241 records comments found in `js2-scanned-comments'. If the token
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7242 returned by this function immediately follows a jsdoc comment,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7243 the token is flagged as such.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7244
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7245 Note that this function always returned the un-flagged token!
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7246 The flags, if any, are saved in `js2-current-flagged-token'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7247 (if (/= js2-current-flagged-token js2-EOF) ; last token not consumed
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7248 js2-current-token ; most common case - return already-peeked token
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7249 (let ((tt (js2-get-token)) ; call scanner
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7250 saw-eol
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7251 face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7252 ;; process comments and whitespace
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7253 (while (or (= tt js2-EOL)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7254 (= tt js2-COMMENT))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7255 (if (= tt js2-EOL)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7256 (setq saw-eol t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7257 (setq saw-eol nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7258 (if js2-record-comments
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7259 (js2-record-comment)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7260 (setq tt (js2-get-token))) ; call scanner
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7261
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7262 (setq js2-current-token tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7263 js2-current-flagged-token (if saw-eol
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7264 (logior tt js2-ti-after-eol)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7265 tt))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7266 ;; perform lexical fontification as soon as token is scanned
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7267 (when js2-parse-ide-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7268 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7269 ((minusp tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7270 (js2-record-face 'js2-error-face))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7271 ((setq face (aref js2-kwd-tokens tt))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7272 (js2-record-face face))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7273 ((and (= tt js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7274 (equal js2-ts-string "undefined"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7275 (js2-record-face 'font-lock-constant-face))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7276 tt))) ; return unflagged token
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7277
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7278 (defsubst js2-peek-flagged-token ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7279 "Returns the current token along with any flags set for it."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7280 (js2-peek-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7281 js2-current-flagged-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7282
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7283 (defsubst js2-consume-token ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7284 (setq js2-current-flagged-token js2-EOF))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7285
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7286 (defsubst js2-next-token ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7287 (prog1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7288 (js2-peek-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7289 (js2-consume-token)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7290
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7291 (defsubst js2-next-flagged-token ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7292 (js2-peek-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7293 (prog1 js2-current-flagged-token
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7294 (js2-consume-token)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7295
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7296 (defsubst js2-match-token (match)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7297 "Consume and return t if next token matches MATCH, a bytecode.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7298 Returns nil and consumes nothing if MATCH is not the next token."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7299 (if (/= (js2-peek-token) match)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7300 nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7301 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7302 t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7303
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7304 (defsubst js2-valid-prop-name-token (tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7305 (or (= tt js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7306 (and js2-allow-keywords-as-property-names
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7307 (plusp tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7308 (aref js2-kwd-tokens tt))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7309
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7310 (defsubst js2-match-prop-name ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7311 "Consume token and return t if next token is a valid property name.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7312 It's valid if it's a js2-NAME, or `js2-allow-keywords-as-property-names'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7313 is non-nil and it's a keyword token."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7314 (if (js2-valid-prop-name-token (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7315 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7316 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7317 t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7318 nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7319
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7320 (defsubst js2-must-match-prop-name (msg-id &optional pos len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7321 (if (js2-match-prop-name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7322 t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7323 (js2-report-error msg-id nil pos len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7324 nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7325
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7326 (defsubst js2-peek-token-or-eol ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7327 "Return js2-EOL if the current token immediately follows a newline.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7328 Else returns the current token. Used in situations where we don't
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7329 consider certain token types valid if they are preceded by a newline.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7330 One example is the postfix ++ or -- operator, which has to be on the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7331 same line as its operand."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7332 (let ((tt (js2-peek-token)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7333 ;; Check for last peeked token flags
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7334 (if (js2-flag-set-p js2-current-flagged-token js2-ti-after-eol)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7335 js2-EOL
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7336 tt)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7337
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7338 (defsubst js2-set-check-for-label ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7339 (assert (= (logand js2-current-flagged-token js2-clear-ti-mask) js2-NAME))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7340 (js2-set-flag js2-current-flagged-token js2-ti-check-label))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7341
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7342 (defsubst js2-must-match (token msg-id &optional pos len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7343 "Match next token to token code TOKEN, or record a syntax error.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7344 MSG-ID is the error message to report if the match fails.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7345 Returns t on match, nil if no match."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7346 (if (js2-match-token token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7347 t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7348 (js2-report-error msg-id nil pos len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7349 nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7350
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7351 (defsubst js2-inside-function ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7352 (plusp js2-nesting-of-function))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7353
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7354 (defsubst js2-set-requires-activation ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7355 (if (js2-function-node-p js2-current-script-or-fn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7356 (setf (js2-function-node-needs-activation js2-current-script-or-fn) t)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7357
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7358 (defsubst js2-check-activation-name (name token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7359 (when (js2-inside-function)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7360 ;; skip language-version 1.2 check from Rhino
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7361 (if (or (string= "arguments" name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7362 (and js2-compiler-activation-names ; only used in codegen
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7363 (gethash name js2-compiler-activation-names)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7364 (js2-set-requires-activation))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7365
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7366 (defsubst js2-set-is-generator ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7367 (if (js2-function-node-p js2-current-script-or-fn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7368 (setf (js2-function-node-is-generator js2-current-script-or-fn) t)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7369
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7370 (defsubst js2-must-have-xml ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7371 (unless js2-compiler-xml-available
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7372 (js2-report-error "msg.XML.not.available")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7373
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7374 (defsubst js2-push-scope (scope)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7375 "Push SCOPE, a `js2-scope', onto the lexical scope chain."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7376 (assert (js2-scope-p scope))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7377 (assert (null (js2-scope-parent-scope scope)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7378 (assert (neq js2-current-scope scope))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7379 (setf (js2-scope-parent-scope scope) js2-current-scope
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7380 js2-current-scope scope))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7381
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7382 (defsubst js2-pop-scope ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7383 (setq js2-current-scope
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7384 (js2-scope-parent-scope js2-current-scope)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7385
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7386 (defsubst js2-enter-loop (loop-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7387 (push loop-node js2-loop-set)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7388 (push loop-node js2-loop-and-switch-set)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7389 (js2-push-scope loop-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7390 ;; Tell the current labeled statement (if any) its statement,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7391 ;; and set the jump target of the first label to the loop.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7392 ;; These are used in `js2-parse-continue' to verify that the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7393 ;; continue target is an actual labeled loop. (And for codegen.)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7394 (when js2-labeled-stmt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7395 (setf (js2-labeled-stmt-node-stmt js2-labeled-stmt) loop-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7396 (js2-label-node-loop (car (js2-labeled-stmt-node-labels
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7397 js2-labeled-stmt))) loop-node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7398
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7399 (defsubst js2-exit-loop ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7400 (pop js2-loop-set)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7401 (pop js2-loop-and-switch-set)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7402 (js2-pop-scope))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7403
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7404 (defsubst js2-enter-switch (switch-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7405 (push switch-node js2-loop-and-switch-set))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7406
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7407 (defsubst js2-exit-switch ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7408 (pop js2-loop-and-switch-set))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7409
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7410 (defun js2-parse (&optional buf cb)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7411 "Tells the js2 parser to parse a region of JavaScript.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7412
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7413 BUF is a buffer or buffer name containing the code to parse.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7414 Call `narrow-to-region' first to parse only part of the buffer.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7415
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7416 The returned AST root node is given some additional properties:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7417 `node-count' - total number of nodes in the AST
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7418 `buffer' - BUF. The buffer it refers to may change or be killed,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7419 so the value is not necessarily reliable.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7420
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7421 An optional callback CB can be specified to report parsing
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7422 progress. If `(functionp CB)' returns t, it will be called with
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7423 the current line number once before parsing begins, then again
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7424 each time the lexer reaches a new line number.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7425
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7426 CB can also be a list of the form `(symbol cb ...)' to specify
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7427 multiple callbacks with different criteria. Each symbol is a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7428 criterion keyword, and the following element is the callback to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7429 call
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7430
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7431 :line - called whenever the line number changes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7432 :token - called for each new token consumed
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7433
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7434 The list of criteria could be extended to include entering or
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7435 leaving a statement, an expression, or a function definition."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7436 (if (and cb (not (functionp cb)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7437 (error "criteria callbacks not yet implemented"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7438 (let ((inhibit-point-motion-hooks t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7439 (js2-compiler-xml-available (>= js2-language-version 160))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7440 ;; This is a recursive-descent parser, so give it a big stack.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7441 (max-lisp-eval-depth (max max-lisp-eval-depth 3000))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7442 (max-specpdl-size (max max-specpdl-size 3000))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7443 (case-fold-search nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7444 ast)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7445 (or buf (setq buf (current-buffer)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7446 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7447 (set-buffer buf)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7448 (setq js2-scanned-comments nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7449 js2-parsed-errors nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7450 js2-parsed-warnings nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7451 js2-imenu-recorder nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7452 js2-imenu-function-map nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7453 js2-label-set nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7454 (js2-init-scanner)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7455 (setq ast (js2-with-unmodifying-text-property-changes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7456 (js2-do-parse)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7457 (unless js2-ts-hit-eof
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7458 (js2-report-error "msg.got.syntax.errors" (length js2-parsed-errors)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7459 (setf (js2-ast-root-errors ast) js2-parsed-errors
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7460 (js2-ast-root-warnings ast) js2-parsed-warnings)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7461 ;; if we didn't find any declarations, put a dummy in this list so we
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7462 ;; don't end up re-parsing the buffer in `js2-mode-create-imenu-index'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7463 (unless js2-imenu-recorder
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7464 (setq js2-imenu-recorder 'empty))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7465 (run-hooks 'js2-parse-finished-hook)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7466 ast)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7467
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7468 ;; Corresponds to Rhino's Parser.parse() method.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7469 (defun js2-do-parse ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7470 "Parse current buffer starting from current point.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7471 Scanner should be initialized."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7472 (let ((pos js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7473 (end js2-ts-cursor) ; in case file is empty
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7474 root n tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7475 ;; initialize buffer-local parsing vars
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7476 (setf root (make-js2-ast-root :buffer (buffer-name) :pos pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7477 js2-current-script-or-fn root
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7478 js2-current-scope root
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7479 js2-current-flagged-token js2-EOF
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7480 js2-nesting-of-function 0
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7481 js2-labeled-stmt nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7482 js2-recorded-assignments nil) ; for js2-highlight
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7483
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7484 (while (/= (setq tt (js2-peek-token)) js2-EOF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7485 (if (= tt js2-FUNCTION)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7486 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7487 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7488 (setq n (js2-parse-function (if js2-called-by-compile-function
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7489 'FUNCTION_EXPRESSION
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7490 'FUNCTION_STATEMENT)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7491 (js2-record-imenu-functions n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7492 ;; not a function - parse a statement
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7493 (setq n (js2-parse-statement)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7494 ;; add function or statement to script
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7495 (setq end (js2-node-end n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7496 (js2-block-node-push root n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7497
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7498 ;; add comments to root in lexical order
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7499 (when js2-scanned-comments
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7500 ;; if we find a comment beyond end of normal kids, use its end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7501 (setq end (max end (js2-node-end (first js2-scanned-comments))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7502 (dolist (comment js2-scanned-comments)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7503 (push comment (js2-ast-root-comments root))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7504 (js2-node-add-children root comment)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7505
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7506 (setf (js2-node-len root) (- end pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7507 (js2-highlight-undeclared-vars)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7508 root))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7509
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7510 (defun js2-function-parser ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7511 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7512 (js2-parse-function 'FUNCTION_EXPRESSION_STATEMENT))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7513
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7514 (defun js2-parse-function-body (fn-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7515 (js2-must-match js2-LC "msg.no.brace.body")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7516 (let ((pos js2-token-beg) ; LC position
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7517 (pn (make-js2-block-node)) ; starts at LC position
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7518 tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7519 end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7520 (incf js2-nesting-of-function)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7521 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7522 (while (not (or (= (setq tt (js2-peek-token)) js2-ERROR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7523 (= tt js2-EOF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7524 (= tt js2-RC)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7525 (js2-block-node-push pn (if (/= tt js2-FUNCTION)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7526 (js2-parse-statement)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7527 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7528 (js2-parse-function 'FUNCTION_STATEMENT))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7529 (decf js2-nesting-of-function))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7530 (setq end js2-token-end) ; assume no curly and leave at current token
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7531 (if (js2-must-match js2-RC "msg.no.brace.after.body" pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7532 (setq end js2-token-end))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7533 (setf (js2-node-pos pn) pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7534 (js2-node-len pn) (- end pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7535 (setf (js2-function-node-body fn-node) pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7536 (js2-node-add-children fn-node pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7537 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7538
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7539 (defun js2-parse-function-params (fn-node pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7540 (if (js2-match-token js2-RP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7541 (setf (js2-function-node-rp fn-node) (- js2-token-beg pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7542 (let (params len param)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7543 (loop for tt = (js2-peek-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7544 do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7545 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7546 ;; destructuring param
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7547 ((or (= tt js2-LB) (= tt js2-LC))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7548 (push (js2-parse-primary-expr) params))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7549 ;; simple name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7550 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7551 (js2-must-match js2-NAME "msg.no.parm")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7552 (js2-record-face 'js2-function-param-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7553 (setq param (js2-create-name-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7554 (js2-define-symbol js2-LP js2-ts-string param)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7555 (push param params)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7556 while
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7557 (js2-match-token js2-COMMA))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7558 (if (js2-must-match js2-RP "msg.no.paren.after.parms")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7559 (setf (js2-function-node-rp fn-node) (- js2-token-beg pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7560 (dolist (p params)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7561 (js2-node-add-children fn-node p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7562 (push p (js2-function-node-params fn-node))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7563
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7564 (defsubst js2-check-inconsistent-return-warning (fn-node name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7565 "Possibly show inconsistent-return warning.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7566 Last token scanned is the close-curly for the function body."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7567 (when (and js2-mode-show-strict-warnings
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7568 js2-strict-inconsistent-return-warning
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7569 (not (js2-has-consistent-return-usage
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7570 (js2-function-node-body fn-node))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7571 ;; Have it extend from close-curly to bol or beginning of block.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7572 (let ((pos (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7573 (goto-char js2-token-end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7574 (max (js2-node-abs-pos (js2-function-node-body fn-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7575 (point-at-bol))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7576 (end js2-token-end))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7577 (if (plusp (js2-name-node-length name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7578 (js2-add-strict-warning "msg.no.return.value"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7579 (js2-name-node-name name) pos end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7580 (js2-add-strict-warning "msg.anon.no.return.value" nil pos end)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7581
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7582 (defun js2-parse-function (function-type)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7583 "Function parser. FUNCTION-TYPE is a symbol."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7584 (let ((pos js2-token-beg) ; start of 'function' keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7585 name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7586 name-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7587 name-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7588 fn-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7589 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7590 (synthetic-type function-type)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7591 member-expr-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7592
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7593 ;; parse function name, expression, or non-name (anonymous)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7594 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7595 ;; function foo(...)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7596 ((js2-match-token js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7597 (setq name (js2-create-name-node t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7598 name-beg js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7599 name-end js2-token-end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7600 (unless (js2-match-token js2-LP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7601 (when js2-allow-member-expr-as-function-name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7602 ;; function foo.bar(...)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7603 (setq member-expr-node name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7604 name nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7605 member-expr-node (js2-parse-member-expr-tail
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7606 nil member-expr-node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7607 (js2-must-match js2-LP "msg.no.paren.parms")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7608
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7609 ((js2-match-token js2-LP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7610 nil) ; anonymous function: leave name as null
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7611
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7612 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7613 ;; function random-member-expr(...)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7614 (when js2-allow-member-expr-as-function-name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7615 ;; Note that memberExpr can not start with '(' like
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7616 ;; in function (1+2).toString(), because 'function (' already
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7617 ;; processed as anonymous function
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7618 (setq member-expr-node (js2-parse-member-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7619 (js2-must-match js2-LP "msg.no.paren.parms")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7620
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7621 (if (= js2-current-token js2-LP) ; eventually matched LP?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7622 (setq lp js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7623
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7624 (if member-expr-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7625 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7626 (setq synthetic-type 'FUNCTION_EXPRESSION)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7627 (js2-parse-highlight-member-expr-fn-name member-expr-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7628 (if name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7629 (js2-set-face name-beg name-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7630 'font-lock-function-name-face 'record)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7631
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7632 (if (and (neq synthetic-type 'FUNCTION_EXPRESSION)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7633 (plusp (js2-name-node-length name)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7634 ;; Function statements define a symbol in the enclosing scope
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7635 (js2-define-symbol js2-FUNCTION (js2-name-node-name name) fn-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7636
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7637 (setf fn-node (make-js2-function-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7638 :name name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7639 :form function-type
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7640 :lp (if lp (- lp pos))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7641
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7642 (if (or (js2-inside-function) (plusp js2-nesting-of-with))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7643 ;; 1. Nested functions are not affected by the dynamic scope flag
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7644 ;; as dynamic scope is already a parent of their scope.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7645 ;; 2. Functions defined under the with statement also immune to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7646 ;; this setup, in which case dynamic scope is ignored in favor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7647 ;; of the with object.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7648 (setf (js2-function-node-ignore-dynamic fn-node) t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7649
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7650 ;; dynamically bind all the per-function variables
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7651 (let ((js2-current-script-or-fn fn-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7652 (js2-current-scope fn-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7653 (js2-nesting-of-with 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7654 (js2-end-flags 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7655 js2-label-set
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7656 js2-loop-set
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7657 js2-loop-and-switch-set)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7658
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7659 ;; parse params and function body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7660 (js2-parse-function-params fn-node pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7661 (js2-parse-function-body fn-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7662 (if name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7663 (js2-node-add-children fn-node name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7664
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7665 (js2-check-inconsistent-return-warning fn-node name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7666
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7667 ;; Function expressions define a name only in the body of the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7668 ;; function, and only if not hidden by a parameter name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7669 (if (and name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7670 (eq synthetic-type 'FUNCTION_EXPRESSION)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7671 (null (js2-scope-get-symbol js2-current-scope
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7672 (js2-name-node-name name))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7673 (js2-define-symbol js2-FUNCTION
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7674 (js2-name-node-name name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7675 fn-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7676 (if (and name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7677 (eq function-type 'FUNCTION_EXPRESSION_STATEMENT))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7678 (js2-record-imenu-functions fn-node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7679
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7680 (setf (js2-node-len fn-node) (- js2-ts-cursor pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7681 (js2-function-node-member-expr fn-node) member-expr-node) ; may be nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7682
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7683 ;; Rhino doesn't do this, but we need it for finding undeclared vars.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7684 ;; We wait until after parsing the function to set its parent scope,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7685 ;; since `js2-define-symbol' needs the defining-scope check to stop
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7686 ;; at the function boundary when checking for redeclarations.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7687 (setf (js2-scope-parent-scope fn-node) js2-current-scope)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7688
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7689 fn-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7690
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7691 (defun js2-parse-statements (&optional parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7692 "Parse a statement list. Last token consumed must be js2-LC.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7693
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7694 PARENT can be a `js2-block-node', in which case the statements are
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7695 appended to PARENT. Otherwise a new `js2-block-node' is created
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7696 and returned.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7697
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7698 This function does not match the closing js2-RC: the caller
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7699 matches the RC so it can provide a suitable error message if not
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7700 matched. This means it's up to the caller to set the length of
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7701 the node to include the closing RC. The node start pos is set to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7702 the absolute buffer start position, and the caller should fix it
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7703 up to be relative to the parent node. All children of this block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7704 node are given relative start positions and correct lengths."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7705 (let ((pn (or parent (make-js2-block-node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7706 tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7707 (setf (js2-node-pos pn) js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7708 (while (and (> (setq tt (js2-peek-token)) js2-EOF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7709 (/= tt js2-RC))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7710 (js2-block-node-push pn (js2-parse-statement)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7711 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7712
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7713 (defun js2-parse-statement ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7714 (let (tt pn beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7715
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7716 ;; coarse-grained user-interrupt check - needs work
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7717 (and js2-parse-interruptable-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7718 (zerop (% (incf js2-parse-stmt-count)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7719 js2-statements-per-pause))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7720 (input-pending-p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7721 (throw 'interrupted t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7722
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7723 (setq pn (js2-statement-helper))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7724
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7725 ;; no-side-effects warning check
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7726 (unless (js2-node-has-side-effects pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7727 (setq end (js2-node-end pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7728 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7729 (goto-char end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7730 (setq beg (max (js2-node-pos pn) (point-at-bol))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7731 (js2-add-strict-warning "msg.no.side.effects" nil beg end))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7732
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7733 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7734
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7735 ;; These correspond to the switch cases in Parser.statementHelper
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7736 (defconst js2-parsers
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7737 (let ((parsers (make-vector js2-num-tokens
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7738 #'js2-parse-expr-stmt)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7739 (aset parsers js2-BREAK #'js2-parse-break)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7740 (aset parsers js2-CONST #'js2-parse-const-var)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7741 (aset parsers js2-CONTINUE #'js2-parse-continue)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7742 (aset parsers js2-DEBUGGER #'js2-parse-debugger)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7743 (aset parsers js2-DEFAULT #'js2-parse-default-xml-namespace)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7744 (aset parsers js2-DO #'js2-parse-do)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7745 (aset parsers js2-FOR #'js2-parse-for)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7746 (aset parsers js2-FUNCTION #'js2-function-parser)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7747 (aset parsers js2-IF #'js2-parse-if)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7748 (aset parsers js2-LC #'js2-parse-block)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7749 (aset parsers js2-LET #'js2-parse-let-stmt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7750 (aset parsers js2-NAME #'js2-parse-name-or-label)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7751 (aset parsers js2-RETURN #'js2-parse-ret-yield)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7752 (aset parsers js2-SEMI #'js2-parse-semi)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7753 (aset parsers js2-SWITCH #'js2-parse-switch)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7754 (aset parsers js2-THROW #'js2-parse-throw)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7755 (aset parsers js2-TRY #'js2-parse-try)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7756 (aset parsers js2-VAR #'js2-parse-const-var)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7757 (aset parsers js2-WHILE #'js2-parse-while)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7758 (aset parsers js2-WITH #'js2-parse-with)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7759 (aset parsers js2-YIELD #'js2-parse-ret-yield)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7760 parsers)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7761 "A vector mapping token types to parser functions.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7762
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7763 (defsubst js2-parse-warn-missing-semi (beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7764 (and js2-mode-show-strict-warnings
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7765 js2-strict-missing-semi-warning
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7766 (js2-add-strict-warning
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7767 "msg.missing.semi" nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7768 ;; back up to beginning of statement or line
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7769 (max beg (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7770 (goto-char end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7771 (point-at-bol)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7772 end)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7773
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7774 (defconst js2-no-semi-insertion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7775 (list js2-IF
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7776 js2-SWITCH
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7777 js2-WHILE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7778 js2-DO
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7779 js2-FOR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7780 js2-TRY
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7781 js2-WITH
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7782 js2-LC
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7783 js2-ERROR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7784 js2-SEMI
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7785 js2-FUNCTION)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7786 "List of tokens that don't do automatic semicolon insertion.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7787
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7788 (defconst js2-autoinsert-semi-and-warn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7789 (list js2-ERROR js2-EOF js2-RC))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7790
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7791 (defun js2-statement-helper ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7792 (let* ((tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7793 (first-tt tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7794 (beg js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7795 (parser (if (= tt js2-ERROR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7796 #'js2-parse-semi
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7797 (aref js2-parsers tt)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7798 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7799 tt-flagged)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7800 ;; If the statement is set, then it's been told its label by now.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7801 (and js2-labeled-stmt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7802 (js2-labeled-stmt-node-stmt js2-labeled-stmt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7803 (setq js2-labeled-stmt nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7804
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7805 (setq pn (funcall parser)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7806 tt-flagged (js2-peek-flagged-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7807 tt (logand tt-flagged js2-clear-ti-mask))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7808
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7809 ;; Don't do auto semi insertion for certain statement types.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7810 (unless (or (memq first-tt js2-no-semi-insertion)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7811 (js2-labeled-stmt-node-p pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7812 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7813 ((= tt js2-SEMI)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7814 ;; Consume ';' as a part of expression
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7815 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7816 ;; extend the node bounds to include the semicolon.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7817 (setf (js2-node-len pn) (- js2-token-end beg)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7818 ((memq tt js2-autoinsert-semi-and-warn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7819 ;; Autoinsert ;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7820 (js2-parse-warn-missing-semi beg (js2-node-end pn)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7821 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7822 (if (js2-flag-not-set-p tt-flagged js2-ti-after-eol)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7823 ;; Report error if no EOL or autoinsert ';' otherwise
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7824 (js2-report-error "msg.no.semi.stmt")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7825 (js2-parse-warn-missing-semi beg (js2-node-end pn))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7826 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7827
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7828 (defun js2-parse-condition ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7829 "Parse a parenthesized boolean expression, e.g. in an if- or while-stmt.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7830 The parens are discarded and the expression node is returned.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7831 The `pos' field of the return value is set to an absolute position
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7832 that must be fixed up by the caller.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7833 Return value is a list (EXPR LP RP), with absolute paren positions."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7834 (let (pn lp rp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7835 (if (js2-must-match js2-LP "msg.no.paren.cond")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7836 (setq lp js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7837 (setq pn (js2-parse-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7838 (if (js2-must-match js2-RP "msg.no.paren.after.cond")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7839 (setq rp js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7840 ;; Report strict warning on code like "if (a = 7) ..."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7841 (if (and js2-strict-cond-assign-warning
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7842 (js2-assign-node-p pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7843 (js2-add-strict-warning "msg.equal.as.assign" nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7844 (js2-node-pos pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7845 (+ (js2-node-pos pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7846 (js2-node-len pn))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7847 (list pn lp rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7848
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7849 (defun js2-parse-if ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7850 "Parser for if-statement. Last matched token must be js2-IF."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7851 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7852 cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7853 if-true
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7854 if-false
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7855 else-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7856 end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7857 pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7858 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7859 (setq cond (js2-parse-condition)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7860 if-true (js2-parse-statement)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7861 if-false (if (js2-match-token js2-ELSE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7862 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7863 (setq else-pos (- js2-token-beg pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7864 (js2-parse-statement)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7865 end (js2-node-end (or if-false if-true))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7866 pn (make-js2-if-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7867 :len (- end pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7868 :condition (car cond)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7869 :then-part if-true
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7870 :else-part if-false
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7871 :else-pos else-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7872 :lp (js2-relpos (second cond) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7873 :rp (js2-relpos (third cond) pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7874 (js2-node-add-children pn (car cond) if-true if-false)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7875 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7876
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7877 (defun js2-parse-switch ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7878 "Parser for if-statement. Last matched token must be js2-SWITCH."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7879 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7880 tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7881 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7882 discriminant
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7883 has-default
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7884 case-expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7885 case-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7886 case-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7887 cases
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7888 stmt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7889 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7890 rp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7891 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7892 (if (js2-must-match js2-LP "msg.no.paren.switch")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7893 (setq lp js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7894 (setq discriminant (js2-parse-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7895 pn (make-js2-switch-node :discriminant discriminant
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7896 :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7897 :lp (js2-relpos lp pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7898 (js2-node-add-children pn discriminant)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7899 (js2-enter-switch pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7900 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7901 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7902 (if (js2-must-match js2-RP "msg.no.paren.after.switch")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7903 (setf (js2-switch-node-rp pn) (- js2-token-beg pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7904 (js2-must-match js2-LC "msg.no.brace.switch")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7905 (catch 'break
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7906 (while t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7907 (setq tt (js2-next-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7908 case-pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7909 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7910 ((= tt js2-RC)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7911 (setf (js2-node-len pn) (- js2-token-end pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7912 (throw 'break nil)) ; done
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7913
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7914 ((= tt js2-CASE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7915 (setq case-expr (js2-parse-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7916 (js2-must-match js2-COLON "msg.no.colon.case"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7917
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7918 ((= tt js2-DEFAULT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7919 (if has-default
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7920 (js2-report-error "msg.double.switch.default"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7921 (setq has-default t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7922 case-expr nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7923 (js2-must-match js2-COLON "msg.no.colon.case"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7924
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7925 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7926 (js2-report-error "msg.bad.switch")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7927 (throw 'break nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7928
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7929 (setq case-node (make-js2-case-node :pos case-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7930 :len (- js2-token-end case-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7931 :expr case-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7932 (js2-node-add-children case-node case-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7933 (while (and (/= (setq tt (js2-peek-token)) js2-RC)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7934 (/= tt js2-CASE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7935 (/= tt js2-DEFAULT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7936 (/= tt js2-EOF))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7937 (setf stmt (js2-parse-statement)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7938 (js2-node-len case-node) (- (js2-node-end stmt) case-pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7939 (js2-block-node-push case-node stmt))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7940 (push case-node cases)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7941 ;; add cases last, as pushing reverses the order to be correct
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7942 (dolist (kid cases)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7943 (js2-node-add-children pn kid)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7944 (push kid (js2-switch-node-cases pn)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7945 pn) ; return value
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7946 (js2-exit-switch))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7947
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7948 (defun js2-parse-while ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7949 "Parser for while-statement. Last matched token must be js2-WHILE."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7950 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7951 (pn (make-js2-while-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7952 cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7953 body)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7954 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7955 (js2-enter-loop pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7956 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7957 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7958 (setf cond (js2-parse-condition)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7959 (js2-while-node-condition pn) (car cond)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7960 body (js2-parse-statement)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7961 (js2-while-node-body pn) body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7962 (js2-node-len pn) (- (js2-node-end body) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7963 (js2-while-node-lp pn) (js2-relpos (second cond) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7964 (js2-while-node-rp pn) (js2-relpos (third cond) pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7965 (js2-node-add-children pn body (car cond)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7966 (js2-exit-loop))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7967 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7968
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7969 (defun js2-parse-do ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7970 "Parser for do-statement. Last matched token must be js2-DO."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7971 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7972 (pn (make-js2-do-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7973 cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7974 body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7975 end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7976 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7977 (js2-enter-loop pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7978 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7979 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7980 (setq body (js2-parse-statement))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7981 (js2-must-match js2-WHILE "msg.no.while.do")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7982 (setf (js2-do-node-while-pos pn) (- js2-token-beg pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7983 cond (js2-parse-condition)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7984 (js2-do-node-condition pn) (car cond)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7985 (js2-do-node-body pn) body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7986 end js2-ts-cursor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7987 (js2-do-node-lp pn) (js2-relpos (second cond) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7988 (js2-do-node-rp pn) (js2-relpos (third cond) pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7989 (js2-node-add-children pn (car cond) body))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7990 (js2-exit-loop))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7991 ;; Always auto-insert semicolon to follow SpiderMonkey:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7992 ;; It is required by ECMAScript but is ignored by the rest of
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7993 ;; world; see bug 238945
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7994 (if (js2-match-token js2-SEMI)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7995 (setq end js2-ts-cursor))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7996 (setf (js2-node-len pn) (- end pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7997 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7998
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7999 (defun js2-parse-for ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8000 "Parser for for-statement. Last matched token must be js2-FOR.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8001 Parses for, for-in, and for each-in statements."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8002 (let ((for-pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8003 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8004 is-for-each
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8005 is-for-in
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8006 in-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8007 each-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8008 tmp-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8009 init ; Node init is also foo in 'foo in object'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8010 cond ; Node cond is also object in 'foo in object'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8011 incr ; 3rd section of for-loop initializer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8012 body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8013 tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8014 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8015 rp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8016 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8017 ;; See if this is a for each () instead of just a for ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8018 (when (js2-match-token js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8019 (if (string= "each" js2-ts-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8020 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8021 (setq is-for-each t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8022 each-pos (- js2-token-beg for-pos)) ; relative
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8023 (js2-record-face 'font-lock-keyword-face))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8024 (js2-report-error "msg.no.paren.for")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8025
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8026 (if (js2-must-match js2-LP "msg.no.paren.for")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8027 (setq lp (- js2-token-beg for-pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8028 (setq tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8029
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8030 ;; parse init clause
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8031 (let ((js2-in-for-init t)) ; set as dynamic variable
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8032 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8033 ((= tt js2-SEMI)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8034 (setq init (make-js2-empty-expr-node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8035 ((or (= tt js2-VAR) (= tt js2-LET))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8036 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8037 (setq init (js2-parse-variables tt js2-token-beg)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8038 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8039 (setq init (js2-parse-expr)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8040
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8041 (if (js2-match-token js2-IN)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8042 (setq is-for-in t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8043 in-pos (- js2-token-beg for-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8044 cond (js2-parse-expr)) ; object over which we're iterating
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8045 ;; else ordinary for loop - parse cond and incr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8046 (js2-must-match js2-SEMI "msg.no.semi.for")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8047 (setq cond (if (= (js2-peek-token) js2-SEMI)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8048 (make-js2-empty-expr-node) ; no loop condition
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8049 (js2-parse-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8050 (js2-must-match js2-SEMI "msg.no.semi.for.cond")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8051 (setq tmp-pos js2-token-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8052 incr (if (= (js2-peek-token) js2-RP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8053 (make-js2-empty-expr-node :pos tmp-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8054 (js2-parse-expr))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8055
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8056 (if (js2-must-match js2-RP "msg.no.paren.for.ctrl")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8057 (setq rp (- js2-token-beg for-pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8058 (if (not is-for-in)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8059 (setq pn (make-js2-for-node :init init
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8060 :condition cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8061 :update incr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8062 :lp lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8063 :rp rp))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8064 ;; cond could be null if 'in obj' got eaten by the init node.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8065 (if (js2-infix-node-p init)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8066 ;; it was (foo in bar) instead of (var foo in bar)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8067 (setq cond (js2-infix-node-right init)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8068 init (js2-infix-node-left init))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8069 (if (and (js2-var-decl-node-p init)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8070 (> (length (js2-var-decl-node-kids init)) 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8071 (js2-report-error "msg.mult.index")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8072
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8073 (setq pn (make-js2-for-in-node :iterator init
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8074 :object cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8075 :in-pos in-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8076 :foreach-p is-for-each
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8077 :each-pos each-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8078 :lp lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8079 :rp rp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8080 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8081 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8082 (js2-enter-loop pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8083 ;; We have to parse the body -after- creating the loop node,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8084 ;; so that the loop node appears in the js2-loop-set, allowing
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8085 ;; break/continue statements to find the enclosing loop.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8086 (setf body (js2-parse-statement)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8087 (js2-loop-node-body pn) body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8088 (js2-node-pos pn) for-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8089 (js2-node-len pn) (- (js2-node-end body) for-pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8090 (js2-node-add-children pn init cond incr body))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8091 ;; finally
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8092 (js2-exit-loop))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8093 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8094
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8095 (defun js2-parse-try ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8096 "Parser for try-statement. Last matched token must be js2-TRY."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8097 (let ((try-pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8098 try-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8099 try-block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8100 catch-blocks
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8101 finally-block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8102 saw-default-catch
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8103 peek
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8104 var-name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8105 catch-cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8106 catch-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8107 guard-kwd
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8108 catch-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8109 finally-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8110 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8111 block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8112 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8113 rp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8114 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8115 (if (/= (js2-peek-token) js2-LC)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8116 (js2-report-error "msg.no.brace.try"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8117 (setq try-block (js2-parse-statement)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8118 try-end (js2-node-end try-block)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8119 peek (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8120 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8121 ((= peek js2-CATCH)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8122 (while (js2-match-token js2-CATCH)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8123 (setq catch-pos js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8124 guard-kwd nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8125 catch-cond nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8126 lp nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8127 rp nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8128 (if saw-default-catch
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8129 (js2-report-error "msg.catch.unreachable"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8130 (if (js2-must-match js2-LP "msg.no.paren.catch")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8131 (setq lp (- js2-token-beg catch-pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8132
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8133 (js2-must-match js2-NAME "msg.bad.catchcond")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8134 (setq var-name (js2-create-name-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8135
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8136 (if (js2-match-token js2-IF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8137 (setq guard-kwd (- js2-token-beg catch-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8138 catch-cond (js2-parse-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8139 (setq saw-default-catch t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8140
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8141 (if (js2-must-match js2-RP "msg.bad.catchcond")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8142 (setq rp (- js2-token-beg catch-pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8143 (js2-must-match js2-LC "msg.no.brace.catchblock")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8144
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8145 (setq block (js2-parse-statements)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8146 try-end (js2-node-end block)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8147 catch-node (make-js2-catch-node :pos catch-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8148 :var-name var-name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8149 :guard-expr catch-cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8150 :guard-kwd guard-kwd
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8151 :block block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8152 :lp lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8153 :rp rp))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8154 (if (js2-must-match js2-RC "msg.no.brace.after.body")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8155 (setq try-end js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8156 (setf (js2-node-len block) (- try-end (js2-node-pos block))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8157 (js2-node-len catch-node) (- try-end catch-pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8158 (js2-node-add-children catch-node var-name catch-cond block)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8159 (push catch-node catch-blocks)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8160
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8161 ((/= peek js2-FINALLY)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8162 (js2-must-match js2-FINALLY "msg.try.no.catchfinally"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8163 (js2-node-pos try-block)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8164 (- (setq try-end (js2-node-end try-block))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8165 (js2-node-pos try-block)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8166
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8167 (when (js2-match-token js2-FINALLY)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8168 (setq finally-pos js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8169 block (js2-parse-statement)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8170 try-end (js2-node-end block)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8171 finally-block (make-js2-finally-node :pos finally-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8172 :len (- try-end finally-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8173 :body block))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8174 (js2-node-add-children finally-block block))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8175
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8176 (setq pn (make-js2-try-node :pos try-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8177 :len (- try-end try-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8178 :try-block try-block
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8179 :finally-block finally-block))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8180 (js2-node-add-children pn try-block finally-block)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8181
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8182 ;; push them onto the try-node, which reverses and corrects their order
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8183 (dolist (cb catch-blocks)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8184 (js2-node-add-children pn cb)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8185 (push cb (js2-try-node-catch-clauses pn)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8186 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8187
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8188 (defun js2-parse-throw ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8189 "Parser for throw-statement. Last matched token must be js2-THROW."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8190 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8191 expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8192 pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8193 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8194 (if (= (js2-peek-token-or-eol) js2-EOL)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8195 ;; ECMAScript does not allow new lines before throw expression,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8196 ;; see bug 256617
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8197 (js2-report-error "msg.bad.throw.eol"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8198 (setq expr (js2-parse-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8199 pn (make-js2-throw-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8200 :len (- (js2-node-end expr) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8201 :expr expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8202 (js2-node-add-children pn expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8203 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8204
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8205 (defsubst js2-match-jump-label-name (label-name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8206 "If break/continue specified a label, return that label's labeled stmt.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8207 Returns the corresponding `js2-labeled-stmt-node', or if LABEL-NAME
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8208 does not match an existing label, reports an error and returns nil."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8209 (let ((bundle (cdr (assoc label-name js2-label-set))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8210 (if (null bundle)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8211 (js2-report-error "msg.undef.label"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8212 bundle))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8213
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8214 (defun js2-parse-break ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8215 "Parser for break-statement. Last matched token must be js2-BREAK."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8216 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8217 (end js2-token-end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8218 break-target ; statement to break from
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8219 break-label ; in "break foo", name-node representing the foo
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8220 labels ; matching labeled statement to break to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8221 pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8222 (js2-consume-token) ; `break'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8223 (when (eq (js2-peek-token-or-eol) js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8224 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8225 (setq break-label (js2-create-name-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8226 end (js2-node-end break-label)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8227 ;; matchJumpLabelName only matches if there is one
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8228 labels (js2-match-jump-label-name js2-ts-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8229 break-target (if labels (car (js2-labeled-stmt-node-labels labels)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8230
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8231 (unless (or break-target break-label)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8232 ;; no break target specified - try for innermost enclosing loop/switch
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8233 (if (null js2-loop-and-switch-set)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8234 (unless break-label
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8235 (js2-report-error "msg.bad.break" nil pos (length "break")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8236 (setq break-target (car js2-loop-and-switch-set))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8237
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8238 (setq pn (make-js2-break-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8239 :len (- end pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8240 :label break-label
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8241 :target break-target))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8242 (js2-node-add-children pn break-label) ; but not break-target
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8243 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8244
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8245 (defun js2-parse-continue ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8246 "Parser for continue-statement. Last matched token must be js2-CONTINUE."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8247 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8248 (end js2-token-end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8249 label ; optional user-specified label, a `js2-name-node'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8250 labels ; current matching labeled stmt, if any
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8251 target ; the `js2-loop-node' target of this continue stmt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8252 pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8253 (js2-consume-token) ; `continue'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8254 (when (= (js2-peek-token-or-eol) js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8255 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8256 (setq label (js2-create-name-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8257 end (js2-node-end label)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8258 ;; matchJumpLabelName only matches if there is one
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8259 labels (js2-match-jump-label-name js2-ts-string)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8260 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8261 ((null labels) ; no current label to go to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8262 (if (null js2-loop-set) ; no loop to continue to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8263 (js2-report-error "msg.continue.outside" nil pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8264 (length "continue"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8265 (setq target (car js2-loop-set)))) ; innermost enclosing loop
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8266 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8267 (if (js2-loop-node-p (js2-labeled-stmt-node-stmt labels))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8268 (setq target (js2-labeled-stmt-node-stmt labels))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8269 (js2-report-error "msg.continue.nonloop" nil pos (- end pos)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8270
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8271 (setq pn (make-js2-continue-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8272 :len (- end pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8273 :label label
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8274 :target target))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8275 (js2-node-add-children pn label) ; but not target - it's not our child
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8276 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8277
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8278 (defun js2-parse-with ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8279 "Parser for with-statement. Last matched token must be js2-WITH."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8280 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8281 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8282 obj body pn lp rp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8283
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8284 (if (js2-must-match js2-LP "msg.no.paren.with")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8285 (setq lp js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8286
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8287 (setq obj (js2-parse-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8288
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8289 (if (js2-must-match js2-RP "msg.no.paren.after.with")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8290 (setq rp js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8291
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8292 (let ((js2-nesting-of-with (1+ js2-nesting-of-with)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8293 (setq body (js2-parse-statement)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8294
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8295 (setq pn (make-js2-with-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8296 :len (- (js2-node-end body) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8297 :object obj
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8298 :body body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8299 :lp (js2-relpos lp pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8300 :rp (js2-relpos rp pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8301 (js2-node-add-children pn obj body)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8302 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8303
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8304 (defun js2-parse-const-var ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8305 "Parser for var- or const-statement.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8306 Last matched token must be js2-CONST or js2-VAR."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8307 (let ((tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8308 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8309 expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8310 pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8311 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8312 (setq expr (js2-parse-variables tt js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8313 pn (make-js2-expr-stmt-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8314 :len (- (js2-node-end expr) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8315 :expr expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8316 (js2-node-add-children pn expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8317 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8318
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8319 (defsubst js2-wrap-with-expr-stmt (pos expr &optional add-child)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8320 (let ((pn (make-js2-expr-stmt-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8321 :len (js2-node-len expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8322 :type (if (js2-inside-function)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8323 js2-EXPR_VOID
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8324 js2-EXPR_RESULT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8325 :expr expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8326 (if add-child
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8327 (js2-node-add-children pn expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8328 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8329
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8330 (defun js2-parse-let-stmt ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8331 "Parser for let-statement. Last matched token must be js2-LET."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8332 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8333 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8334 expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8335 pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8336 (if (= (js2-peek-token) js2-LP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8337 ;; let expression in statement context
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8338 (setq expr (js2-parse-let pos 'statement)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8339 pn (js2-wrap-with-expr-stmt pos expr t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8340 ;; else we're looking at a statement like let x=6, y=7;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8341 (setf expr (js2-parse-variables js2-LET pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8342 pn (js2-wrap-with-expr-stmt pos expr t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8343 (js2-node-type pn) js2-EXPR_RESULT))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8344 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8345
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8346 (defun js2-parse-ret-yield ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8347 (js2-parse-return-or-yield (js2-peek-token) nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8348
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8349 (defconst js2-parse-return-stmt-enders
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8350 (list js2-SEMI js2-RC js2-EOF js2-EOL js2-ERROR js2-RB js2-RP js2-YIELD))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8351
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8352 (defsubst js2-now-all-set (before after mask)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8353 "Return whether or not the bits in the mask have changed to all set.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8354 BEFORE is bits before change, AFTER is bits after change, and MASK is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8355 the mask for bits. Returns t if all the bits in the mask are set in AFTER
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8356 but not BEFORE."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8357 (and (/= (logand before mask) mask)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8358 (= (logand after mask) mask)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8359
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8360 (defun js2-parse-return-or-yield (tt expr-context)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8361 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8362 (end js2-token-end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8363 (before js2-end-flags)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8364 (inside-function (js2-inside-function))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8365 e
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8366 ret
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8367 name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8368 (unless inside-function
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8369 (js2-report-error (if (eq tt js2-RETURN)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8370 "msg.bad.return"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8371 "msg.bad.yield")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8372 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8373 ;; This is ugly, but we don't want to require a semicolon.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8374 (unless (memq (js2-peek-token-or-eol) js2-parse-return-stmt-enders)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8375 (setq e (js2-parse-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8376 end (js2-node-end e)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8377 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8378 ((eq tt js2-RETURN)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8379 (js2-set-flag js2-end-flags (if (null e)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8380 js2-end-returns
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8381 js2-end-returns-value))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8382 (setq ret (make-js2-return-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8383 :len (- end pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8384 :retval e))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8385 (js2-node-add-children ret e)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8386 ;; See if we need a strict mode warning.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8387 ;; TODO: The analysis done by `js2-has-consistent-return-usage' is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8388 ;; more thorough and accurate than this before/after flag check.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8389 ;; E.g. if there's a finally-block that always returns, we shouldn't
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8390 ;; show a warning generated by inconsistent returns in the catch blocks.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8391 ;; Basically `js2-has-consistent-return-usage' needs to keep more state,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8392 ;; so we know which returns/yields to highlight, and we should get rid of
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8393 ;; all the checking in `js2-parse-return-or-yield'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8394 (if (and js2-strict-inconsistent-return-warning
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8395 (js2-now-all-set before js2-end-flags
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8396 (logior js2-end-returns js2-end-returns-value)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8397 (js2-add-strict-warning "msg.return.inconsistent" nil pos end)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8398 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8399 (unless (js2-inside-function)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8400 (js2-report-error "msg.bad.yield"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8401 (js2-set-flag js2-end-flags js2-end-yields)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8402 (setq ret (make-js2-yield-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8403 :len (- end pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8404 :value e))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8405 (js2-node-add-children ret e)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8406 (unless expr-context
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8407 (setq e ret
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8408 ret (js2-wrap-with-expr-stmt pos e t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8409 (js2-set-requires-activation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8410 (js2-set-is-generator))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8411
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8412 ;; see if we are mixing yields and value returns.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8413 (when (and inside-function
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8414 (js2-now-all-set before js2-end-flags
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8415 (logior js2-end-yields js2-end-returns-value)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8416 (setq name (js2-function-name js2-current-script-or-fn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8417 (if (zerop (length name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8418 (js2-report-error "msg.anon.generator.returns" nil pos (- end pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8419 (js2-report-error "msg.generator.returns" name pos (- end pos))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8420
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8421 ret))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8422
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8423 (defun js2-parse-debugger ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8424 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8425 (make-js2-keyword-node :type js2-DEBUGGER))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8426
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8427 (defun js2-parse-block ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8428 "Parser for a curly-delimited statement block.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8429 Last token matched must be js2-LC."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8430 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8431 (pn (make-js2-scope)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8432 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8433 (js2-push-scope pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8434 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8435 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8436 (js2-parse-statements pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8437 (js2-must-match js2-RC "msg.no.brace.block")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8438 (setf (js2-node-len pn) (- js2-token-end pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8439 (js2-pop-scope))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8440 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8441
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8442 ;; for js2-ERROR too, to have a node for error recovery to work on
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8443 (defun js2-parse-semi ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8444 "Parse a statement or handle an error.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8445 Last matched token is js-SEMI or js-ERROR."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8446 (let ((tt (js2-peek-token)) pos len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8447 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8448 (if (eq tt js2-SEMI)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8449 (make-js2-empty-expr-node :len 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8450 (setq pos js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8451 len (- js2-token-beg pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8452 (js2-report-error "msg.syntax" nil pos len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8453 (make-js2-error-node :pos pos :len len))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8454
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8455 (defun js2-parse-default-xml-namespace ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8456 "Parse a `default xml namespace = <expr>' e4x statement."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8457 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8458 end len expr unary es)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8459 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8460 (js2-must-have-xml)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8461 (js2-set-requires-activation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8462 (setq len (- js2-ts-cursor pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8463 (unless (and (js2-match-token js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8464 (string= js2-ts-string "xml"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8465 (js2-report-error "msg.bad.namespace" nil pos len))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8466 (unless (and (js2-match-token js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8467 (string= js2-ts-string "namespace"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8468 (js2-report-error "msg.bad.namespace" nil pos len))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8469 (unless (js2-match-token js2-ASSIGN)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8470 (js2-report-error "msg.bad.namespace" nil pos len))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8471 (setq expr (js2-parse-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8472 end (js2-node-end expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8473 unary (make-js2-unary-node :type js2-DEFAULTNAMESPACE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8474 :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8475 :len (- end pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8476 :operand expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8477 (js2-node-add-children unary expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8478 (make-js2-expr-stmt-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8479 :len (- end pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8480 :expr unary)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8481
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8482 (defun js2-record-label (label bundle)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8483 ;; current token should be colon that `js2-parse-primary-expr' left untouched
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8484 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8485 (let ((name (js2-label-node-name label))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8486 labeled-stmt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8487 dup)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8488 (when (setq labeled-stmt (cdr (assoc name js2-label-set)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8489 ;; flag both labels if possible when used in editing mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8490 (if (and js2-parse-ide-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8491 (setq dup (js2-get-label-by-name labeled-stmt name)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8492 (js2-report-error "msg.dup.label" nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8493 (js2-node-abs-pos dup) (js2-node-len dup)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8494 (js2-report-error "msg.dup.label" nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8495 (js2-node-pos label) (js2-node-len label)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8496 (js2-labeled-stmt-node-add-label bundle label)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8497 (js2-node-add-children bundle label)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8498 ;; Add one reference to the bundle per label in `js2-label-set'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8499 (push (cons name bundle) js2-label-set)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8500
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8501 (defun js2-parse-name-or-label ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8502 "Parser for identifier or label. Last token matched must be js2-NAME.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8503 Called when we found a name in a statement context. If it's a label, we gather
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8504 up any following labels and the next non-label statement into a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8505 `js2-labeled-stmt-node' bundle and return that. Otherwise we parse an
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8506 expression and return it wrapped in a `js2-expr-stmt-node'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8507 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8508 (end js2-token-end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8509 expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8510 stmt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8511 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8512 bundle
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8513 (continue t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8514 ;; set check for label and call down to `js2-parse-primary-expr'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8515 (js2-set-check-for-label)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8516 (setq expr (js2-parse-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8517
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8518 (if (/= (js2-node-type expr) js2-LABEL)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8519 ;; Parsed non-label expression - wrap with expression stmt.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8520 (setq pn (js2-wrap-with-expr-stmt pos expr t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8521
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8522 ;; else parsed a label
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8523 (setq bundle (make-js2-labeled-stmt-node :pos pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8524 (js2-record-label expr bundle)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8525
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8526 ;; look for more labels
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8527 (while (and continue (= (js2-peek-token) js2-NAME))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8528 (js2-set-check-for-label)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8529 (setq expr (js2-parse-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8530 (if (/= (js2-node-type expr) js2-LABEL)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8531 (setq stmt (js2-wrap-with-expr-stmt pos expr t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8532 continue nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8533 (js2-record-label expr bundle)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8534
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8535 ;; no more labels; now parse the labeled statement
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8536 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8537 (unless stmt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8538 (let ((js2-labeled-stmt bundle)) ; bind dynamically
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8539 (setq stmt (js2-statement-helper))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8540 ;; remove the labels for this statement from the global set
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8541 (dolist (label (js2-labeled-stmt-node-labels bundle))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8542 (setq js2-label-set (remove label js2-label-set))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8543
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8544 (setf (js2-labeled-stmt-node-stmt bundle) stmt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8545 (js2-node-add-children bundle stmt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8546 bundle)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8547
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8548 (defun js2-parse-expr-stmt ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8549 "Default parser in statement context, if no recognized statement found."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8550 (js2-wrap-with-expr-stmt js2-token-beg (js2-parse-expr) t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8551
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8552 (defun js2-parse-variables (decl-type pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8553 "Parse a comma-separated list of variable declarations.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8554 Could be a 'var', 'const' or 'let' expression, possibly in a for-loop initializer.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8555
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8556 DECL-TYPE is a token value: either VAR, CONST, or LET depending on context.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8557 For 'var' or 'const', the keyword should be the token last scanned.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8558
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8559 POS is the position where the node should start. It's sometimes the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8560 var/const/let keyword, and other times the beginning of the first token
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8561 in the first variable declaration.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8562
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8563 Returns the parsed `js2-var-decl-node' expression node."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8564 (let* ((result (make-js2-var-decl-node :decl-type decl-type
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8565 :pos pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8566 destructuring
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8567 kid-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8568 tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8569 init
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8570 name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8571 end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8572 nbeg nend
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8573 vi
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8574 (continue t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8575 ;; Example:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8576 ;; var foo = {a: 1, b: 2}, bar = [3, 4];
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8577 ;; var {b: s2, a: s1} = foo, x = 6, y, [s3, s4] = bar;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8578 (while continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8579 (setq destructuring nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8580 name nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8581 tt (js2-peek-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8582 kid-pos js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8583 end js2-token-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8584 init nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8585 (if (or (= tt js2-LB) (= tt js2-LC))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8586 ;; Destructuring assignment, e.g., var [a, b] = ...
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8587 (setq destructuring (js2-parse-primary-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8588 end (js2-node-end destructuring))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8589 ;; Simple variable name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8590 (when (js2-must-match js2-NAME "msg.bad.var")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8591 (setq name (js2-create-name-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8592 nbeg js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8593 nend js2-token-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8594 end nend)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8595 (js2-define-symbol decl-type js2-ts-string name js2-in-for-init)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8596
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8597 (when (js2-match-token js2-ASSIGN)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8598 (setq init (js2-parse-assign-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8599 end (js2-node-end init))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8600 (if (and js2-parse-ide-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8601 (or (js2-object-node-p init)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8602 (js2-function-node-p init)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8603 (js2-record-imenu-functions init name)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8604
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8605 (when name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8606 (js2-set-face nbeg nend (if (js2-function-node-p init)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8607 'font-lock-function-name-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8608 'font-lock-variable-name-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8609 'record))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8610
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8611 (setq vi (make-js2-var-init-node :pos kid-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8612 :len (- end kid-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8613 :type decl-type))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8614 (if destructuring
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8615 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8616 (if (and (null init) (not js2-in-for-init))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8617 (js2-report-error "msg.destruct.assign.no.init"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8618 (setf (js2-var-init-node-target vi) destructuring))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8619 (setf (js2-var-init-node-target vi) name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8620 (setf (js2-var-init-node-initializer vi) init)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8621 (js2-node-add-children vi name destructuring init)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8622
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8623 (js2-block-node-push result vi)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8624 (unless (js2-match-token js2-COMMA)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8625 (setq continue nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8626
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8627 (setf (js2-node-len result) (- end pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8628 result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8629
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8630 (defun js2-parse-let (pos &optional stmt-p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8631 "Parse a let expression or statement.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8632 A let-expression is of the form `let (vars) expr'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8633 A let-statment is of the form `let (vars) {statements}'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8634 The third form of let is a variable declaration list, handled
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8635 by `js2-parse-variables'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8636 (let ((pn (make-js2-let-node :pos pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8637 beg vars body)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8638 (if (js2-must-match js2-LP "msg.no.paren.after.let")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8639 (setf (js2-let-node-lp pn) (- js2-token-beg pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8640 (js2-push-scope pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8641 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8642 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8643 (setq vars (js2-parse-variables js2-LET js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8644 (if (js2-must-match js2-RP "msg.no.paren.let")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8645 (setf (js2-let-node-rp pn) (- js2-token-beg pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8646 (if (and stmt-p (eq (js2-peek-token) js2-LC))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8647 ;; let statement
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8648 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8649 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8650 (setf beg js2-token-beg ; position stmt at LC
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8651 body (js2-parse-statements))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8652 (js2-must-match js2-RC "msg.no.curly.let")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8653 (setf (js2-node-len body) (- js2-token-end beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8654 (js2-node-len pn) (- js2-token-end pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8655 (js2-let-node-body pn) body
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8656 (js2-node-type pn) js2-LET))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8657 ;; let expression
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8658 (setf body (js2-parse-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8659 (js2-node-len pn) (- (js2-node-end body) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8660 (js2-let-node-body pn) body))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8661 (js2-node-add-children pn vars body))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8662 (js2-pop-scope))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8663 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8664
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8665 (defsubst js2-define-new-symbol (decl-type name node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8666 (js2-scope-put-symbol js2-current-scope
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8667 name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8668 (make-js2-symbol decl-type name node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8669
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8670 (defun js2-define-symbol (decl-type name &optional node ignore-not-in-block)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8671 "Define a symbol in the current scope.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8672 If NODE is non-nil, it is the AST node associated with the symbol."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8673 (let* ((defining-scope (js2-get-defining-scope js2-current-scope name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8674 (symbol (if defining-scope
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8675 (js2-scope-get-symbol defining-scope name)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8676 (sdt (if symbol (js2-symbol-decl-type symbol) -1)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8677 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8678 ((and symbol ; already defined
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8679 (or (= sdt js2-CONST) ; old version is const
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8680 (= decl-type js2-CONST) ; new version is const
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8681 ;; two let-bound vars in this block have same name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8682 (and (= sdt js2-LET)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8683 (eq defining-scope js2-current-scope))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8684 (js2-report-error
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8685 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8686 ((= sdt js2-CONST) "msg.const.redecl")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8687 ((= sdt js2-LET) "msg.let.redecl")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8688 ((= sdt js2-VAR) "msg.var.redecl")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8689 ((= sdt js2-FUNCTION) "msg.function.redecl")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8690 (t "msg.parm.redecl"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8691 name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8692
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8693 ((= decl-type js2-LET)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8694 (if (and (not ignore-not-in-block)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8695 (or (= (js2-node-type js2-current-scope) js2-IF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8696 (js2-loop-node-p js2-current-scope)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8697 (js2-report-error "msg.let.decl.not.in.block")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8698 (js2-define-new-symbol decl-type name node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8699
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8700 ((or (= decl-type js2-VAR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8701 (= decl-type js2-CONST)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8702 (= decl-type js2-FUNCTION))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8703 (if symbol
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8704 (if (and js2-strict-var-redeclaration-warning (= sdt js2-VAR))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8705 (js2-add-strict-warning "msg.var.redecl" name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8706 (if (and js2-strict-var-hides-function-arg-warning (= sdt js2-LP))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8707 (js2-add-strict-warning "msg.var.hides.arg" name)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8708 (js2-define-new-symbol decl-type name node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8709
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8710 ((= decl-type js2-LP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8711 (if symbol
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8712 ;; must be duplicate parameter. Second parameter hides the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8713 ;; first, so go ahead and add the second pararameter
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8714 (js2-report-warning "msg.dup.parms" name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8715 (js2-define-new-symbol decl-type name node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8716
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8717 (t (js2-code-bug)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8718
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8719 (defun js2-parse-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8720 (let* ((pn (js2-parse-assign-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8721 (pos (js2-node-pos pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8722 left
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8723 right
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8724 op-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8725 (while (js2-match-token js2-COMMA)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8726 (setq op-pos (- js2-token-beg pos)) ; relative
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8727 (if (= (js2-peek-token) js2-YIELD)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8728 (js2-report-error "msg.yield.parenthesized"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8729 (setq right (js2-parse-assign-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8730 left pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8731 pn (make-js2-infix-node :type js2-COMMA
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8732 :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8733 :len (- js2-ts-cursor pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8734 :op-pos op-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8735 :left left
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8736 :right right))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8737 (js2-node-add-children pn left right))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8738 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8739
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8740 (defun js2-parse-assign-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8741 (let ((tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8742 (pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8743 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8744 left
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8745 right
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8746 op-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8747 (if (= tt js2-YIELD)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8748 (js2-parse-return-or-yield tt t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8749 ;; not yield - parse assignment expression
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8750 (setq pn (js2-parse-cond-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8751 tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8752 (when (and (<= js2-first-assign tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8753 (<= tt js2-last-assign))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8754 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8755 (setq op-pos (- js2-token-beg pos) ; relative
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8756 left pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8757 right (js2-parse-assign-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8758 pn (make-js2-assign-node :type tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8759 :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8760 :len (- (js2-node-end right) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8761 :op-pos op-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8762 :left left
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8763 :right right))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8764 (when js2-parse-ide-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8765 (js2-highlight-assign-targets pn left right)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8766 (if (or (js2-function-node-p right)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8767 (js2-object-node-p right))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8768 (js2-record-imenu-functions right left)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8769 ;; do this last so ide checks above can use absolute positions
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8770 (js2-node-add-children pn left right))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8771 pn)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8772
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8773 (defun js2-parse-cond-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8774 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8775 (pn (js2-parse-or-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8776 test-expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8777 if-true
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8778 if-false
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8779 q-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8780 c-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8781 (when (js2-match-token js2-HOOK)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8782 (setq q-pos (- js2-token-beg pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8783 if-true (js2-parse-assign-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8784 (js2-must-match js2-COLON "msg.no.colon.cond")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8785 (setq c-pos (- js2-token-beg pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8786 if-false (js2-parse-assign-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8787 test-expr pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8788 pn (make-js2-cond-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8789 :len (- (js2-node-end if-false) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8790 :test-expr test-expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8791 :true-expr if-true
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8792 :false-expr if-false
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8793 :q-pos q-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8794 :c-pos c-pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8795 (js2-node-add-children pn test-expr if-true if-false))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8796 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8797
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8798 (defun js2-make-binary (type left parser)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8799 "Helper for constructing a binary-operator AST node.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8800 LEFT is the left-side-expression, already parsed, and the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8801 binary operator should have just been matched.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8802 PARSER is a function to call to parse the right operand,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8803 or a `js2-node' struct if it has already been parsed."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8804 (let* ((pos (js2-node-pos left))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8805 (op-pos (- js2-token-beg pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8806 (right (if (js2-node-p parser)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8807 parser
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8808 (funcall parser)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8809 (pn (make-js2-infix-node :type type
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8810 :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8811 :len (- (js2-node-end right) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8812 :op-pos op-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8813 :left left
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8814 :right right)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8815 (js2-node-add-children pn left right)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8816 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8817
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8818 (defun js2-parse-or-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8819 (let ((pn (js2-parse-and-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8820 (when (js2-match-token js2-OR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8821 (setq pn (js2-make-binary js2-OR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8822 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8823 'js2-parse-or-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8824 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8825
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8826 (defun js2-parse-and-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8827 (let ((pn (js2-parse-bit-or-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8828 (when (js2-match-token js2-AND)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8829 (setq pn (js2-make-binary js2-AND
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8830 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8831 'js2-parse-and-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8832 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8833
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8834 (defun js2-parse-bit-or-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8835 (let ((pn (js2-parse-bit-xor-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8836 (while (js2-match-token js2-BITOR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8837 (setq pn (js2-make-binary js2-BITOR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8838 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8839 'js2-parse-bit-xor-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8840 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8841
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8842 (defun js2-parse-bit-xor-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8843 (let ((pn (js2-parse-bit-and-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8844 (while (js2-match-token js2-BITXOR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8845 (setq pn (js2-make-binary js2-BITXOR
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8846 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8847 'js2-parse-bit-and-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8848 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8849
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8850 (defun js2-parse-bit-and-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8851 (let ((pn (js2-parse-eq-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8852 (while (js2-match-token js2-BITAND)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8853 (setq pn (js2-make-binary js2-BITAND
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8854 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8855 'js2-parse-eq-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8856 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8857
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8858 (defconst js2-parse-eq-ops
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8859 (list js2-EQ js2-NE js2-SHEQ js2-SHNE))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8860
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8861 (defun js2-parse-eq-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8862 (let ((pn (js2-parse-rel-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8863 tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8864 (while (memq (setq tt (js2-peek-token)) js2-parse-eq-ops)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8865 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8866 (setq pn (js2-make-binary tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8867 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8868 'js2-parse-rel-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8869 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8870
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8871 (defconst js2-parse-rel-ops
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8872 (list js2-IN js2-INSTANCEOF js2-LE js2-LT js2-GE js2-GT))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8873
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8874 (defun js2-parse-rel-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8875 (let ((pn (js2-parse-shift-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8876 (continue t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8877 tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8878 (while continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8879 (setq tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8880 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8881 ((and js2-in-for-init (= tt js2-IN))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8882 (setq continue nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8883 ((memq tt js2-parse-rel-ops)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8884 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8885 (setq pn (js2-make-binary tt pn 'js2-parse-shift-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8886 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8887 (setq continue nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8888 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8889
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8890 (defconst js2-parse-shift-ops
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8891 (list js2-LSH js2-URSH js2-RSH))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8892
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8893 (defun js2-parse-shift-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8894 (let ((pn (js2-parse-add-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8895 tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8896 (continue t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8897 (while continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8898 (setq tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8899 (if (memq tt js2-parse-shift-ops)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8900 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8901 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8902 (setq pn (js2-make-binary tt pn 'js2-parse-add-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8903 (setq continue nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8904 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8905
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8906 (defun js2-parse-add-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8907 (let ((pn (js2-parse-mul-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8908 tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8909 (continue t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8910 (while continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8911 (setq tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8912 (if (or (= tt js2-ADD) (= tt js2-SUB))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8913 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8914 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8915 (setq pn (js2-make-binary tt pn 'js2-parse-mul-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8916 (setq continue nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8917 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8918
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8919 (defconst js2-parse-mul-ops
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8920 (list js2-MUL js2-DIV js2-MOD))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8921
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8922 (defun js2-parse-mul-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8923 (let ((pn (js2-parse-unary-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8924 tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8925 (continue t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8926 (while continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8927 (setq tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8928 (if (memq tt js2-parse-mul-ops)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8929 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8930 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8931 (setq pn (js2-make-binary tt pn 'js2-parse-unary-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8932 (setq continue nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8933 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8934
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8935 (defsubst js2-make-unary (type parser &rest args)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8936 "Make a unary node of type TYPE.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8937 PARSER is either a node (for postfix operators) or a function to call
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8938 to parse the operand (for prefix operators)."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8939 (let* ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8940 (postfix (js2-node-p parser))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8941 (expr (if postfix
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8942 parser
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8943 (apply parser args)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8944 end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8945 pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8946 (if postfix ; e.g. i++
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8947 (setq pos (js2-node-pos expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8948 end js2-token-end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8949 (setq end (js2-node-end expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8950 (setq pn (make-js2-unary-node :type type
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8951 :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8952 :len (- end pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8953 :operand expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8954 (js2-node-add-children pn expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8955 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8956
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8957 (defconst js2-incrementable-node-types
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8958 (list js2-NAME js2-GETPROP js2-GETELEM js2-GET_REF js2-CALL)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8959 "Node types that can be the operand of a ++ or -- operator.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8960
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8961 (defsubst js2-check-bad-inc-dec (tt beg end unary)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8962 (unless (memq (js2-node-type (js2-unary-node-operand unary))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8963 js2-incrementable-node-types)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8964 (js2-report-error (if (= tt js2-INC)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8965 "msg.bad.incr"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8966 "msg.bad.decr")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8967 nil beg (- end beg))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8968
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8969 (defun js2-parse-unary-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8970 (let ((tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8971 pn expr beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8972 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8973 ((or (= tt js2-VOID)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8974 (= tt js2-NOT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8975 (= tt js2-BITNOT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8976 (= tt js2-TYPEOF))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8977 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8978 (js2-make-unary tt 'js2-parse-unary-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8979
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8980 ((= tt js2-ADD)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8981 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8982 ;; Convert to special POS token in decompiler and parse tree
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8983 (js2-make-unary js2-POS 'js2-parse-unary-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8984
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8985 ((= tt js2-SUB)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8986 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8987 ;; Convert to special NEG token in decompiler and parse tree
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8988 (js2-make-unary js2-NEG 'js2-parse-unary-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8989
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8990 ((or (= tt js2-INC)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8991 (= tt js2-DEC))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8992 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8993 (prog1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8994 (setq beg js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8995 end js2-token-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8996 expr (js2-make-unary tt 'js2-parse-member-expr t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8997 (js2-check-bad-inc-dec tt beg end expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8998
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8999 ((= tt js2-DELPROP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9000 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9001 (js2-make-unary js2-DELPROP 'js2-parse-unary-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9002
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9003 ((= tt js2-ERROR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9004 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9005 (make-js2-error-node)) ; try to continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9006
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9007 ((and (= tt js2-LT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9008 js2-compiler-xml-available)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9009 ;; XML stream encountered in expression.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9010 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9011 (js2-parse-member-expr-tail t (js2-parse-xml-initializer)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9012 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9013 (setq pn (js2-parse-member-expr t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9014 ;; Don't look across a newline boundary for a postfix incop.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9015 tt (js2-peek-token-or-eol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9016 (when (or (= tt js2-INC) (= tt js2-DEC))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9017 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9018 (setf expr pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9019 pn (js2-make-unary tt expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9020 (js2-node-set-prop pn 'postfix t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9021 (js2-check-bad-inc-dec tt js2-token-beg js2-token-end pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9022 pn))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9023
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9024 (defun js2-parse-xml-initializer ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9025 "Parse an E4X XML initializer.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9026 I'm parsing it the way Rhino parses it, but without the tree-rewriting.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9027 Then I'll postprocess the result, depending on whether we're in IDE
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9028 mode or codegen mode, and generate the appropriate rewritten AST.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9029 IDE mode uses a rich AST that models the XML structure. Codegen mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9030 just concatenates everything and makes a new XML or XMLList out of it."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9031 (let ((tt (js2-get-first-xml-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9032 pn-xml
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9033 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9034 expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9035 kids
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9036 expr-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9037 (continue t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9038 (first-token t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9039 (when (not (or (= tt js2-XML) (= tt js2-XMLEND)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9040 (js2-report-error "msg.syntax"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9041 (setq pn-xml (make-js2-xml-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9042 (while continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9043 (if first-token
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9044 (setq first-token nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9045 (setq tt (js2-get-next-xml-token)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9046 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9047 ;; js2-XML means we found a {expr} in the XML stream.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9048 ;; The js2-ts-string is the XML up to the left-curly.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9049 ((= tt js2-XML)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9050 (push (make-js2-string-node :pos js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9051 :len (- js2-ts-cursor js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9052 kids)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9053 (js2-must-match js2-LC "msg.syntax")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9054 (setq expr-pos js2-ts-cursor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9055 expr (if (eq (js2-peek-token) js2-RC)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9056 (make-js2-empty-expr-node :pos expr-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9057 (js2-parse-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9058 (js2-must-match js2-RC "msg.syntax")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9059 (setq pn (make-js2-xml-js-expr-node :pos (js2-node-pos expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9060 :len (js2-node-len expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9061 :expr expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9062 (js2-node-add-children pn expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9063 (push pn kids))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9064
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9065 ;; a js2-XMLEND token means we hit the final close-tag.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9066 ((= tt js2-XMLEND)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9067 (push (make-js2-string-node :pos js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9068 :len (- js2-ts-cursor js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9069 kids)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9070 (dolist (kid (nreverse kids))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9071 (js2-block-node-push pn-xml kid))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9072 (setf (js2-node-len pn-xml) (- js2-ts-cursor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9073 (js2-node-pos pn-xml))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9074 continue nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9075 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9076 (js2-report-error "msg.syntax")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9077 (setq continue nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9078 pn-xml))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9079
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9080
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9081 (defun js2-parse-argument-list ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9082 "Parse an argument list and return it as a lisp list of nodes.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9083 Returns the list in reverse order. Consumes the right-paren token."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9084 (let (result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9085 (unless (js2-match-token js2-RP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9086 (loop do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9087 (if (= (js2-peek-token) js2-YIELD)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9088 (js2-report-error "msg.yield.parenthesized"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9089 (push (js2-parse-assign-expr) result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9090 while
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9091 (js2-match-token js2-COMMA))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9092 (js2-must-match js2-RP "msg.no.paren.arg")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9093 result)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9094
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9095 (defun js2-parse-member-expr (&optional allow-call-syntax)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9096 (let ((tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9097 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9098 pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9099 target
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9100 args
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9101 beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9102 end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9103 init
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9104 tail)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9105 (if (/= tt js2-NEW)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9106 (setq pn (js2-parse-primary-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9107 ;; parse a 'new' expression
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9108 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9109 (setq pos js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9110 beg pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9111 target (js2-parse-member-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9112 end (js2-node-end target)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9113 pn (make-js2-new-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9114 :target target
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9115 :len (- end pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9116 (js2-node-add-children pn target)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9117 (when (js2-match-token js2-LP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9118 ;; Add the arguments to pn, if any are supplied.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9119 (setf beg pos ; start of "new" keyword
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9120 pos js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9121 args (nreverse (js2-parse-argument-list))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9122 (js2-new-node-args pn) args
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9123 end js2-token-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9124 (js2-new-node-lp pn) (- pos beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9125 (js2-new-node-rp pn) (- end 1 beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9126 (apply #'js2-node-add-children pn args))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9127
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9128 (when (and js2-allow-rhino-new-expr-initializer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9129 (js2-match-token js2-LC))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9130 (setf init (js2-parse-object-literal)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9131 end (js2-node-end init)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9132 (js2-new-node-initializer pn) init)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9133 (js2-node-add-children pn init))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9134
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9135 (setf (js2-node-len pn) (- beg pos))) ; end outer if
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9136
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9137 (js2-parse-member-expr-tail allow-call-syntax pn)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9138
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9139 (defun js2-parse-member-expr-tail (allow-call-syntax pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9140 "Parse a chain of property/array accesses or function calls.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9141 Includes parsing for E4X operators like `..' and `.@'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9142 If ALLOW-CALL-SYNTAX is nil, stops when we encounter a left-paren.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9143 Returns an expression tree that includes PN, the parent node."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9144 (let ((beg (js2-node-pos pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9145 tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9146 (continue t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9147 (while continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9148 (setq tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9149 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9150 ((or (= tt js2-DOT) (= tt js2-DOTDOT))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9151 (setq pn (js2-parse-property-access tt pn)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9152
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9153 ((= tt js2-DOTQUERY)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9154 (setq pn (js2-parse-dot-query pn)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9155
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9156 ((= tt js2-LB)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9157 (setq pn (js2-parse-element-get pn)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9158
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9159 ((= tt js2-LP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9160 (if allow-call-syntax
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9161 (setq pn (js2-parse-function-call pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9162 (setq continue nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9163 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9164 (setq continue nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9165 (if (>= js2-highlight-level 2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9166 (js2-parse-highlight-member-expr-node pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9167 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9168
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9169 (defun js2-parse-dot-query (pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9170 "Parse a dot-query expression, e.g. foo.bar.(@name == 2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9171 Last token parsed must be `js2-DOTQUERY'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9172 (let ((pos (js2-node-pos pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9173 op-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9174 expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9175 end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9176 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9177 (js2-must-have-xml)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9178 (js2-set-requires-activation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9179 (setq op-pos js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9180 expr (js2-parse-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9181 end (js2-node-end expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9182 pn (make-js2-xml-dot-query-node :left pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9183 :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9184 :op-pos op-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9185 :right expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9186 (js2-node-add-children pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9187 (js2-xml-dot-query-node-left pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9188 (js2-xml-dot-query-node-right pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9189 (if (js2-must-match js2-RP "msg.no.paren")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9190 (setf (js2-xml-dot-query-node-rp pn) js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9191 end js2-token-end))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9192 (setf (js2-node-len pn) (- end pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9193 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9194
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9195 (defun js2-parse-element-get (pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9196 "Parse an element-get expression, e.g. foo[bar].
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9197 Last token parsed must be `js2-RB'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9198 (let ((lb js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9199 (pos (js2-node-pos pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9200 rb
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9201 expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9202 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9203 (setq expr (js2-parse-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9204 (if (js2-must-match js2-RB "msg.no.bracket.index")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9205 (setq rb js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9206 (setq pn (make-js2-elem-get-node :target pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9207 :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9208 :element expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9209 :lb (js2-relpos lb pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9210 :rb (js2-relpos rb pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9211 :len (- js2-token-end pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9212 (js2-node-add-children pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9213 (js2-elem-get-node-target pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9214 (js2-elem-get-node-element pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9215 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9216
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9217 (defun js2-parse-function-call (pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9218 (let (args
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9219 (pos (js2-node-pos pn)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9220 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9221 (setq pn (make-js2-call-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9222 :target pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9223 :lp (- js2-token-beg pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9224 (js2-node-add-children pn (js2-call-node-target pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9225
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9226 ;; Add the arguments to pn, if any are supplied.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9227 (setf args (nreverse (js2-parse-argument-list))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9228 (js2-call-node-rp pn) (- js2-token-beg pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9229 (js2-call-node-args pn) args)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9230 (apply #'js2-node-add-children pn args)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9231
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9232 (setf (js2-node-len pn) (- js2-ts-cursor pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9233 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9234
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9235 (defun js2-parse-property-access (tt pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9236 "Parse a property access, XML descendants access, or XML attr access."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9237 (let ((member-type-flags 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9238 (dot-pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9239 (dot-len (if (= tt js2-DOTDOT) 2 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9240 name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9241 ref ; right side of . or .. operator
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9242 result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9243 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9244 (when (= tt js2-DOTDOT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9245 (js2-must-have-xml)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9246 (setq member-type-flags js2-descendants-flag))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9247 (if (not js2-compiler-xml-available)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9248 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9249 (js2-must-match-prop-name "msg.no.name.after.dot")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9250 (setq name (js2-create-name-node t js2-GETPROP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9251 result (make-js2-prop-get-node :left pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9252 :pos js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9253 :right name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9254 :len (- js2-token-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9255 js2-token-beg)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9256 (js2-node-add-children result pn name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9257 result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9258 ;; otherwise look for XML operators
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9259 (setf result (if (= tt js2-DOT)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9260 (make-js2-prop-get-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9261 (make-js2-infix-node :type js2-DOTDOT))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9262 (js2-node-pos result) (js2-node-pos pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9263 (js2-infix-node-op-pos result) dot-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9264 (js2-infix-node-left result) pn ; do this after setting position
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9265 tt (js2-next-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9266 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9267 ;; needed for generator.throw()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9268 ((= tt js2-THROW)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9269 (js2-save-name-token-data js2-token-beg "throw")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9270 (setq ref (js2-parse-property-name nil js2-ts-string member-type-flags)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9271
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9272 ;; handles: name, ns::name, ns::*, ns::[expr]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9273 ((js2-valid-prop-name-token tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9274 (setq ref (js2-parse-property-name -1 js2-ts-string member-type-flags)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9275
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9276 ;; handles: *, *::name, *::*, *::[expr]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9277 ((= tt js2-MUL)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9278 (js2-save-name-token-data js2-token-beg "*")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9279 (setq ref (js2-parse-property-name nil "*" member-type-flags)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9280
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9281 ;; handles: '@attr', '@ns::attr', '@ns::*', '@ns::[expr]', etc.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9282 ((= tt js2-XMLATTR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9283 (setq result (js2-parse-attribute-access)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9284
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9285 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9286 (js2-report-error "msg.no.name.after.dot" nil dot-pos dot-len)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9287
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9288 (if ref
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9289 (setf (js2-node-len result) (- (js2-node-end ref)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9290 (js2-node-pos result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9291 (js2-infix-node-right result) ref))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9292 (if (js2-infix-node-p result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9293 (js2-node-add-children result
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9294 (js2-infix-node-left result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9295 (js2-infix-node-right result)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9296 result)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9297
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9298 (defun js2-parse-attribute-access ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9299 "Parse an E4X XML attribute expression.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9300 This includes expressions of the forms:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9301
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9302 @attr @ns::attr @ns::*
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9303 @* @*::attr @*::*
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9304 @[expr] @*::[expr] @ns::[expr]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9305
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9306 Called if we peeked an '@' token."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9307 (let ((tt (js2-next-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9308 (at-pos js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9309 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9310 ;; handles: @name, @ns::name, @ns::*, @ns::[expr]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9311 ((js2-valid-prop-name-token tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9312 (js2-parse-property-name at-pos js2-ts-string 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9313
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9314 ;; handles: @*, @*::name, @*::*, @*::[expr]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9315 ((= tt js2-MUL)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9316 (js2-save-name-token-data js2-token-beg "*")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9317 (js2-parse-property-name js2-token-beg "*" 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9318
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9319 ;; handles @[expr]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9320 ((= tt js2-LB)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9321 (js2-parse-xml-elem-ref at-pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9322
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9323 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9324 (js2-report-error "msg.no.name.after.xmlAttr")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9325 ;; Avoid cascaded errors that happen if we make an error node here.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9326 (js2-save-name-token-data js2-token-beg "")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9327 (js2-parse-property-name js2-token-beg "" 0)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9328
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9329 (defun js2-parse-property-name (at-pos s member-type-flags)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9330 "Check if :: follows name in which case it becomes qualified name.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9331
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9332 AT-POS is a natural number if we just read an '@' token, else nil.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9333 S is the name or string that was matched: an identifier, 'throw' or '*'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9334 MEMBER-TYPE-FLAGS is a bit set tracking whether we're a '.' or '..' child.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9335
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9336 Returns a `js2-xml-ref-node' if it's an attribute access, a child of a '..'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9337 operator, or the name is followed by ::. For a plain name, returns a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9338 `js2-name-node'. Returns a `js2-error-node' for malformed XML expressions."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9339 (let ((pos (or at-pos js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9340 colon-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9341 (name (js2-create-name-node t js2-current-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9342 ns
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9343 tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9344 ref
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9345 pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9346 (catch 'return
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9347 (when (js2-match-token js2-COLONCOLON)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9348 (setq ns name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9349 colon-pos js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9350 tt (js2-next-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9351 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9352 ;; handles name::name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9353 ((js2-valid-prop-name-token tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9354 (setq name (js2-create-name-node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9355
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9356 ;; handles name::*
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9357 ((= tt js2-MUL)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9358 (js2-save-name-token-data js2-token-beg "*")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9359 (setq name (js2-create-name-node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9360
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9361 ;; handles name::[expr]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9362 ((= tt js2-LB)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9363 (throw 'return (js2-parse-xml-elem-ref at-pos ns colon-pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9364
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9365 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9366 (js2-report-error "msg.no.name.after.coloncolon"))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9367
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9368 (if (and (null ns) (zerop member-type-flags))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9369 name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9370 (prog1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9371 (setq pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9372 (make-js2-xml-prop-ref-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9373 :len (- (js2-node-end name) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9374 :at-pos at-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9375 :colon-pos colon-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9376 :propname name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9377 (js2-node-add-children pn name))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9378
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9379 (defun js2-parse-xml-elem-ref (at-pos &optional namespace colon-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9380 "Parse the [expr] portion of an xml element reference.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9381 For instance, @[expr], @*::[expr], or ns::[expr]."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9382 (let* ((lb js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9383 (pos (or at-pos lb))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9384 rb
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9385 (expr (js2-parse-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9386 (end (js2-node-end expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9387 pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9388 (if (js2-must-match js2-RB "msg.no.bracket.index")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9389 (setq rb js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9390 end js2-token-end))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9391 (prog1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9392 (setq pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9393 (make-js2-xml-elem-ref-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9394 :len (- end pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9395 :namespace namespace
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9396 :colon-pos colon-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9397 :at-pos at-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9398 :expr expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9399 :lb (js2-relpos lb pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9400 :rb (js2-relpos rb pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9401 (js2-node-add-children pn namespace expr))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9402
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9403 (defun js2-parse-primary-expr ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9404 "Parses a literal (leaf) expression of some sort.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9405 Includes complex literals such as functions, object-literals,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9406 array-literals, array comprehensions and regular expressions."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9407 (let ((tt-flagged (js2-next-flagged-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9408 pn ; parent node (usually return value)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9409 tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9410 px-pos ; paren-expr pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9411 len
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9412 flags ; regexp flags
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9413 expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9414 (setq tt js2-current-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9415 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9416 ((= tt js2-FUNCTION)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9417 (js2-parse-function 'FUNCTION_EXPRESSION))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9418
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9419 ((= tt js2-LB)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9420 (js2-parse-array-literal))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9421
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9422 ((= tt js2-LC)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9423 (js2-parse-object-literal))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9424
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9425 ((= tt js2-LET)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9426 (js2-parse-let js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9427
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9428 ((= tt js2-LP)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9429 (setq px-pos js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9430 expr (js2-parse-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9431 (js2-must-match js2-RP "msg.no.paren")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9432 (setq pn (make-js2-paren-node :pos px-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9433 :expr expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9434 :len (- js2-token-end px-pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9435 (js2-node-add-children pn (js2-paren-node-expr pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9436 pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9437
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9438 ((= tt js2-XMLATTR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9439 (js2-must-have-xml)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9440 (js2-parse-attribute-access))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9441
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9442 ((= tt js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9443 (js2-parse-name tt-flagged tt))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9444
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9445 ((= tt js2-NUMBER)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9446 (make-js2-number-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9447
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9448 ((= tt js2-STRING)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9449 (prog1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9450 (make-js2-string-node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9451 (js2-record-face 'font-lock-string-face)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9452
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9453 ((or (= tt js2-DIV) (= tt js2-ASSIGN_DIV))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9454 ;; Got / or /= which in this context means a regexp literal
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9455 (setq px-pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9456 (js2-read-regexp tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9457 (setq flags js2-ts-regexp-flags
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9458 js2-ts-regexp-flags nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9459 (prog1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9460 (make-js2-regexp-node :pos px-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9461 :len (- js2-ts-cursor px-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9462 :value js2-ts-string
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9463 :flags flags)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9464 (js2-set-face px-pos js2-ts-cursor 'font-lock-string-face 'record)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9465
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9466 ((or (= tt js2-NULL)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9467 (= tt js2-THIS)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9468 (= tt js2-FALSE)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9469 (= tt js2-TRUE))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9470 (make-js2-keyword-node :type tt))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9471
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9472 ((= tt js2-RESERVED)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9473 (js2-report-error "msg.reserved.id")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9474 (make-js2-name-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9475
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9476 ((= tt js2-ERROR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9477 ;; the scanner or one of its subroutines reported the error.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9478 (make-js2-error-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9479
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9480 ((= tt js2-EOF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9481 (setq px-pos (point-at-bol)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9482 len (- js2-ts-cursor px-pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9483 (js2-report-error "msg.unexpected.eof" nil px-pos len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9484 (make-js2-error-node :pos px-pos :len len))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9485
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9486 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9487 (js2-report-error "msg.syntax")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9488 (make-js2-error-node)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9489
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9490 (defun js2-parse-name (tt-flagged tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9491 (let ((name js2-ts-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9492 (name-pos js2-token-beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9493 (if (and (js2-flag-set-p tt-flagged js2-ti-check-label)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9494 (= (js2-peek-token) js2-COLON))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9495 (prog1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9496 ;; Do not consume colon, it is used as unwind indicator
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9497 ;; to return to statementHelper.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9498 (make-js2-label-node :pos name-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9499 :len (- js2-token-end name-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9500 :name name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9501 (js2-set-face name-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9502 js2-token-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9503 'font-lock-variable-name-face 'record))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9504 ;; Otherwise not a label, just a name. Unfortunately peeking
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9505 ;; the next token to check for a colon has biffed js2-token-beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9506 ;; and js2-token-end. We store the name's bounds in buffer vars
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9507 ;; and `js2-create-name-node' uses them.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9508 (js2-save-name-token-data name-pos name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9509 (if js2-compiler-xml-available
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9510 (js2-parse-property-name nil name 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9511 (js2-create-name-node 'check-activation)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9512
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9513 (defsubst js2-parse-warn-trailing-comma (msg pos elems comma-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9514 (js2-add-strict-warning
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9515 msg nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9516 ;; back up from comma to beginning of line or array/objlit
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9517 (max (if elems
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9518 (js2-node-pos (car elems))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9519 pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9520 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9521 (goto-char comma-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9522 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9523 (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9524 comma-pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9525
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9526 (defun js2-parse-array-literal ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9527 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9528 (end js2-token-end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9529 (after-lb-or-comma t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9530 after-comma
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9531 tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9532 elems
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9533 pn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9534 (continue t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9535 (while continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9536 (setq tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9537 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9538 ;; comma
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9539 ((= tt js2-COMMA)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9540 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9541 (setq after-comma js2-token-end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9542 (if (not after-lb-or-comma)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9543 (setq after-lb-or-comma t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9544 (push nil elems)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9545
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9546 ;; end of array
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9547 ((or (= tt js2-RB)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9548 (= tt js2-EOF)) ; prevent infinite loop
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9549 (if (= tt js2-EOF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9550 (js2-report-error "msg.no.bracket.arg" nil pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9551 (js2-consume-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9552 (setq continue nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9553 end js2-token-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9554 pn (make-js2-array-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9555 :len (- js2-ts-cursor pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9556 :elems (nreverse elems)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9557 (apply #'js2-node-add-children pn (js2-array-node-elems pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9558 (when after-comma
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9559 (js2-parse-warn-trailing-comma "msg.array.trailing.comma"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9560 pos elems after-comma)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9561
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9562 ;; array comp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9563 ((and (>= js2-language-version 170)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9564 (= tt js2-FOR) ; check for array comprehension
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9565 (not after-lb-or-comma) ; "for" can't follow a comma
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9566 elems ; must have at least 1 element
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9567 (not (cdr elems))) ; but no 2nd element
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9568 (setf continue nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9569 pn (js2-parse-array-comprehension (car elems) pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9570
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9571 ;; another element
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9572 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9573 (unless after-lb-or-comma
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9574 (js2-report-error "msg.no.bracket.arg"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9575 (push (js2-parse-assign-expr) elems)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9576 (setq after-lb-or-comma nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9577 after-comma nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9578 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9579
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9580 (defun js2-parse-array-comprehension (expr pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9581 "Parse a JavaScript 1.7 Array Comprehension.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9582 EXPR is the first expression after the opening left-bracket.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9583 POS is the beginning of the LB token preceding EXPR.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9584 We should have just parsed the 'for' keyword before calling this function."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9585 (let (loops
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9586 filter
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9587 if-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9588 result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9589 (while (= (js2-peek-token) js2-FOR)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9590 (push (js2-parse-array-comp-loop) loops))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9591 (when (= (js2-peek-token) js2-IF)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9592 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9593 (setq if-pos (- js2-token-beg pos) ; relative
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9594 filter (js2-parse-condition)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9595 (js2-must-match js2-RB "msg.no.bracket.arg" pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9596 (setq result (make-js2-array-comp-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9597 :len (- js2-ts-cursor pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9598 :result expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9599 :loops (nreverse loops)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9600 :filter (car filter)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9601 :lp (js2-relpos (second filter) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9602 :rp (js2-relpos (third filter) pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9603 :if-pos if-pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9604 (apply #'js2-node-add-children result expr (car filter)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9605 (js2-array-comp-node-loops result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9606 result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9607
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9608 (defun js2-parse-array-comp-loop ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9609 "Parse a 'for [each] (foo in bar)' expression in an Array comprehension.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9610 Last token peeked should be the initial FOR."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9611 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9612 (pn (make-js2-array-comp-loop-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9613 tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9614 iter
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9615 obj
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9616 foreach-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9617 in-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9618 each-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9619 lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9620 rp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9621 (assert (= (js2-next-token) js2-FOR)) ; consumes token
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9622 (js2-push-scope pn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9623 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9624 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9625 (when (js2-match-token js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9626 (if (string= js2-ts-string "each")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9627 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9628 (setq foreach-p t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9629 each-pos (- js2-token-beg pos)) ; relative
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9630 (js2-record-face 'font-lock-keyword-face))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9631 (js2-report-error "msg.no.paren.for")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9632
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9633 (if (js2-must-match js2-LP "msg.no.paren.for")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9634 (setq lp (- js2-token-beg pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9635
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9636 (setq tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9637 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9638 ((or (= tt js2-LB)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9639 (= tt js2-LC))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9640 ;; handle destructuring assignment
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9641 (setq iter (js2-parse-primary-expr)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9642
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9643 ((js2-valid-prop-name-token tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9644 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9645 (setq iter (js2-create-name-node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9646
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9647 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9648 (js2-report-error "msg.bad.var")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9649
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9650 ;; Define as a let since we want the scope of the variable to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9651 ;; be restricted to the array comprehension
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9652 (if (js2-name-node-p iter)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9653 (js2-define-symbol js2-LET (js2-name-node-name iter) pn t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9654
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9655 (if (js2-must-match js2-IN "msg.in.after.for.name")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9656 (setq in-pos (- js2-token-beg pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9657
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9658 (setq obj (js2-parse-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9659 (if (js2-must-match js2-RP "msg.no.paren.for.ctrl")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9660 (setq rp (- js2-token-beg pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9661
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9662 (setf (js2-node-pos pn) pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9663 (js2-node-len pn) (- js2-ts-cursor pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9664 (js2-array-comp-loop-node-iterator pn) iter
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9665 (js2-array-comp-loop-node-object pn) obj
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9666 (js2-array-comp-loop-node-in-pos pn) in-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9667 (js2-array-comp-loop-node-each-pos pn) each-pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9668 (js2-array-comp-loop-node-foreach-p pn) foreach-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9669 (js2-array-comp-loop-node-lp pn) lp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9670 (js2-array-comp-loop-node-rp pn) rp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9671 (js2-node-add-children pn iter obj))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9672 (js2-pop-scope))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9673 pn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9674
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9675 (defun js2-parse-object-literal ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9676 (let ((pos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9677 tt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9678 elems
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9679 result
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9680 after-comma
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9681 (continue t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9682 (while continue
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9683 (setq tt (js2-peek-token))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9684 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9685 ;; {foo: ...}, {'foo': ...}, {get foo() {...}}, or {set foo(x) {...}}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9686 ((or (js2-valid-prop-name-token tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9687 (= tt js2-STRING))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9688 (setq after-comma nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9689 result (js2-parse-named-prop tt))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9690 (if (and (null result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9691 (not js2-recover-from-parse-errors))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9692 (setq continue nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9693 (push result elems)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9694
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9695 ;; {12: x} or {10.7: x}
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9696 ((= tt js2-NUMBER)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9697 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9698 (setq after-comma nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9699 (push (js2-parse-plain-property (make-js2-number-node)) elems))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9700
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9701 ;; trailing comma
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9702 ((= tt js2-RC)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9703 (setq continue nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9704 (if after-comma
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9705 (js2-parse-warn-trailing-comma "msg.extra.trailing.comma"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9706 pos elems after-comma)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9707 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9708 (js2-report-error "msg.bad.prop")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9709 (unless js2-recover-from-parse-errors
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9710 (setq continue nil)))) ; end switch
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9711
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9712 (if (js2-match-token js2-COMMA)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9713 (setq after-comma js2-token-end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9714 (setq continue nil))) ; end loop
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9715
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9716 (js2-must-match js2-RC "msg.no.brace.prop")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9717 (setq result (make-js2-object-node :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9718 :len (- js2-ts-cursor pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9719 :elems (nreverse elems)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9720 (apply #'js2-node-add-children result (js2-object-node-elems result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9721 result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9722
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9723 (defun js2-parse-named-prop (tt)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9724 "Parse a name, string, or getter/setter object property."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9725 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9726 (let ((string-prop (and (= tt js2-STRING)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9727 (make-js2-string-node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9728 expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9729 (ppos js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9730 (pend js2-token-end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9731 (name (js2-create-name-node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9732 (prop js2-ts-string))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9733
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9734 (if (and (= tt js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9735 (= (js2-peek-token) js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9736 (or (string= prop "get")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9737 (string= prop "set")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9738 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9739 ;; getter/setter prop
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9740 (js2-consume-token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9741 (js2-set-face ppos pend 'font-lock-keyword-face 'record) ; get/set
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9742 (js2-record-face 'font-lock-function-name-face) ; for peeked name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9743 (setq name (js2-create-name-node)) ; discard get/set & use peeked name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9744 (js2-parse-getter-setter-prop ppos name (string= prop "get")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9745
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9746 ;; regular prop
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9747 (prog1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9748 (setq expr (js2-parse-plain-property (or string-prop name)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9749 (js2-set-face ppos pend
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9750 (if (js2-function-node-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9751 (js2-object-prop-node-right expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9752 'font-lock-function-name-face
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9753 'font-lock-variable-name-face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9754 'record)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9755
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9756 (defun js2-parse-plain-property (prop)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9757 "Parse a non-getter/setter property in an object literal.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9758 PROP is the node representing the property: a number, name or string."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9759 (js2-must-match js2-COLON "msg.no.colon.prop")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9760 (let* ((pos (js2-node-pos prop))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9761 (colon (- js2-token-beg pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9762 (expr (js2-parse-assign-expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9763 (result (make-js2-object-prop-node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9764 :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9765 ;; don't include last consumed token in length
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9766 :len (- (+ (js2-node-pos expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9767 (js2-node-len expr))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9768 pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9769 :left prop
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9770 :right expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9771 :op-pos colon)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9772 (js2-node-add-children result prop expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9773 result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9774
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9775 (defun js2-parse-getter-setter-prop (pos prop get-p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9776 "Parse getter or setter property in an object literal.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9777 JavaScript syntax is:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9778
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9779 { get foo() {...}, set foo(x) {...} }
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9780
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9781 POS is the start position of the `get' or `set' keyword.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9782 PROP is the `js2-name-node' representing the property name.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9783 GET-P is non-nil if the keyword was `get'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9784 (let ((type (if get-p js2-GET js2-SET))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9785 result
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9786 end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9787 (fn (js2-parse-function 'FUNCTION_EXPRESSION)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9788
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9789 ;; it has to be an anonymous function, as we already parsed the name
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9790 (if (/= (js2-node-type fn) js2-FUNCTION)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9791 (js2-report-error "msg.bad.prop")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9792 (if (plusp (length (js2-function-name fn)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9793 (js2-report-error "msg.bad.prop")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9794
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9795 (js2-node-set-prop fn 'GETTER_SETTER type) ; for codegen
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9796 (setq end (js2-node-end fn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9797 result (make-js2-getter-setter-node :type type
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9798 :pos pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9799 :len (- end pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9800 :left prop
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9801 :right fn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9802 (js2-node-add-children result prop fn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9803 result))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9804
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9805 (defun js2-create-name-node (&optional check-activation-p token)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9806 "Create a name node using the token info from last scanned name.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9807 In some cases we need to either synthesize a name node, or we lost
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9808 the name token information by peeking. If the TOKEN parameter is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9809 not `js2-NAME', then we use the token info saved in instance vars."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9810 (let ((beg js2-token-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9811 (s js2-ts-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9812 name)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9813 (when (/= js2-current-token js2-NAME)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9814 (setq beg (or js2-prev-name-token-start js2-ts-cursor)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9815 s js2-prev-name-token-string
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9816 js2-prev-name-token-start nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9817 js2-prev-name-token-string nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9818 (setq name (make-js2-name-node :pos beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9819 :name s
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9820 :len (length s)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9821 (if check-activation-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9822 (js2-check-activation-name s (or token js2-NAME)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9823 name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9824
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9825 (provide 'js2-parse)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9826
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9827 ;;; js2-parse.el ends here
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9828 ;;; js2-indent.el --- indentation for js2-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9829 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9830 ;; Copyright (C) 2008 Steve Yegge
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9831 ;; Author: Steve Yegge (steve.yegge@gmail.com)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9832 ;; Maintainer: Steve Yegge (steve.yegge@gmail.com)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9833
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9834 ;; Commentary:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9835 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9836 ;; This indenter is based on Karl Landström's "javascript.el" indenter.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9837 ;; Karl cleverly deduces that the desired indentation level is often a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9838 ;; function of paren/bracket/brace nesting depth, which can be determined
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9839 ;; quickly via the built-in `parse-partial-sexp' function. His indenter
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9840 ;; then does some equally clever checks to see if we're in the context of a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9841 ;; substatement of a possibly braceless statement keyword such as if, while,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9842 ;; or finally. This approach yields pretty good results.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9843 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9844 ;; The indenter is often "wrong", however, and needs to be overridden.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9845 ;; The right long-term solution is probably to emulate (or modify)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9846 ;; cc-engine, but it's thousands upon thousands of lines of code. Even
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9847 ;; if you were to assume the accurate parse tree from `js2-parse' is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9848 ;; present, indentation is still thousands of lines of code (I've been
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9849 ;; down that path) to handle every possible syntactic edge case, and in
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9850 ;; any case, relying on the parse tree is undesirable because parsing is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9851 ;; slow. So you might as well go the cc-engine approach, but it's a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9852 ;; huge pile of work that I'm just not up for any time soon.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9853 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9854 ;; In the meantime, the compromise solution is that we offer a
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9855 ;; "bounce indenter", configured with `js2-bounce-indent-flag', which
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9856 ;; cycles the current line indent among various likely guess points.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9857 ;; This approach is far from perfect, but should at least make it
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9858 ;; slightly easier to move the line towards its desired indentation
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9859 ;; when manually overriding Karl's heuristic nesting guesser.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9860 ;;
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9861 ;; I've made miscellaneous tweaks to Karl's code to handle some Ecma
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9862 ;; extensions such as `let' and Array comprehensions, and will likely
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9863 ;; make further tweaks to it, but major kudos to Karl for coming up with
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9864 ;; the initial approach, which packs a lot of punch for so little code.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9865
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9866 ;;; Code:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9867
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9868 (defconst js-possibly-braceless-keyword-re
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9869 (regexp-opt
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9870 '("catch" "do" "else" "finally" "for" "if" "try" "while" "with" "let")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9871 'words)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9872 "Regular expression matching keywords that are optionally
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9873 followed by an opening brace.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9874
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9875 (defconst js-indent-operator-re
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9876 (concat "[-+*/%<>=&^|?:.]\\([^-+*/]\\|$\\)\\|"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9877 (regexp-opt '("in" "instanceof") 'words))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9878 "Regular expression matching operators that affect indentation
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9879 of continued expressions.")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9880
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9881 ;; This function has horrible results if you're typing an array
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9882 ;; such as [[1, 2], [3, 4], [5, 6]]. Bounce indenting -really- sucks
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9883 ;; in conjunction with electric-indent, so just disabling it.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9884 (defsubst js2-code-at-bol-p ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9885 "Return t if the first character on line is non-whitespace."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9886 nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9887 ;; (not (memq (char-after (point-at-bol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9888 ;; '(? ?\t)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9889
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9890 (defun js2-insert-and-indent (key)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9891 "Run command bound to key and indent current line. Runs the command
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9892 bound to KEY in the global keymap and indents the current line."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9893 (interactive (list (this-command-keys)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9894 (let ((cmd (lookup-key (current-global-map) key)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9895 (if (commandp cmd)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9896 (call-interactively cmd)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9897 ;; don't do the electric keys inside comments or strings,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9898 ;; and don't do bounce-indent with them.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9899 (let ((parse-state (parse-partial-sexp (point-min) (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9900 (js2-bounce-indent-flag (js2-code-at-bol-p)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9901 (unless (or (nth 3 parse-state)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9902 (nth 4 parse-state))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9903 (indent-according-to-mode))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9904
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9905 (defun js-re-search-forward-inner (regexp &optional bound count)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9906 "Auxiliary function for `js-re-search-forward'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9907 (let ((parse)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9908 (saved-point (point-min)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9909 (while (> count 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9910 (re-search-forward regexp bound)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9911 (setq parse (parse-partial-sexp saved-point (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9912 (cond ((nth 3 parse)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9913 (re-search-forward
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9914 (concat "\\([^\\]\\|^\\)" (string (nth 3 parse)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9915 (save-excursion (end-of-line) (point)) t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9916 ((nth 7 parse)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9917 (forward-line))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9918 ((or (nth 4 parse)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9919 (and (eq (char-before) ?\/) (eq (char-after) ?\*)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9920 (re-search-forward "\\*/"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9921 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9922 (setq count (1- count))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9923 (setq saved-point (point))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9924 (point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9925
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9926 (defun js-re-search-forward (regexp &optional bound noerror count)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9927 "Search forward but ignore strings and comments. Invokes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9928 `re-search-forward' but treats the buffer as if strings and
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9929 comments have been removed."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9930 (let ((saved-point (point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9931 (search-expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9932 (cond ((null count)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9933 '(js-re-search-forward-inner regexp bound 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9934 ((< count 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9935 '(js-re-search-backward-inner regexp bound (- count)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9936 ((> count 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9937 '(js-re-search-forward-inner regexp bound count)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9938 (condition-case err
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9939 (eval search-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9940 (search-failed
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9941 (goto-char saved-point)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9942 (unless noerror
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9943 (error (error-message-string err)))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9944
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9945 (defun js-re-search-backward-inner (regexp &optional bound count)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9946 "Auxiliary function for `js-re-search-backward'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9947 (let ((parse)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9948 (saved-point (point-min)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9949 (while (> count 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9950 (re-search-backward regexp bound)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9951 (setq parse (parse-partial-sexp saved-point (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9952 (cond ((nth 3 parse)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9953 (re-search-backward
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9954 (concat "\\([^\\]\\|^\\)" (string (nth 3 parse)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9955 (save-excursion (beginning-of-line) (point)) t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9956 ((nth 7 parse)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9957 (goto-char (nth 8 parse)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9958 ((or (nth 4 parse)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9959 (and (eq (char-before) ?/) (eq (char-after) ?*)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9960 (re-search-backward "/\\*"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9961 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9962 (setq count (1- count))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9963 (point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9964
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9965 (defun js-re-search-backward (regexp &optional bound noerror count)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9966 "Search backward but ignore strings and comments. Invokes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9967 `re-search-backward' but treats the buffer as if strings and
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9968 comments have been removed."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9969 (let ((saved-point (point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9970 (search-expr
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9971 (cond ((null count)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9972 '(js-re-search-backward-inner regexp bound 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9973 ((< count 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9974 '(js-re-search-forward-inner regexp bound (- count)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9975 ((> count 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9976 '(js-re-search-backward-inner regexp bound count)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9977 (condition-case err
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9978 (eval search-expr)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9979 (search-failed
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9980 (goto-char saved-point)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9981 (unless noerror
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9982 (error (error-message-string err)))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9983
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9984 (defun js-looking-at-operator-p ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9985 "Return non-nil if text after point is an operator (that is not
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9986 a comma)."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9987 (save-match-data
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9988 (and (looking-at js-indent-operator-re)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9989 (or (not (looking-at ":"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9990 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9991 (and (js-re-search-backward "[?:{]\\|\\<case\\>" nil t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9992 (looking-at "?")))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9993
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9994 (defun js-continued-expression-p ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9995 "Returns non-nil if the current line continues an expression."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9996 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9997 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9998 (or (js-looking-at-operator-p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9999 (and (js-re-search-backward "\n" nil t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10000 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10001 (skip-chars-backward " \t")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10002 (backward-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10003 (and (js-looking-at-operator-p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10004 (and (progn (backward-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10005 (not (looking-at "\\*\\|++\\|--\\|/[/*]"))))))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10006
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10007 (defun js-end-of-do-while-loop-p ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10008 "Returns non-nil if word after point is `while' of a do-while
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10009 statement, else returns nil. A braceless do-while statement
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10010 spanning several lines requires that the start of the loop is
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10011 indented to the same column as the current line."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10012 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10013 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10014 (save-match-data
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10015 (when (looking-at "\\s-*\\<while\\>")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10016 (if (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10017 (skip-chars-backward "[ \t\n]*}")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10018 (looking-at "[ \t\n]*}"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10019 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10020 (backward-list) (backward-word 1) (looking-at "\\<do\\>"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10021 (js-re-search-backward "\\<do\\>" (point-at-bol) t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10022 (or (looking-at "\\<do\\>")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10023 (let ((saved-indent (current-indentation)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10024 (while (and (js-re-search-backward "^[ \t]*\\<" nil t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10025 (/= (current-indentation) saved-indent)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10026 (and (looking-at "[ \t]*\\<do\\>")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10027 (not (js-re-search-forward
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10028 "\\<while\\>" (point-at-eol) t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10029 (= (current-indentation) saved-indent)))))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10030
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10031 (defun js-ctrl-statement-indentation ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10032 "Returns the proper indentation of the current line if it
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10033 starts the body of a control statement without braces, else
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10034 returns nil."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10035 (let (forward-sexp-function) ; temporarily unbind it
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10036 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10037 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10038 (when (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10039 (and (not (js2-same-line (point-min)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10040 (not (looking-at "{"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10041 (js-re-search-backward "[[:graph:]]" nil t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10042 (not (looking-at "[{([]"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10043 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10044 (forward-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10045 ;; scan-sexps sometimes throws an error
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10046 (ignore-errors (backward-sexp))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10047 (when (looking-at "(") (backward-word 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10048 (and (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10049 (skip-chars-backward " \t}" (point-at-bol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10050 (bolp))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10051 (looking-at js-possibly-braceless-keyword-re)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10052 (not (js-end-of-do-while-loop-p))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10053 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10054 (goto-char (match-beginning 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10055 (+ (current-indentation) js2-basic-offset))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10056
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10057 (defun js2-indent-in-array-comp (parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10058 "Return non-nil if we think we're in an array comprehension.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10059 In particular, return the buffer position of the first `for' kwd."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10060 (let ((end (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10061 (when (nth 1 parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10062 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10063 (goto-char (nth 1 parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10064 (when (looking-at "\\[")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10065 (forward-char 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10066 (js2-forward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10067 (if (looking-at "[[{]")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10068 (let (forward-sexp-function) ; use lisp version
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10069 (forward-sexp) ; skip destructuring form
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10070 (js2-forward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10071 (if (and (/= (char-after) ?,) ; regular array
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10072 (looking-at "for"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10073 (match-beginning 0)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10074 ;; to skip arbitrary expressions we need the parser,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10075 ;; so we'll just guess at it.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10076 (if (re-search-forward "[^,]* \\(for\\) " end t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10077 (match-beginning 1))))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10078
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10079 (defun js2-array-comp-indentation (parse-status for-kwd)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10080 (if (js2-same-line for-kwd)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10081 ;; first continuation line
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10082 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10083 (goto-char (nth 1 parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10084 (forward-char 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10085 (skip-chars-forward " \t")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10086 (current-column))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10087 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10088 (goto-char for-kwd)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10089 (current-column))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10090
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10091 (defun js-proper-indentation (parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10092 "Return the proper indentation for the current line."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10093 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10094 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10095 (let ((ctrl-stmt-indent (js-ctrl-statement-indentation))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10096 (same-indent-p (looking-at "[]})]\\|\\<case\\>\\|\\<default\\>"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10097 (continued-expr-p (js-continued-expression-p))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10098 (bracket (nth 1 parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10099 beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10100 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10101 ;; indent array comprehension continuation lines specially
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10102 ((and bracket
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10103 (not (js2-same-line bracket))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10104 (setq beg (js2-indent-in-array-comp parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10105 (>= (point) (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10106 (goto-char beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10107 (point-at-bol)))) ; at or after first loop?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10108 (js2-array-comp-indentation parse-status beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10109
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10110 (ctrl-stmt-indent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10111
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10112 (bracket
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10113 (goto-char bracket)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10114 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10115 ((looking-at "[({[][ \t]*\\(/[/*]\\|$\\)")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10116 (let ((p (parse-partial-sexp (point-at-bol) (point))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10117 (when (save-excursion (skip-chars-backward " \t)")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10118 (looking-at ")"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10119 (backward-list))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10120 (if (nth 1 p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10121 (progn (goto-char (1+ (nth 1 p)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10122 (skip-chars-forward " \t"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10123 (back-to-indentation))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10124 (cond (same-indent-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10125 (current-column))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10126 (continued-expr-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10127 (+ (current-column) (* 2 js2-basic-offset)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10128 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10129 (+ (current-column) js2-basic-offset)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10130 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10131 (unless same-indent-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10132 (forward-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10133 (skip-chars-forward " \t"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10134 (current-column))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10135
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10136 (continued-expr-p js2-basic-offset)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10137 (t 0)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10138
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10139 (defun js2-lineup-comment (parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10140 "Indent a multi-line block comment continuation line."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10141 (let* ((beg (nth 8 parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10142 (first-line (js2-same-line beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10143 (offset (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10144 (goto-char beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10145 (if (looking-at "/\\*")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10146 (+ 1 (current-column))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10147 0))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10148 (unless first-line
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10149 (indent-line-to offset))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10150
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10151 (defun js2-backward-sws ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10152 "Move backward through whitespace and comments."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10153 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10154 (while (forward-comment -1)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10155
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10156 (defun js2-forward-sws ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10157 "Move forward through whitespace and comments."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10158 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10159 (while (forward-comment 1)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10160
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10161 (defsubst js2-current-indent (&optional pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10162 "Return column of indentation on current line.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10163 If POS is non-nil, go to that point and return indentation for that line."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10164 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10165 (if pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10166 (goto-char pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10167 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10168 (current-column)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10169
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10170 (defsubst js2-arglist-close ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10171 "Return non-nil if we're on a line beginning with a close-paren/brace."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10172 (save-match-data
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10173 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10174 (goto-char (point-at-bol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10175 (js2-forward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10176 (looking-at "[])}]"))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10177
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10178 (defsubst js2-indent-looks-like-label-p ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10179 (goto-char (point-at-bol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10180 (js2-forward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10181 (looking-at (concat js2-mode-identifier-re ":")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10182
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10183 (defun js2-indent-in-objlit-p (parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10184 "Return non-nil if this looks like an object-literal entry."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10185 (let ((start (nth 1 parse-status)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10186 (and
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10187 start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10188 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10189 (and (zerop (forward-line -1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10190 (not (< (point) start)) ; crossed a {} boundary
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10191 (js2-indent-looks-like-label-p)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10192 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10193 (js2-indent-looks-like-label-p)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10194
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10195 ;; if prev line looks like foobar({ then we're passing an object
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10196 ;; literal to a function call, and people pretty much always want to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10197 ;; de-dent back to the previous line, so move the 'basic-offset'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10198 ;; position to the front.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10199 (defsubst js2-indent-objlit-arg-p (parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10200 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10201 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10202 (js2-backward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10203 (and (eq (1- (point)) (nth 1 parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10204 (eq (char-before) ?{)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10205 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10206 (forward-char -1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10207 (skip-chars-backward " \t")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10208 (eq (char-before) ?\()))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10209
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10210 (defsubst js2-indent-case-block-p ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10211 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10212 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10213 (js2-backward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10214 (goto-char (point-at-bol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10215 (skip-chars-forward " \t")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10216 (save-match-data
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10217 (looking-at "case\\s-.+:"))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10218
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10219 (defsubst js2-syntax-bol ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10220 "Return the point at the first non-whitespace char on the line.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10221 Returns `point-at-bol' if the line is empty."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10222 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10223 (beginning-of-line)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10224 (skip-chars-forward " \t")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10225 (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10226
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10227 (defun js2-bounce-indent (normal-col parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10228 "Cycle among alternate computed indentation positions.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10229 PARSE-STATUS is the result of `parse-partial-sexp' from the beginning
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10230 of the buffer to the current point. NORMAL-COL is the indentation
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10231 column computed by the heuristic guesser based on current paren,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10232 bracket, brace and statement nesting."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10233 (let ((cur-indent (js2-current-indent))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10234 (old-buffer-undo-list buffer-undo-list)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10235 ;; Emacs 21 only has `count-lines', not `line-number-at-pos'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10236 (current-line (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10237 (forward-line 0) ; move to bol
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10238 (1+ (count-lines (point-min) (point)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10239 positions
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10240 pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10241 anchor
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10242 arglist-cont
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10243 same-indent
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10244 prev-line-col
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10245 basic-offset
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10246 computed-pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10247 ;; temporarily don't record undo info, if user requested this
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10248 (if js2-mode-indent-inhibit-undo
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10249 (setq buffer-undo-list t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10250 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10251 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10252 ;; first likely point: indent from beginning of previous code line
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10253 (push (setq basic-offset
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10254 (+ (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10255 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10256 (js2-backward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10257 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10258 (setq prev-line-col (current-column)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10259 js2-basic-offset))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10260 positions)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10261
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10262 ;; second likely point: indent from assign-expr RHS. This
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10263 ;; is just a crude guess based on finding " = " on the previous
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10264 ;; line containing actual code.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10265 (setq pos (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10266 (save-match-data
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10267 (forward-line -1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10268 (goto-char (point-at-bol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10269 (when (re-search-forward "\\s-+\\(=\\)\\s-+"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10270 (point-at-eol) t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10271 (goto-char (match-end 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10272 (skip-chars-forward " \t\r\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10273 (current-column)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10274 (when pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10275 (incf pos js2-basic-offset)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10276 (unless (member pos positions)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10277 (push pos positions)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10278
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10279 ;; third likely point: same indent as previous line of code.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10280 ;; Make it the first likely point if we're not on an
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10281 ;; arglist-close line and previous line ends in a comma, or
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10282 ;; both this line and prev line look like object-literal
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10283 ;; elements.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10284 (setq pos (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10285 (goto-char (point-at-bol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10286 (js2-backward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10287 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10288 (prog1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10289 (current-column)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10290 ;; while we're here, look for trailing comma
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10291 (if (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10292 (goto-char (point-at-eol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10293 (js2-backward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10294 (eq (char-before) ?,))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10295 (setq arglist-cont (1- (point)))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10296 (when pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10297 (if (and (or arglist-cont
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10298 (js2-indent-in-objlit-p parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10299 (not (js2-arglist-close)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10300 (setq same-indent pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10301 (unless (member pos positions)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10302 (push pos positions)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10303
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10304 ;; fourth likely position: first preceding code with less indentation
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10305 ;; than the immediately preceding code line.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10306 (setq pos (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10307 (js2-backward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10308 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10309 (setq anchor (current-column))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10310 (while (and (zerop (forward-line -1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10311 (>= (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10312 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10313 (current-column))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10314 anchor)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10315 (setq pos (current-column))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10316 (unless (member pos positions)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10317 (push pos positions))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10318
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10319 ;; put nesting-heuristic position first in list, sort rest
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10320 (setq positions (nreverse (sort positions '<)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10321 (setq positions (cons normal-col (delete normal-col positions)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10322
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10323 ;; comma-list continuation lines: prev line indent takes precedence
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10324 (if same-indent
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10325 (setq positions
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10326 (cons same-indent
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10327 (sort (delete same-indent positions) '<))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10328
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10329 ;; common special cases where we want to indent in from previous line
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10330 (if (or (js2-indent-case-block-p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10331 (js2-indent-objlit-arg-p parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10332 (setq positions
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10333 (cons basic-offset
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10334 (delete basic-offset positions))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10335
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10336 ;; record whether we're already sitting on one of the alternatives
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10337 (setq pos (member cur-indent positions))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10338 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10339 ;; case 0: we're one one of the alternatives and this is the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10340 ;; first time they've pressed TAB on this line (best-guess).
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10341 ((and js2-mode-indent-ignore-first-tab
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10342 pos
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10343 ;; first time pressing TAB on this line?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10344 (not (eq js2-mode-last-indented-line current-line)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10345 ;; do nothing
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10346 (setq computed-pos nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10347 ;; case 1: only one computed position => use it
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10348 ((null (cdr positions))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10349 (setq computed-pos 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10350 ;; case 2: not on any of the computed spots => use main spot
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10351 ((not pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10352 (setq computed-pos 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10353 ;; case 3: on last position: cycle to first position
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10354 ((null (cdr pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10355 (setq computed-pos 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10356 ;; case 4: on intermediate position: cycle to next position
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10357 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10358 (setq computed-pos (js2-position (second pos) positions))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10359
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10360 ;; see if any hooks want to indent; otherwise we do it
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10361 (loop with result = nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10362 for hook in js2-indent-hook
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10363 while (null result)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10364 do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10365 (setq result (funcall hook positions computed-pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10366 finally do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10367 (unless (or result (null computed-pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10368 (indent-line-to (nth computed-pos positions)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10369
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10370 ;; finally
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10371 (if js2-mode-indent-inhibit-undo
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10372 (setq buffer-undo-list old-buffer-undo-list))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10373 ;; see commentary for `js2-mode-last-indented-line'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10374 (setq js2-mode-last-indented-line current-line))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10375
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10376 (defsubst js2-1-line-comment-continuation-p ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10377 "Return t if we're in a 1-line comment continuation.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10378 If so, we don't ever want to use bounce-indent."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10379 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10380 (save-match-data
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10381 (and (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10382 (forward-line 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10383 (looking-at "\\s-*//"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10384 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10385 (forward-line -1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10386 (forward-line 0)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10387 (when (looking-at "\\s-*$")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10388 (js2-backward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10389 (forward-line 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10390 (looking-at "\\s-*//"))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10391
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10392 (defun js2-indent-line ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10393 "Indent the current line as JavaScript source text."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10394 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10395 (let (parse-status
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10396 current-indent
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10397 offset
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10398 indent-col
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10399 moved
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10400 ;; don't whine about errors/warnings when we're indenting.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10401 ;; This has to be set before calling parse-partial-sexp below.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10402 (inhibit-point-motion-hooks t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10403 (setq parse-status (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10404 (parse-partial-sexp (point-min)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10405 (point-at-bol)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10406 offset (- (point) (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10407 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10408 (setq current-indent (current-column))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10409 (point))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10410 (js2-with-underscore-as-word-syntax
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10411 (if (nth 4 parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10412 (js2-lineup-comment parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10413 (setq indent-col (js-proper-indentation parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10414 ;; see comments below about js2-mode-last-indented-line
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10415 (when
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10416 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10417 ;; bounce-indenting is disabled during electric-key indent.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10418 ;; It doesn't work well on first line of buffer.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10419 ((and js2-bounce-indent-flag
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10420 (not (js2-same-line (point-min)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10421 (not (js2-1-line-comment-continuation-p)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10422 (js2-bounce-indent indent-col parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10423 (setq moved t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10424 ;; just indent to the guesser's likely spot
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10425 ((/= current-indent indent-col)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10426 (indent-line-to indent-col)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10427 (setq moved t)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10428 (when (and moved (plusp offset))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10429 (forward-char offset)))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10430
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10431 (defun js2-indent-region (start end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10432 "Indent the region, but don't use bounce indenting."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10433 (let ((js2-bounce-indent-flag nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10434 (indent-region-function nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10435 (indent-region start end nil))) ; nil for byte-compiler
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10436
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10437 (provide 'js2-indent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10438
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10439 ;;; js2-indent.el ends here
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10440
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10441 (eval-when-compile
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10442 (require 'cl))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10443
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10444 (require 'imenu)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10445 (require 'cc-cmds) ; for `c-fill-paragraph'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10446
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10447
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10448 ;;;###autoload (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10449
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10450 ;;;###autoload
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10451 (defun js2-mode ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10452 "Major mode for editing JavaScript code."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10453 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10454 (js2-mode-check-compat)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10455 (kill-all-local-variables)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10456 (set-syntax-table js2-mode-syntax-table)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10457 (use-local-map js2-mode-map)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10458 (setq major-mode 'js2-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10459 mode-name "JavaScript-IDE"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10460 comment-start "//" ; used by comment-region; don't change it
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10461 comment-end "")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10462 (setq local-abbrev-table js2-mode-abbrev-table)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10463 (set (make-local-variable 'max-lisp-eval-depth)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10464 (max max-lisp-eval-depth 3000))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10465 (set (make-local-variable 'indent-line-function) #'js2-indent-line)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10466 (set (make-local-variable 'indent-region-function) #'js2-indent-region)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10467 (set (make-local-variable 'fill-paragraph-function) #'js2-fill-paragraph)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10468 (set (make-local-variable 'before-save-hook) #'js2-before-save)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10469 (set (make-local-variable 'next-error-function) #'js2-next-error)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10470 (set (make-local-variable 'beginning-of-defun-function) #'js2-beginning-of-defun)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10471 (set (make-local-variable 'end-of-defun-function) #'js2-end-of-defun)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10472 ;; We un-confuse `parse-partial-sexp' by setting syntax-table properties
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10473 ;; for characters inside regexp literals.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10474 (set (make-local-variable 'parse-sexp-lookup-properties) t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10475 ;; this is necessary to make `show-paren-function' work properly
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10476 (set (make-local-variable 'parse-sexp-ignore-comments) t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10477 ;; needed for M-x rgrep, among other things
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10478 (put 'js2-mode 'find-tag-default-function #'js2-mode-find-tag)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10479
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10480 ;; some variables needed by cc-engine for paragraph-fill, etc.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10481 (setq c-buffer-is-cc-mode t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10482 c-comment-prefix-regexp js2-comment-prefix-regexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10483 c-paragraph-start js2-paragraph-start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10484 c-paragraph-separate "$"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10485 comment-start-skip js2-comment-start-skip
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10486 c-syntactic-ws-start js2-syntactic-ws-start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10487 c-syntactic-ws-end js2-syntactic-ws-end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10488 c-syntactic-eol js2-syntactic-eol)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10489 (if js2-emacs22
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10490 (c-setup-paragraph-variables))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10491
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10492 ;; We do our own syntax highlighting based on the parse tree.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10493 ;; However, we want minor modes that add keywords to highlight properly
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10494 ;; (examples: doxymacs, column-marker). We do this by not letting
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10495 ;; font-lock unfontify anything, and telling it to fontify after we
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10496 ;; re-parse and re-highlight the buffer. (We currently don't do any
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10497 ;; work with regions other than the whole buffer.)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10498 (dolist (var '(font-lock-unfontify-buffer-function
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10499 font-lock-unfontify-region-function))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10500 (set (make-local-variable var) (lambda (&rest args) t)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10501
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10502 ;; Don't let font-lock do syntactic (string/comment) fontification.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10503 (set (make-local-variable #'font-lock-syntactic-face-function)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10504 (lambda (state) nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10505
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10506 ;; Experiment: make reparse-delay longer for longer files.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10507 (if (plusp js2-dynamic-idle-timer-adjust)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10508 (setq js2-idle-timer-delay
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10509 (* js2-idle-timer-delay
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10510 (/ (point-max) js2-dynamic-idle-timer-adjust))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10511
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10512 (add-hook 'change-major-mode-hook #'js2-mode-exit nil t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10513 (add-hook 'after-change-functions #'js2-mode-edit nil t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10514 (setq imenu-create-index-function #'js2-mode-create-imenu-index)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10515 (imenu-add-to-menubar (concat "IM-" mode-name))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10516 (when js2-mirror-mode
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10517 (js2-enter-mirror-mode))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10518 (add-to-invisibility-spec '(js2-outline . t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10519 (set (make-local-variable 'line-move-ignore-invisible) t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10520 (set (make-local-variable 'forward-sexp-function) #'js2-mode-forward-sexp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10521 (setq js2-mode-functions-hidden nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10522 js2-mode-comments-hidden nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10523 js2-mode-buffer-dirty-p t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10524 js2-mode-parsing nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10525 (js2-reparse)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10526 (run-hooks 'js2-mode-hook))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10527
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10528 (defun js2-mode-check-compat ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10529 "Signal an error if we can't run with this version of Emacs."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10530 (if (and js2-mode-must-byte-compile
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10531 (not (byte-code-function-p (symbol-function 'js2-mode))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10532 (error "You must byte-compile js2-mode before using it."))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10533 (if (and (boundp 'running-xemacs)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10534 running-xemacs)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10535 (error "js2-mode is not compatible with XEmacs"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10536 (unless (>= emacs-major-version 21)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10537 (error "js2-mode requires GNU Emacs version 21 or higher")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10538
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10539 (defun js2-mode-exit ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10540 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10541 (when js2-mode-node-overlay
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10542 (delete-overlay js2-mode-node-overlay)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10543 (setq js2-mode-node-overlay nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10544 (js2-remove-overlays)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10545 (setq js2-mode-ast nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10546 (remove-hook 'change-major-mode-hook #'js2-mode-exit t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10547 (remove-from-invisibility-spec '(js2-outline . t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10548 (js2-mode-show-all)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10549 (js2-with-unmodifying-text-property-changes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10550 (js2-clear-face (point-min) (point-max))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10551
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10552 (defun js2-before-save ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10553 "Clean up whitespace before saving file.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10554 You can disable this by customizing `js2-cleanup-whitespace'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10555 (when js2-cleanup-whitespace
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10556 (let ((col (current-column)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10557 (delete-trailing-whitespace)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10558 ;; don't change trailing whitespace on current line
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10559 (unless (eq (current-column) col)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10560 (indent-to col)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10561
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10562 (defsubst js2-mode-reset-timer ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10563 (if js2-mode-parse-timer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10564 (cancel-timer js2-mode-parse-timer))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10565 (setq js2-mode-parsing nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10566 (setq js2-mode-parse-timer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10567 (run-with-idle-timer js2-idle-timer-delay nil #'js2-reparse)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10568
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10569 (defun js2-mode-edit (beg end len)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10570 "Schedule a new parse after buffer is edited."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10571 (setq js2-mode-buffer-dirty-p t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10572 (js2-mode-hide-overlay)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10573 (js2-mode-reset-timer))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10574
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10575 (defun js2-mode-run-font-lock ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10576 "Run `font-lock-fontify-buffer' after parsing/highlighting.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10577 This is intended to allow modes that install their own font-lock keywords
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10578 to work with js2-mode. In practice it never seems to work for long.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10579 Hopefully the Emacs maintainers can help figure out a way to make it work."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10580 (when (and (boundp 'font-lock-keywords)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10581 font-lock-keywords
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10582 (boundp 'font-lock-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10583 font-lock-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10584 ;; TODO: font-lock and jit-lock really really REALLY don't want to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10585 ;; play nicely with js2-mode. They go out of their way to fail to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10586 ;; provide any option for saying "look, fontify the goddamn buffer
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10587 ;; with just the keywords already". Argh.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10588 (setq font-lock-defaults (list font-lock-keywords 'keywords-only))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10589 (let (font-lock-verbose)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10590 (font-lock-default-fontify-buffer))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10591
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10592 (defun js2-reparse (&optional force)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10593 "Re-parse current buffer after user finishes some data entry.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10594 If we get any user input while parsing, including cursor motion,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10595 we discard the parse and reschedule it. If FORCE is nil, then the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10596 buffer will only rebuild its `js2-mode-ast' if the buffer is dirty."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10597 (let (time
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10598 interrupted-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10599 (js2-compiler-strict-mode js2-mode-show-strict-warnings))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10600 (unless js2-mode-parsing
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10601 (setq js2-mode-parsing t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10602 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10603 (when (or js2-mode-buffer-dirty-p force)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10604 (js2-remove-overlays)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10605 (js2-with-unmodifying-text-property-changes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10606 (setq js2-mode-buffer-dirty-p nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10607 js2-mode-fontifications nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10608 js2-mode-deferred-properties nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10609 (if js2-mode-verbose-parse-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10610 (message "parsing..."))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10611 (setq time
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10612 (js2-time
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10613 (setq interrupted-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10614 (catch 'interrupted
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10615 (setq js2-mode-ast (js2-parse))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10616 (js2-mode-fontify-regions)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10617 (js2-mode-remove-suppressed-warnings)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10618 (js2-mode-show-warnings)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10619 (js2-mode-show-errors)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10620 (js2-mode-run-font-lock) ; note: doesn't work
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10621 (if (>= js2-highlight-level 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10622 (js2-highlight-jsdoc js2-mode-ast))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10623 nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10624 (if interrupted-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10625 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10626 ;; unfinished parse => try again
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10627 (setq js2-mode-buffer-dirty-p t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10628 (js2-mode-reset-timer))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10629 (if js2-mode-verbose-parse-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10630 (message "Parse time: %s" time)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10631 ;; finally
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10632 (setq js2-mode-parsing nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10633 (unless interrupted-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10634 (setq js2-mode-parse-timer nil))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10635
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10636 (defun js2-mode-show-node ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10637 "Debugging aid: highlight selected AST node on mouse click."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10638 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10639 (let ((node (js2-node-at-point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10640 beg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10641 end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10642 (when js2-mode-show-overlay
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10643 (if (null node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10644 (message "No node found at location %s" (point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10645 (setq beg (js2-node-abs-pos node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10646 end (+ beg (js2-node-len node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10647 (if js2-mode-node-overlay
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10648 (move-overlay js2-mode-node-overlay beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10649 (setq js2-mode-node-overlay (make-overlay beg end))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10650 (overlay-put js2-mode-node-overlay 'face 'highlight))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10651 (js2-with-unmodifying-text-property-changes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10652 (put-text-property beg end 'point-left #'js2-mode-hide-overlay))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10653 (message "%s, parent: %s"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10654 (js2-node-short-name node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10655 (if (js2-node-parent node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10656 (js2-node-short-name (js2-node-parent node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10657 "nil"))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10658
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10659 (defun js2-mode-hide-overlay (&optional p1 p2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10660 "Remove the debugging overlay when the point moves."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10661 (when js2-mode-node-overlay
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10662 (let ((beg (overlay-start js2-mode-node-overlay))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10663 (end (overlay-end js2-mode-node-overlay)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10664 ;; Sometimes we're called spuriously.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10665 (unless (and p2
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10666 (>= p2 beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10667 (<= p2 end))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10668 (js2-with-unmodifying-text-property-changes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10669 (remove-text-properties beg end '(point-left nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10670 (delete-overlay js2-mode-node-overlay)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10671 (setq js2-mode-node-overlay nil)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10672
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10673 (defun js2-mode-reset ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10674 "Debugging helper; resets everything."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10675 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10676 (js2-mode-exit)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10677 (js2-mode))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10678
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10679 (defsubst js2-mode-show-warn-or-err (e face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10680 "Highlight a warning or error E with FACE.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10681 E is a list of ((MSG-KEY MSG-ARG) BEG END)."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10682 (let* ((key (first e))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10683 (beg (second e))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10684 (end (+ beg (third e)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10685 ;; Don't inadvertently go out of bounds.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10686 (beg (max (point-min) (min beg (point-max))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10687 (end (max (point-min) (min end (point-max))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10688 (js2-highlight-level 3) ; so js2-set-face is sure to fire
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10689 (ovl (make-overlay beg end)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10690 (overlay-put ovl 'face face)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10691 (overlay-put ovl 'js2 t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10692 (put-text-property beg end 'help-echo (js2-get-msg key))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10693 (put-text-property beg end 'point-entered #'js2-echo-error)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10694
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10695 (defun js2-remove-overlays ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10696 "Remove overlays from buffer that have a `js2' property."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10697 (let ((beg (point-min))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10698 (end (point-max)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10699 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10700 (dolist (o (overlays-in beg end))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10701 (when (overlay-get o 'js2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10702 (delete-overlay o))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10703
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10704 (defun js2-mode-fontify-regions ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10705 "Apply fontifications recorded during parsing."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10706 ;; We defer clearing faces as long as possible to eliminate flashing.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10707 (js2-clear-face (point-min) (point-max))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10708 ;; have to reverse the recorded fontifications so that errors and
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10709 ;; warnings overwrite the normal fontifications
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10710 (dolist (f (nreverse js2-mode-fontifications))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10711 (put-text-property (first f) (second f) 'face (third f)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10712 (setq js2-mode-fontifications nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10713 (dolist (p js2-mode-deferred-properties)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10714 (apply #'put-text-property p))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10715 (setq js2-mode-deferred-properties nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10716
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10717 (defun js2-mode-show-errors ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10718 "Highlight syntax errors."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10719 (when js2-mode-show-parse-errors
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10720 (dolist (e (js2-ast-root-errors js2-mode-ast))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10721 (js2-mode-show-warn-or-err e 'js2-error-face))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10722
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10723 (defun js2-mode-remove-suppressed-warnings ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10724 "Take suppressed warnings out of the AST warnings list.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10725 This ensures that the counts and `next-error' are correct."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10726 (setf (js2-ast-root-warnings js2-mode-ast)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10727 (js2-delete-if
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10728 (lambda (e)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10729 (let ((key (caar e)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10730 (or
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10731 (and (not js2-strict-trailing-comma-warning)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10732 (string-match "trailing\\.comma" key))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10733 (and (not js2-strict-cond-assign-warning)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10734 (string= key "msg.equal.as.assign"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10735 (and js2-missing-semi-one-line-override
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10736 (string= key "msg.missing.semi")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10737 (let* ((beg (second e))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10738 (node (js2-node-at-point beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10739 (fn (js2-mode-find-parent-fn node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10740 (body (and fn (js2-function-node-body fn)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10741 (lc (and body (js2-node-abs-pos body)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10742 (rc (and lc (+ lc (js2-node-len body)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10743 (and fn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10744 (or (null body)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10745 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10746 (goto-char beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10747 (and (js2-same-line lc)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10748 (js2-same-line rc))))))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10749 (js2-ast-root-warnings js2-mode-ast))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10750
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10751 (defun js2-mode-show-warnings ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10752 "Highlight strict-mode warnings."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10753 (when js2-mode-show-strict-warnings
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10754 (dolist (e (js2-ast-root-warnings js2-mode-ast))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10755 (js2-mode-show-warn-or-err e 'js2-warning-face))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10756
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10757 (defun js2-echo-error (old-point new-point)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10758 "Called by point-motion hooks."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10759 (let ((msg (get-text-property new-point 'help-echo)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10760 (if msg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10761 (message msg))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10762
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10763 (defalias #'js2-echo-help #'js2-echo-error)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10764
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10765 (defun js2-enter-key ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10766 "Handle user pressing the Enter key."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10767 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10768 (let ((parse-status (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10769 (parse-partial-sexp (point-min) (point)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10770 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10771 ;; check if we're inside a string
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10772 ((nth 3 parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10773 (js2-mode-split-string parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10774 ;; check if inside a block comment
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10775 ((nth 4 parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10776 (js2-mode-extend-comment))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10777 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10778 ;; should probably figure out what the mode-map says we should do
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10779 (if js2-indent-on-enter-key
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10780 (let ((js2-bounce-indent-flag nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10781 (js2-indent-line)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10782 (insert "\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10783 (if js2-enter-indents-newline
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10784 (let ((js2-bounce-indent-flag nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10785 (js2-indent-line)))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10786
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10787 (defun js2-mode-split-string (parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10788 "Turn a newline in mid-string into a string concatenation."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10789 (let* ((col (current-column))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10790 (quote-char (nth 3 parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10791 (quote-string (string quote-char))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10792 (string-beg (nth 8 parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10793 (indent (save-match-data
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10794 (or
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10795 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10796 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10797 (if (looking-at "\\+")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10798 (current-column)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10799 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10800 (goto-char string-beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10801 (if (looking-back "\\+\\s-+")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10802 (goto-char (match-beginning 0)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10803 (current-column))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10804 (insert quote-char "\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10805 (indent-to indent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10806 (insert "+ " quote-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10807 (when (eolp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10808 (insert quote-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10809 (backward-char 1))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10810
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10811 (defun js2-mode-extend-comment ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10812 "When inside a comment block, add comment prefix."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10813 (let (star single col first-line needs-close)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10814 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10815 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10816 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10817 ((looking-at "\\*[^/]")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10818 (setq star t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10819 col (current-column)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10820 ((looking-at "/\\*")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10821 (setq star t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10822 first-line t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10823 col (1+ (current-column))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10824 ((looking-at "//")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10825 (setq single t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10826 col (current-column)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10827 ;; Heuristic for whether we need to close the comment:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10828 ;; if we've got a parse error here, assume it's an unterminated
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10829 ;; comment.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10830 (setq needs-close
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10831 (or
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10832 (eq (get-text-property (1- (point)) 'point-entered)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10833 'js2-echo-error)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10834 ;; The heuristic above doesn't work well when we're
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10835 ;; creating a comment and there's another one downstream,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10836 ;; as our parser thinks this one ends at the end of the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10837 ;; next one. (You can have a /* inside a js block comment.)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10838 ;; So just close it if the next non-ws char isn't a *.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10839 (and first-line
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10840 (eolp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10841 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10842 (skip-syntax-forward " ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10843 (not (eq (char-after) ?*))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10844 (insert "\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10845 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10846 (star
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10847 (indent-to col)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10848 (insert "* ")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10849 (if (and first-line needs-close)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10850 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10851 (insert "\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10852 (indent-to col)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10853 (insert "*/"))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10854 (single
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10855 (when (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10856 (and (zerop (forward-line 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10857 (looking-at "\\s-*//")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10858 (indent-to col)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10859 (insert "// "))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10860
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10861 (defun js2-fill-string (beg quote)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10862 "Line-wrap a single-line string into a multi-line string.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10863 BEG is the string beginning, QUOTE is the quote char."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10864 (let* ((squote (string quote))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10865 (end (if (re-search-forward (concat "[^\\]" squote)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10866 (point-at-eol) t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10867 (1+ (match-beginning 0))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10868 (point-at-eol)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10869 (tag (make-marker))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10870 (fill-column (- fill-column 4))) ; make room
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10871 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10872 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10873 (move-marker tag end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10874 (fill-paragraph nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10875 (goto-char beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10876 (while (not (js2-same-line tag))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10877 (goto-char (point-at-eol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10878 (insert squote)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10879 (when (zerop (forward-line 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10880 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10881 (if (looking-at (concat squote "\\s-*$"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10882 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10883 (setq end (point-at-eol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10884 (forward-line -1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10885 (delete-region (point-at-eol) end))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10886 (insert "+ " squote)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10887 (move-marker tag nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10888
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10889 (defun js2-fill-paragraph (arg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10890 "Fill paragraph after point. Prefix ARG means justify as well.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10891 Has special handling for filling in comments and strings."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10892 (let* ((parse-status (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10893 (parse-partial-sexp (point-min) (point))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10894 (quote-char (or (nth 3 parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10895 (save-match-data
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10896 (if (looking-at "[\"\']")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10897 (char-after))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10898 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10899 (quote-char
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10900 (js2-fill-string (or (nth 8 parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10901 (point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10902 quote-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10903 t) ; or fill-paragraph does evil things afterwards
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10904 ((nth 4 parse-status) ; in block comment?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10905 (js2-fill-comment parse-status arg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10906 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10907 (fill-paragraph arg)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10908
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10909 (defun js2-fill-comment (parse-status arg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10910 "Fill-paragraph in a block comment."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10911 (let* ((beg (nth 8 parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10912 (end (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10913 (goto-char beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10914 (re-search-forward "[^\\]\\*/" nil t)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10915 indent
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10916 end-marker)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10917 (when end
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10918 (setq end-marker (make-marker))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10919 (move-marker end-marker end))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10920 (when (and end js2-mode-squeeze-spaces)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10921 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10922 (save-restriction
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10923 (narrow-to-region beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10924 (goto-char (point-min))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10925 (while (re-search-forward "[ \t][ \t]+" nil t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10926 (replace-match " ")))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10927 ;; `c-fill-paragraph' doesn't indent the continuation stars properly
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10928 ;; if the comment isn't left-justified. They align to the first star
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10929 ;; on the first continuation line after the comment-open, so we make
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10930 ;; sure the first continuation line has the proper indentation.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10931 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10932 (goto-char beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10933 (setq indent (1+ (current-column)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10934 (goto-char (point-at-eol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10935 (skip-chars-forward " \t\r\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10936 (indent-line-to indent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10937
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10938 ;; Invoke `c-fill-paragraph' from the first continuation line,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10939 ;; since it provides better results. Otherwise if you're on the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10940 ;; last line, it doesn't prefix with stars the way you'd expect.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10941 ;; TODO: write our own fill function that works in Emacs 21
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10942 (c-fill-paragraph arg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10943
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10944 ;; last line is typically indented wrong, so fix it
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10945 (when end-marker
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10946 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10947 (goto-char end-marker)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10948 (js2-indent-line)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10949
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10950 (defun js2-beginning-of-line ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10951 "Toggles point between bol and first non-whitespace char in line.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10952 Also moves past comment delimiters when inside comments."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10953 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10954 (let (node beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10955 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10956 ((bolp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10957 (back-to-indentation))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10958 ((looking-at "//")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10959 (skip-chars-forward "/ \t"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10960 ((and (eq (char-after) ?*)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10961 (setq node (js2-comment-at-point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10962 (memq (js2-comment-node-format node) '(jsdoc block))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10963 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10964 (skip-chars-backward " \t")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10965 (bolp)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10966 (skip-chars-forward "\* \t"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10967 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10968 (goto-char (point-at-bol))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10969
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10970 (defun js2-end-of-line ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10971 "Toggles point between eol and last non-whitespace char in line."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10972 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10973 (if (eolp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10974 (skip-chars-backward " \t")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10975 (goto-char (point-at-eol))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10976
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10977 (defun js2-enter-mirror-mode()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10978 "Turns on mirror mode, where quotes, brackets etc are mirrored automatically
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10979 on insertion."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10980 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10981 (define-key js2-mode-map (read-kbd-macro "{") 'js2-mode-match-curly)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10982 (define-key js2-mode-map (read-kbd-macro "}") 'js2-mode-magic-close-paren)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10983 (define-key js2-mode-map (read-kbd-macro "\"") 'js2-mode-match-double-quote)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10984 (define-key js2-mode-map (read-kbd-macro "'") 'js2-mode-match-single-quote)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10985 (define-key js2-mode-map (read-kbd-macro "(") 'js2-mode-match-paren)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10986 (define-key js2-mode-map (read-kbd-macro ")") 'js2-mode-magic-close-paren)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10987 (define-key js2-mode-map (read-kbd-macro "[") 'js2-mode-match-bracket)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10988 (define-key js2-mode-map (read-kbd-macro "]") 'js2-mode-magic-close-paren))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10989
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10990 (defun js2-leave-mirror-mode()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10991 "Turns off mirror mode."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10992 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10993 (dolist (key '("{" "\"" "'" "(" ")" "[" "]"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10994 (define-key js2-mode-map (read-kbd-macro key) 'self-insert-command)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10995
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10996 (defsubst js2-mode-inside-string ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10997 "Return non-nil if inside a string.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10998 Actually returns the quote character that begins the string."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10999 (let ((parse-state (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11000 (parse-partial-sexp (point-min) (point)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11001 (nth 3 parse-state)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11002
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11003 (defsubst js2-mode-inside-comment-or-string ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11004 "Return non-nil if inside a comment or string."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11005 (or
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11006 (let ((comment-start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11007 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11008 (goto-char (point-at-bol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11009 (if (re-search-forward "//" (point-at-eol) t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11010 (match-beginning 0)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11011 (and comment-start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11012 (<= comment-start (point))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11013 (let ((parse-state (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11014 (parse-partial-sexp (point-min) (point)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11015 (or (nth 3 parse-state)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11016 (nth 4 parse-state)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11017
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11018 (defun js2-mode-match-curly (arg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11019 "Insert matching curly-brace."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11020 (interactive "p")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11021 (insert "{")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11022 (if current-prefix-arg
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11023 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11024 (insert "}"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11025 (unless (or (not (looking-at "\\s-*$"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11026 (js2-mode-inside-comment-or-string))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11027 (undo-boundary)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11028
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11029 ;; absolutely mystifying bug: when inserting the next "\n",
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11030 ;; the buffer-undo-list is given two new entries: the inserted range,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11031 ;; and the incorrect position of the point. It's recorded incorrectly
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11032 ;; as being before the opening "{", not after it. But it's recorded
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11033 ;; as the correct value if you're debugging `js2-mode-match-curly'
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11034 ;; in edebug. I have no idea why it's doing this, but incrementing
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11035 ;; the inserted position fixes the problem, so that the undo takes us
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11036 ;; back to just after the user-inserted "{".
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11037 (insert "\n")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11038 (ignore-errors
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11039 (incf (cadr buffer-undo-list)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11040
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11041 (js2-indent-line)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11042 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11043 (insert "\n}")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11044 (let ((js2-bounce-indent-flag (js2-code-at-bol-p)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11045 (js2-indent-line))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11046
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11047 (defun js2-mode-match-bracket ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11048 "Insert matching bracket."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11049 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11050 (insert "[")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11051 (unless (or (not (looking-at "\\s-*$"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11052 (js2-mode-inside-comment-or-string))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11053 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11054 (insert "]"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11055 (when js2-auto-indent-flag
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11056 (let ((js2-bounce-indent-flag (js2-code-at-bol-p)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11057 (js2-indent-line)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11058
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11059 (defun js2-mode-match-paren ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11060 "Insert matching paren unless already inserted."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11061 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11062 (insert "(")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11063 (unless (or (not (looking-at "\\s-*$"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11064 (js2-mode-inside-comment-or-string))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11065 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11066 (insert ")"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11067 (when js2-auto-indent-flag
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11068 (let ((js2-bounce-indent-flag (js2-code-at-bol-p)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11069 (js2-indent-line)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11070
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11071 (defsubst js2-match-quote (quote-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11072 (let ((start-quote (js2-mode-inside-string)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11073 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11074 ;; inside a comment - don't do quote-matching, since we can't
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11075 ;; reliably figure out if we're in a string inside the comment
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11076 ((js2-comment-at-point)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11077 (insert quote-string))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11078 ((not start-quote)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11079 ;; not in string => insert matched quotes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11080 (insert quote-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11081 ;; exception: if we're just before a word, don't double it.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11082 (unless (looking-at "[^ \t\r\n]")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11083 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11084 (insert quote-string))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11085 ((looking-at quote-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11086 (if (looking-back "[^\\]\\\\")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11087 (insert quote-string)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11088 (forward-char 1)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11089 ((and js2-mode-escape-quotes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11090 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11091 (save-match-data
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11092 (re-search-forward quote-string (point-at-eol) t))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11093 ;; inside terminated string, escape quote (unless already escaped)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11094 (insert (if (looking-back "[^\\]\\\\")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11095 quote-string
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11096 (concat "\\" quote-string))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11097 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11098 (insert quote-string))))) ; else terminate the string
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11099
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11100 (defun js2-mode-match-single-quote ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11101 "Insert matching single-quote."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11102 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11103 (let ((parse-status (parse-partial-sexp (point-min) (point))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11104 ;; don't match inside comments, since apostrophe is more common
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11105 (if (nth 4 parse-status)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11106 (insert "'")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11107 (js2-match-quote "'"))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11108
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11109 (defun js2-mode-match-double-quote ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11110 "Insert matching double-quote."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11111 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11112 (js2-match-quote "\""))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11113
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11114 (defun js2-mode-magic-close-paren ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11115 "Skip over close-paren rather than inserting, where appropriate.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11116 Uses some heuristics to try to figure out the right thing to do."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11117 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11118 (let* ((parse-status (parse-partial-sexp (point-min) (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11119 (open-pos (nth 1 parse-status))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11120 (close last-input-char)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11121 (open (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11122 ((eq close 41) ; close-paren
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11123 40) ; open-paren
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11124 ((eq close 93) ; close-bracket
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11125 91) ; open-bracket
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11126 ((eq close ?})
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11127 ?{)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11128 (t nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11129 (if (and (looking-at (string close))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11130 (eq open (char-after open-pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11131 (js2-same-line open-pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11132 (forward-char 1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11133 (insert (string close)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11134 (blink-matching-open)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11135
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11136 (defun js2-mode-wait-for-parse (callback)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11137 "Invoke CALLBACK when parsing is finished.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11138 If parsing is already finished, calls CALLBACK immediately."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11139 (if (not js2-mode-buffer-dirty-p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11140 (funcall callback)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11141 (push callback js2-mode-pending-parse-callbacks)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11142 (add-hook 'js2-parse-finished-hook #'js2-mode-parse-finished)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11143
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11144 (defun js2-mode-parse-finished ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11145 "Invoke callbacks in `js2-mode-pending-parse-callbacks'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11146 ;; We can't let errors propagate up, since it prevents the
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11147 ;; `js2-parse' method from completing normally and returning
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11148 ;; the ast, which makes things mysteriously not work right.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11149 (unwind-protect
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11150 (dolist (cb js2-mode-pending-parse-callbacks)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11151 (condition-case err
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11152 (funcall cb)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11153 (error (message "%s" err))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11154 (setq js2-mode-pending-parse-callbacks nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11155
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11156 (defun js2-mode-flag-region (from to flag)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11157 "Hide or show text from FROM to TO, according to FLAG.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11158 If FLAG is nil then text is shown, while if FLAG is t the text is hidden.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11159 Returns the created overlay if FLAG is non-nil."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11160 (remove-overlays from to 'invisible 'js2-outline)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11161 (when flag
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11162 (let ((o (make-overlay from to)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11163 (overlay-put o 'invisible 'js2-outline)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11164 (overlay-put o 'isearch-open-invisible
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11165 'js2-isearch-open-invisible)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11166 o)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11167
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11168 ;; Function to be set as an outline-isearch-open-invisible' property
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11169 ;; to the overlay that makes the outline invisible (see
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11170 ;; `js2-mode-flag-region').
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11171 (defun js2-isearch-open-invisible (overlay)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11172 ;; We rely on the fact that isearch places point on the matched text.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11173 (js2-mode-show-element))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11174
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11175 (defun js2-mode-invisible-overlay-bounds (&optional pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11176 "Return cons cell of bounds of folding overlay at POS.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11177 Returns nil if not found."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11178 (let ((overlays (overlays-at (or pos (point))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11179 o)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11180 (while (and overlays
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11181 (not o))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11182 (if (overlay-get (car overlays) 'invisible)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11183 (setq o (car overlays))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11184 (setq overlays (cdr overlays))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11185 (if o
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11186 (cons (overlay-start o) (overlay-end o)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11187
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11188 (defun js2-mode-function-at-point (&optional pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11189 "Return the innermost function node enclosing current point.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11190 Returns nil if point is not in a function."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11191 (let ((node (js2-node-at-point pos)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11192 (while (and node (not (js2-function-node-p node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11193 (setq node (js2-node-parent node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11194 (if (js2-function-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11195 node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11196
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11197 (defun js2-mode-toggle-element ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11198 "Hide or show the foldable element at the point."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11199 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11200 (let (comment fn pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11201 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11202 (save-match-data
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11203 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11204 ;; /* ... */ comment?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11205 ((js2-block-comment-p (setq comment (js2-comment-at-point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11206 (if (js2-mode-invisible-overlay-bounds
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11207 (setq pos (+ 3 (js2-node-abs-pos comment))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11208 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11209 (goto-char pos)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11210 (js2-mode-show-element))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11211 (js2-mode-hide-element)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11212
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11213 ;; //-comment?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11214 ((save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11215 (back-to-indentation)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11216 (looking-at js2-mode-//-comment-re))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11217 (js2-mode-toggle-//-comment))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11218
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11219 ;; function?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11220 ((setq fn (js2-mode-function-at-point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11221 (setq pos (and (js2-function-node-body fn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11222 (js2-node-abs-pos (js2-function-node-body fn))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11223 (goto-char (1+ pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11224 (if (js2-mode-invisible-overlay-bounds)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11225 (js2-mode-show-element)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11226 (js2-mode-hide-element)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11227 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11228 (message "Nothing at point to hide or show")))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11229
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11230 (defun js2-mode-hide-element ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11231 "Fold/hide contents of a block, showing ellipses.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11232 Show the hidden text with \\[js2-mode-show-element]."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11233 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11234 (if js2-mode-buffer-dirty-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11235 (js2-mode-wait-for-parse #'js2-mode-hide-element))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11236 (let (node body beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11237 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11238 ((js2-mode-invisible-overlay-bounds)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11239 (message "already hidden"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11240 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11241 (setq node (js2-node-at-point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11242 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11243 ((js2-block-comment-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11244 (js2-mode-hide-comment node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11245 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11246 (while (and node (not (js2-function-node-p node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11247 (setq node (js2-node-parent node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11248 (if (and node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11249 (setq body (js2-function-node-body node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11250 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11251 (setq beg (js2-node-abs-pos body)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11252 end (+ beg (js2-node-len body)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11253 (js2-mode-flag-region (1+ beg) (1- end) 'hide))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11254 (message "No collapsable element found at point"))))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11255
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11256 (defun js2-mode-show-element ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11257 "Show the hidden element at current point."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11258 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11259 (let ((bounds (js2-mode-invisible-overlay-bounds)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11260 (if bounds
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11261 (js2-mode-flag-region (car bounds) (cdr bounds) nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11262 (message "Nothing to un-hide"))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11263
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11264 (defun js2-mode-show-all ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11265 "Show all of the text in the buffer."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11266 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11267 (js2-mode-flag-region (point-min) (point-max) nil))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11268
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11269 (defun js2-mode-toggle-hide-functions ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11270 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11271 (if js2-mode-functions-hidden
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11272 (js2-mode-show-functions)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11273 (js2-mode-hide-functions)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11274
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11275 (defun js2-mode-hide-functions ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11276 "Hides all non-nested function bodies in the buffer.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11277 Use \\[js2-mode-show-all] to reveal them, or \\[js2-mode-show-element]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11278 to open an individual entry."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11279 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11280 (if js2-mode-buffer-dirty-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11281 (js2-mode-wait-for-parse #'js2-mode-hide-functions))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11282 (if (null js2-mode-ast)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11283 (message "Oops - parsing failed")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11284 (setq js2-mode-functions-hidden t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11285 (js2-visit-ast js2-mode-ast #'js2-mode-function-hider)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11286
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11287 (defun js2-mode-function-hider (n endp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11288 (when (not endp)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11289 (let ((tt (js2-node-type n))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11290 body beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11291 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11292 ((and (= tt js2-FUNCTION)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11293 (setq body (js2-function-node-body n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11294 (setq beg (js2-node-abs-pos body)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11295 end (+ beg (js2-node-len body)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11296 (js2-mode-flag-region (1+ beg) (1- end) 'hide)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11297 nil) ; don't process children of function
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11298 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11299 t))))) ; keep processing other AST nodes
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11300
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11301 (defun js2-mode-show-functions ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11302 "Un-hide any folded function bodies in the buffer."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11303 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11304 (setq js2-mode-functions-hidden nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11305 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11306 (goto-char (point-min))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11307 (while (/= (goto-char (next-overlay-change (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11308 (point-max))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11309 (dolist (o (overlays-at (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11310 (when (and (overlay-get o 'invisible)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11311 (not (overlay-get o 'comment)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11312 (js2-mode-flag-region (overlay-start o) (overlay-end o) nil))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11313
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11314 (defun js2-mode-hide-comment (n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11315 (let* ((head (if (eq (js2-comment-node-format n) 'jsdoc)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11316 3 ; /**
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11317 2)) ; /*
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11318 (beg (+ (js2-node-abs-pos n) head))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11319 (end (- (+ beg (js2-node-len n)) head 2))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11320 (o (js2-mode-flag-region beg end 'hide)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11321 (overlay-put o 'comment t)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11322
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11323 (defun js2-mode-toggle-hide-comments ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11324 "Folds all block comments in the buffer.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11325 Use \\[js2-mode-show-all] to reveal them, or \\[js2-mode-show-element]
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11326 to open an individual entry."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11327 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11328 (if js2-mode-comments-hidden
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11329 (js2-mode-show-comments)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11330 (js2-mode-hide-comments)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11331
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11332 (defun js2-mode-hide-comments ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11333 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11334 (if js2-mode-buffer-dirty-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11335 (js2-mode-wait-for-parse #'js2-mode-hide-comments))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11336 (if (null js2-mode-ast)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11337 (message "Oops - parsing failed")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11338 (setq js2-mode-comments-hidden t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11339 (dolist (n (js2-ast-root-comments js2-mode-ast))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11340 (let ((format (js2-comment-node-format n)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11341 (when (js2-block-comment-p n)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11342 (js2-mode-hide-comment n))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11343 (js2-mode-hide-//-comments)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11344
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11345 (defsubst js2-mode-extend-//-comment (direction)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11346 "Find start or end of a block of similar //-comment lines.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11347 DIRECTION is -1 to look back, 1 to look forward.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11348 INDENT is the indentation level to match.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11349 Returns the end-of-line position of the furthest adjacent
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11350 //-comment line with the same indentation as the current line.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11351 If there is no such matching line, returns current end of line."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11352 (let ((pos (point-at-eol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11353 (indent (current-indentation)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11354 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11355 (save-match-data
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11356 (while (and (zerop (forward-line direction))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11357 (looking-at js2-mode-//-comment-re)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11358 (eq indent (length (match-string 1))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11359 (setq pos (point-at-eol)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11360 pos))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11361
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11362 (defun js2-mode-hide-//-comments ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11363 "Fold adjacent 1-line comments, showing only snippet of first one."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11364 (let (beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11365 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11366 (save-match-data
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11367 (goto-char (point-min))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11368 (while (re-search-forward js2-mode-//-comment-re nil t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11369 (setq beg (point)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11370 end (js2-mode-extend-//-comment 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11371 (unless (eq beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11372 (overlay-put (js2-mode-flag-region beg end 'hide)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11373 'comment t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11374 (goto-char end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11375 (forward-char 1))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11376
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11377 (defun js2-mode-toggle-//-comment ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11378 "Fold or un-fold any multi-line //-comment at point.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11379 Caller should have determined that this line starts with a //-comment."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11380 (let* ((beg (point-at-eol))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11381 (end beg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11382 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11383 (goto-char end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11384 (if (js2-mode-invisible-overlay-bounds)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11385 (js2-mode-show-element)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11386 ;; else hide the comment
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11387 (setq beg (js2-mode-extend-//-comment -1)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11388 end (js2-mode-extend-//-comment 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11389 (unless (eq beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11390 (overlay-put (js2-mode-flag-region beg end 'hide)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11391 'comment t))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11392
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11393 (defun js2-mode-show-comments ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11394 "Un-hide any hidden comments, leaving other hidden elements alone."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11395 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11396 (setq js2-mode-comments-hidden nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11397 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11398 (goto-char (point-min))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11399 (while (/= (goto-char (next-overlay-change (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11400 (point-max))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11401 (dolist (o (overlays-at (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11402 (when (overlay-get o 'comment)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11403 (js2-mode-flag-region (overlay-start o) (overlay-end o) nil))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11404
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11405 (defun js2-mode-display-warnings-and-errors ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11406 "Turn on display of warnings and errors."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11407 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11408 (setq js2-mode-show-parse-errors t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11409 js2-mode-show-strict-warnings t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11410 (js2-reparse 'force))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11411
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11412 (defun js2-mode-hide-warnings-and-errors ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11413 "Turn off display of warnings and errors."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11414 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11415 (setq js2-mode-show-parse-errors nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11416 js2-mode-show-strict-warnings nil)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11417 (js2-reparse 'force))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11418
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11419 (defun js2-mode-toggle-warnings-and-errors ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11420 "Toggle the display of warnings and errors.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11421 Some users don't like having warnings/errors reported while they type."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11422 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11423 (setq js2-mode-show-parse-errors (not js2-mode-show-parse-errors)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11424 js2-mode-show-strict-warnings (not js2-mode-show-strict-warnings))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11425 (if (interactive-p)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11426 (message "warnings and errors %s"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11427 (if js2-mode-show-parse-errors
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11428 "enabled"
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11429 "disabled")))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11430 (js2-reparse 'force))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11431
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11432 (defun js2-mode-customize ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11433 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11434 (customize-group 'js2-mode))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11435
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11436 (defun js2-mode-forward-sexp (&optional arg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11437 "Move forward across one statement or balanced expression.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11438 With ARG, do it that many times. Negative arg -N means
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11439 move backward across N balanced expressions."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11440 (interactive "p")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11441 (setq arg (or arg 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11442 (if js2-mode-buffer-dirty-p
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11443 (js2-mode-wait-for-parse #'js2-mode-forward-sexp))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11444 (let (node end (start (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11445 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11446 ;; backward-sexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11447 ;; could probably make this "better" for some cases:
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11448 ;; - if in statement block (e.g. function body), go to parent
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11449 ;; - infix exprs like (foo in bar) - maybe go to beginning
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11450 ;; of infix expr if in the right-side expression?
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11451 ((and arg (minusp arg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11452 (dotimes (i (- arg))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11453 (js2-backward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11454 (forward-char -1) ; enter the node we backed up to
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11455 (setq node (js2-node-at-point (point) t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11456 (goto-char (if node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11457 (js2-node-abs-pos node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11458 (point-min)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11459 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11460 ;; forward-sexp
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11461 (js2-forward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11462 (dotimes (i arg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11463 (js2-forward-sws)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11464 (setq node (js2-node-at-point (point) t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11465 end (if node (+ (js2-node-abs-pos node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11466 (js2-node-len node))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11467 (goto-char (or end (point-max))))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11468
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11469 (defun js2-next-error (&optional arg reset)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11470 "Move to next parse error.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11471 Typically invoked via \\[next-error].
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11472 ARG is the number of errors, forward or backward, to move.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11473 RESET means start over from the beginning."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11474 (interactive "p")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11475 (if (or (null js2-mode-ast)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11476 (and (null (js2-ast-root-errors js2-mode-ast))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11477 (null (js2-ast-root-warnings js2-mode-ast))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11478 (message "No errors")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11479 (when reset
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11480 (goto-char (point-min)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11481 (let* ((errs (copy-sequence
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11482 (append (js2-ast-root-errors js2-mode-ast)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11483 (js2-ast-root-warnings js2-mode-ast))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11484 (continue t)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11485 (start (point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11486 (count (or arg 1))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11487 (backward (minusp count))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11488 (sorter (if backward '> '<))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11489 (stopper (if backward '< '>))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11490 (count (abs count))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11491 all-errs
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11492 err)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11493 ;; sort by start position
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11494 (setq errs (sort errs (lambda (e1 e2)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11495 (funcall sorter (second e1) (second e2))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11496 all-errs errs)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11497 ;; find nth error with pos > start
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11498 (while (and errs continue)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11499 (when (funcall stopper (cadar errs) start)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11500 (setq err (car errs))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11501 (if (zerop (decf count))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11502 (setq continue nil)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11503 (setq errs (cdr errs)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11504 (if err
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11505 (goto-char (second err))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11506 ;; wrap around to first error
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11507 (goto-char (second (car all-errs)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11508 ;; if we were already on it, echo msg again
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11509 (if (= (point) start)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11510 (js2-echo-error (point) (point)))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11511
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11512 (defun js2-mouse-3 ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11513 "Make right-click move the point to the click location.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11514 This makes right-click context menu operations a bit more intuitive.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11515 The point will not move if the region is active, however, to avoid
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11516 destroying the region selection."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11517 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11518 (when (and js2-move-point-on-right-click
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11519 (not mark-active))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11520 (let ((e last-input-event))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11521 (ignore-errors
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11522 (goto-char (cadadr e))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11523
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11524 (defun js2-mode-create-imenu-index ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11525 "Return an alist for `imenu--index-alist'."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11526 ;; This is built up in `js2-parse-record-imenu' during parsing.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11527 (when js2-mode-ast
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11528 ;; if we have an ast but no recorder, they're requesting a rescan
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11529 (unless js2-imenu-recorder
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11530 (js2-reparse 'force))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11531 (prog1
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11532 (js2-build-imenu-index)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11533 (setq js2-imenu-recorder nil
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11534 js2-imenu-function-map nil))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11535
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11536 (defun js2-mode-find-tag ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11537 "Replacement for `find-tag-default'.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11538 `find-tag-default' returns a ridiculous answer inside comments."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11539 (let (beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11540 (js2-with-underscore-as-word-syntax
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11541 (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11542 (if (and (not (looking-at "[A-Za-z0-9_$]"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11543 (looking-back "[A-Za-z0-9_$]"))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11544 (setq beg (progn (forward-word -1) (point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11545 end (progn (forward-word 1) (point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11546 (setq beg (progn (forward-word 1) (point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11547 end (progn (forward-word -1) (point))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11548 (replace-regexp-in-string
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11549 "[\"']" ""
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11550 (buffer-substring-no-properties beg end))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11551
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11552 (defun js2-mode-forward-sibling ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11553 "Move to the end of the sibling following point in parent.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11554 Returns non-nil if successful, or nil if there was no following sibling."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11555 (let* ((node (js2-node-at-point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11556 (parent (js2-mode-find-enclosing-fn node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11557 sib)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11558 (when (setq sib (js2-node-find-child-after (point) parent))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11559 (goto-char (+ (js2-node-abs-pos sib)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11560 (js2-node-len sib))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11561
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11562 (defun js2-mode-backward-sibling ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11563 "Move to the beginning of the sibling node preceding point in parent.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11564 Parent is defined as the enclosing script or function."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11565 (let* ((node (js2-node-at-point))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11566 (parent (js2-mode-find-enclosing-fn node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11567 sib)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11568 (when (setq sib (js2-node-find-child-before (point) parent))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11569 (goto-char (js2-node-abs-pos sib)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11570
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11571 (defun js2-beginning-of-defun ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11572 "Go to line on which current function starts, and return non-nil.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11573 If we're not in a function, go to beginning of previous script-level element."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11574 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11575 (let ((parent (js2-node-parent-script-or-fn (js2-node-at-point)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11576 pos sib)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11577 (cond
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11578 ((and (js2-function-node-p parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11579 (not (eq (point) (setq pos (js2-node-abs-pos parent)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11580 (goto-char pos))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11581 (t
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11582 (js2-mode-backward-sibling)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11583
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11584 (defun js2-end-of-defun ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11585 "Go to the char after the last position of the current function.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11586 If we're not in a function, skips over the next script-level element."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11587 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11588 (let ((parent (js2-node-parent-script-or-fn (js2-node-at-point))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11589 (if (not (js2-function-node-p parent))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11590 ;; punt: skip over next script-level element beyond point
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11591 (js2-mode-forward-sibling)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11592 (goto-char (+ 1 (+ (js2-node-abs-pos parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11593 (js2-node-len parent)))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11594
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11595 (defun js2-mark-defun (&optional allow-extend)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11596 "Put mark at end of this function, point at beginning.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11597 The function marked is the one that contains point.
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11598
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11599 Interactively, if this command is repeated,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11600 or (in Transient Mark mode) if the mark is active,
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11601 it marks the next defun after the ones already marked."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11602 (interactive "p")
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11603 (let (extended)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11604 (when (and allow-extend
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11605 (or (and (eq last-command this-command) (mark t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11606 (and transient-mark-mode mark-active)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11607 (let ((sib (save-excursion
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11608 (goto-char (mark))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11609 (if (js2-mode-forward-sibling)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11610 (point))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11611 node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11612 (if sib
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11613 (progn
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11614 (set-mark sib)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11615 (setq extended t))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11616 ;; no more siblings - try extending to enclosing node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11617 (goto-char (mark t)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11618 (when (not extended)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11619 (let ((node (js2-node-at-point (point) t)) ; skip comments
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11620 ast fn stmt parent beg end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11621 (when (js2-ast-root-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11622 (setq ast node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11623 node (or (js2-node-find-child-after (point) node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11624 (js2-node-find-child-before (point) node))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11625 ;; only mark whole buffer if we can't find any children
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11626 (if (null node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11627 (setq node ast))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11628 (if (js2-function-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11629 (setq parent node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11630 (setq fn (js2-mode-find-enclosing-fn node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11631 stmt (if (or (null fn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11632 (js2-ast-root-p fn))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11633 (js2-mode-find-first-stmt node))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11634 parent (or stmt fn)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11635 (setq beg (js2-node-abs-pos parent)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11636 end (+ beg (js2-node-len parent)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11637 (push-mark beg)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11638 (goto-char end)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11639 (exchange-point-and-mark)))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11640
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11641 (defun js2-narrow-to-defun ()
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11642 "Narrow to the function enclosing point."
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11643 (interactive)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11644 (let* ((node (js2-node-at-point (point) t)) ; skip comments
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11645 (fn (if (js2-script-node-p node)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11646 node
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11647 (js2-mode-find-enclosing-fn node)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11648 (beg (js2-node-abs-pos fn)))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11649 (unless (js2-ast-root-p fn)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11650 (narrow-to-region beg (+ beg (js2-node-len fn))))))
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11651
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11652 (defalias 'js2r 'js2-mode-reset)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11653
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11654 (provide 'js2-mode)
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11655
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11656 ;;; js2-mode.el ends here
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11657
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11658
614a83a1c5dd Add js2-mode.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11659 ;;; js2.el ends here