annotate lisp/progmodes/js2-mode.el @ 104138:1f05feb52986

*** empty log message ***
author Michael Albinus <michael.albinus@gmx.de>
date Mon, 03 Aug 2009 08:22:04 +0000
parents be3e01fa532e
children da1290c3d63f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
104093
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1 ;;; js2-mode.el --- an improved JavaScript editing mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3 ;; Copyright (C) 2009 Free Software Foundation, Inc.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5 ;; Author: Steve Yegge <steve.yegge@gmail.com>
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6 ;; Version: See `js2-mode-version'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7 ;; Keywords: languages, javascript
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11 ;; GNU Emacs is free software: you can redistribute it and/or modify
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
13 ;; the Free Software Foundation, either version 3 of the License, or
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
14 ;; (at your option) any later version.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
15
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
19 ;; GNU General Public License for more details.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
20
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
22 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
23
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
24 ;;; Commentary:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
25
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
26 ;; This JavaScript editing mode supports:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
27
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
28 ;; - strict recognition of the Ecma-262 language standard
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
29 ;; - support for most Rhino and SpiderMonkey extensions from 1.5 to 1.8
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
30 ;; - parsing support for ECMAScript for XML (E4X, ECMA-357)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
31 ;; - accurate syntax highlighting using a recursive-descent parser
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
32 ;; - on-the-fly reporting of syntax errors and strict-mode warnings
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
33 ;; - undeclared-variable warnings using a configurable externs framework
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
34 ;; - "bouncing" line indentation to choose among alternate indentation points
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
35 ;; - smart line-wrapping within comments and strings
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
36 ;; - code folding:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
37 ;; - show some or all function bodies as {...}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
38 ;; - show some or all block comments as /*...*/
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
39 ;; - context-sensitive menu bar and popup menus
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
40 ;; - code browsing using the `imenu' package
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
41 ;; - typing helpers such as automatic insertion of matching braces/parens
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
42 ;; - many customization options
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
43
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
44 ;; To customize how it works:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
45 ;; M-x customize-group RET js2-mode RET
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
46
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
47 ;; Notes:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
48
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
49 ;; This mode includes a port of Mozilla Rhino's scanner, parser and
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
50 ;; symbol table. Ideally it should stay in sync with Rhino, keeping
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
51 ;; `js2-mode' current as the EcmaScript language standard evolves.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
52
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
53 ;; Unlike cc-engine based language modes, js2-mode's line-indentation is not
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
54 ;; customizable. It is a surprising amount of work to support customizable
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
55 ;; indentation. The current compromise is that the tab key lets you cycle among
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
56 ;; various likely indentation points, similar to the behavior of python-mode.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
57
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
58 ;; This mode does not yet work with "multi-mode" modes such as `mmm-mode'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
59 ;; and `mumamo', although it could be made to do so with some effort.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
60 ;; This means that `js2-mode' is currently only useful for editing JavaScript
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
61 ;; files, and not for editing JavaScript within <script> tags or templates.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
62
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
63 ;;; Code:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
64
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
65 (eval-when-compile
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
66 (require 'cl))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
67
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
68 (require 'imenu)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
69 (require 'cc-cmds) ; for `c-fill-paragraph'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
70
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
71 (eval-and-compile
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
72 (require 'cc-mode) ; (only) for `c-populate-syntax-table'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
73 (require 'cc-langs) ; it's here in Emacs 21...
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
74 (require 'cc-engine)) ; for `c-paragraph-start' et. al.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
75
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
76 ;;; Externs (variables presumed to be defined by the host system)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
77
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
78 (defvar js2-ecma-262-externs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
79 (mapcar 'symbol-name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
80 '(Array Boolean Date Error EvalError Function Infinity
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
81 Math NaN Number Object RangeError ReferenceError RegExp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
82 String SyntaxError TypeError URIError arguments
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
83 decodeURI decodeURIComponent encodeURI
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
84 encodeURIComponent escape eval isFinite isNaN
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
85 parseFloat parseInt undefined unescape))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
86 "Ecma-262 externs. Included in `js2-externs' by default.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
87
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
88 (defvar js2-browser-externs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
89 (mapcar 'symbol-name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
90 '(;; DOM level 1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
91 Attr CDATASection CharacterData Comment DOMException
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
92 DOMImplementation Document DocumentFragment
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
93 DocumentType Element Entity EntityReference
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
94 ExceptionCode NamedNodeMap Node NodeList Notation
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
95 ProcessingInstruction Text
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
96
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
97 ;; DOM level 2
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
98 HTMLAnchorElement HTMLAppletElement HTMLAreaElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
99 HTMLBRElement HTMLBaseElement HTMLBaseFontElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
100 HTMLBodyElement HTMLButtonElement HTMLCollection
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
101 HTMLDListElement HTMLDirectoryElement HTMLDivElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
102 HTMLDocument HTMLElement HTMLFieldSetElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
103 HTMLFontElement HTMLFormElement HTMLFrameElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
104 HTMLFrameSetElement HTMLHRElement HTMLHeadElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
105 HTMLHeadingElement HTMLHtmlElement HTMLIFrameElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
106 HTMLImageElement HTMLInputElement HTMLIsIndexElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
107 HTMLLIElement HTMLLabelElement HTMLLegendElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
108 HTMLLinkElement HTMLMapElement HTMLMenuElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
109 HTMLMetaElement HTMLModElement HTMLOListElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
110 HTMLObjectElement HTMLOptGroupElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
111 HTMLOptionElement HTMLOptionsCollection
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
112 HTMLParagraphElement HTMLParamElement HTMLPreElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
113 HTMLQuoteElement HTMLScriptElement HTMLSelectElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
114 HTMLStyleElement HTMLTableCaptionElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
115 HTMLTableCellElement HTMLTableColElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
116 HTMLTableElement HTMLTableRowElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
117 HTMLTableSectionElement HTMLTextAreaElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
118 HTMLTitleElement HTMLUListElement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
119
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
120 ;; DOM level 3
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
121 DOMConfiguration DOMError DOMException
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
122 DOMImplementationList DOMImplementationSource
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
123 DOMLocator DOMStringList NameList TypeInfo
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
124 UserDataHandler
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
125
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
126 ;; Window
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
127 alert confirm document java navigator prompt screen
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
128 self top
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
129
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
130 ;; W3C CSS
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
131 CSSCharsetRule CSSFontFace CSSFontFaceRule
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
132 CSSImportRule CSSMediaRule CSSPageRule
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
133 CSSPrimitiveValue CSSProperties CSSRule CSSRuleList
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
134 CSSStyleDeclaration CSSStyleRule CSSStyleSheet
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
135 CSSValue CSSValueList Counter DOMImplementationCSS
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
136 DocumentCSS DocumentStyle ElementCSSInlineStyle
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
137 LinkStyle MediaList RGBColor Rect StyleSheet
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
138 StyleSheetList ViewCSS
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
139
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
140 ;; W3C Event
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
141 EventListener EventTarget Event DocumentEvent UIEvent
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
142 MouseEvent MutationEvent KeyboardEvent
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
143
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
144 ;; W3C Range
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
145 DocumentRange Range RangeException
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
146
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
147 ;; W3C XML
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
148 XPathResult XMLHttpRequest))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
149 "Browser externs.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
150 You can cause these to be included or excluded with the custom
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
151 variable `js2-include-browser-externs'.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
152
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
153 (defvar js2-rhino-externs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
154 (mapcar 'symbol-name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
155 '(Packages importClass importPackage com org java
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
156 ;; Global object (shell) externs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
157 defineClass deserialize doctest gc help load
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
158 loadClass print quit readFile readUrl runCommand seal
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
159 serialize spawn sync toint32 version))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
160 "Mozilla Rhino externs.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
161 Set `js2-include-rhino-externs' to t to include them.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
162
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
163 (defvar js2-gears-externs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
164 (mapcar 'symbol-name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
165 '(
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
166 ;; TODO(stevey): add these
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
167 ))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
168 "Google Gears externs.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
169 Set `js2-include-gears-externs' to t to include them.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
170
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
171 ;;; Variables
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
172
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
173 (defvar js2-emacs22 (>= emacs-major-version 22))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
174
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
175 (defcustom js2-highlight-level 2
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
176 "Amount of syntax highlighting to perform.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
177 nil, zero or negative means none.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
178 1 adds basic syntax highlighting.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
179 2 adds highlighting of some Ecma built-in properties.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
180 3 adds highlighting of many Ecma built-in functions."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
181 :group 'js2-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
182 :type '(choice (const :tag "None" nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
183 (const :tag "Basic" 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
184 (const :tag "Include Properties" 2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
185 (const :tag "Include Functions" 3)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
186
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
187 (defvar js2-mode-dev-mode-p nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
188 "Non-nil if running in development mode. Normally nil.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
189
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
190 (defgroup js2-mode nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
191 "An improved JavaScript mode."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
192 :group 'languages)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
193
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
194 (defcustom js2-basic-offset (if (and (boundp 'c-basic-offset)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
195 (numberp c-basic-offset))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
196 c-basic-offset
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
197 4)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
198 "Number of spaces to indent nested statements.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
199 Similar to `c-basic-offset'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
200 :group 'js2-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
201 :type 'integer)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
202 (make-variable-buffer-local 'js2-basic-offset)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
203
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
204 (defcustom js2-mirror-mode t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
205 "Non-nil to insert closing brackets, parens, etc. automatically."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
206 :group 'js2-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
207 :type 'boolean)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
208
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
209 (defcustom js2-auto-indent-p nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
210 "Automatic indentation with punctuation characters.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
211 If non-nil, the current line is indented when certain punctuations
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
212 are inserted."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
213 :group 'js2-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
214 :type 'boolean)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
215
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
216 (defcustom js2-bounce-indent-p nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
217 "Non-nil to have indent-line function choose among alternatives.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
218 If nil, the indent-line function will indent to a predetermined column
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
219 based on heuristic guessing. If non-nil, then if the current line is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
220 already indented to that predetermined column, indenting will choose
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
221 another likely column and indent to that spot. Repeated invocation of
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
222 the indent-line function will cycle among the computed alternatives.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
223 See the function `js2-bounce-indent' for details."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
224 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
225 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
226
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
227 (defcustom js2-indent-on-enter-key nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
228 "Non-nil to have Enter/Return key indent the line.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
229 This is unusual for Emacs modes but common in IDEs like Eclipse."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
230 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
231 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
232
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
233 (defcustom js2-enter-indents-newline nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
234 "Non-nil to have Enter/Return key indent the newly-inserted line.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
235 This is unusual for Emacs modes but common in IDEs like Eclipse."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
236 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
237 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
238
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
239 (defcustom js2-rebind-eol-bol-keys t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
240 "Non-nil to rebind `beginning-of-line' and `end-of-line' keys.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
241 If non-nil, bounce between bol/eol and first/last non-whitespace char."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
242 :group 'js2-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
243 :type 'boolean)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
244
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
245 (defcustom js2-electric-keys '("{" "}" "(" ")" "[" "]" ":" ";" "," "*")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
246 "Keys that auto-indent when `js2-auto-indent-p' is non-nil.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
247 Each value in the list is passed to `define-key'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
248 :type 'list
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
249 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
250
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
251 (defcustom js2-idle-timer-delay 0.2
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
252 "Delay in secs before re-parsing after user makes changes.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
253 Multiplied by `js2-dynamic-idle-timer-adjust', which see."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
254 :type 'number
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
255 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
256 (make-variable-buffer-local 'js2-idle-timer-delay)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
257
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
258 (defcustom js2-dynamic-idle-timer-adjust 0
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
259 "Positive to adjust `js2-idle-timer-delay' based on file size.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
260 The idea is that for short files, parsing is faster so we can be
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
261 more responsive to user edits without interfering with editing.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
262 The buffer length in characters (typically bytes) is divided by
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
263 this value and used to multiply `js2-idle-timer-delay' for the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
264 buffer. For example, a 21k file and 10k adjust yields 21k/10k
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
265 == 2, so js2-idle-timer-delay is multiplied by 2.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
266 If `js2-dynamic-idle-timer-adjust' is 0 or negative,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
267 `js2-idle-timer-delay' is not dependent on the file size."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
268 :type 'number
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
269 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
270
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
271 (defcustom js2-mode-escape-quotes t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
272 "Non-nil to disable automatic quote-escaping inside strings."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
273 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
274 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
275
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
276 (defcustom js2-mode-squeeze-spaces t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
277 "Non-nil to normalize whitespace when filling in comments.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
278 Multiple runs of spaces are converted to a single space."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
279 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
280 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
281
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
282 (defcustom js2-mode-show-parse-errors t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
283 "True to highlight parse errors."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
284 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
285 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
286
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
287 (defcustom js2-mode-show-strict-warnings t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
288 "Non-nil to emit Ecma strict-mode warnings.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
289 Some of the warnings can be individually disabled by other flags,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
290 even if this flag is non-nil."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
291 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
292 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
293
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
294 (defcustom js2-strict-trailing-comma-warning t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
295 "Non-nil to warn about trailing commas in array literals.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
296 Ecma-262 forbids them, but many browsers permit them. IE is the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
297 big exception, and can produce bugs if you have trailing commas."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
298 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
299 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
300
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
301 (defcustom js2-strict-missing-semi-warning t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
302 "Non-nil to warn about semicolon auto-insertion after statement.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
303 Technically this is legal per Ecma-262, but some style guides disallow
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
304 depending on it."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
305 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
306 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
307
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
308 (defcustom js2-missing-semi-one-line-override nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
309 "Non-nil to permit missing semicolons in one-line functions.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
310 In one-liner functions such as `function identity(x) {return x}'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
311 people often omit the semicolon for a cleaner look. If you are
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
312 such a person, you can suppress the missing-semicolon warning
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
313 by setting this variable to t."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
314 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
315 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
316
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
317 (defcustom js2-strict-inconsistent-return-warning t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
318 "Non-nil to warn about mixing returns with value-returns.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
319 It's perfectly legal to have a `return' and a `return foo' in the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
320 same function, but it's often an indicator of a bug, and it also
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
321 interferes with type inference (in systems that support it.)"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
322 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
323 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
324
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
325 (defcustom js2-strict-cond-assign-warning t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
326 "Non-nil to warn about expressions like if (a = b).
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
327 This often should have been '==' instead of '='. If the warning
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
328 is enabled, you can suppress it on a per-expression basis by
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
329 parenthesizing the expression, e.g. if ((a = b)) ..."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
330 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
331 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
332
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
333 (defcustom js2-strict-cond-assign-warning t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
334 "Non-nil to warn about expressions like if (a = b).
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
335 This often should have been '==' instead of '='. If the warning
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
336 is enabled, you can suppress it on a per-expression basis by
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
337 parenthesizing the expression, e.g. if ((a = b)) ..."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
338 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
339 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
340
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
341 (defcustom js2-strict-var-redeclaration-warning t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
342 "Non-nil to warn about redeclaring variables in a script or function."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
343 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
344 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
345
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
346 (defcustom js2-strict-var-hides-function-arg-warning t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
347 "Non-nil to warn about a var decl hiding a function argument."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
348 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
349 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
350
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
351 (defcustom js2-skip-preprocessor-directives nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
352 "Non-nil to treat lines beginning with # as comments.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
353 Useful for viewing Mozilla JavaScript source code."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
354 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
355 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
356
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
357 (defcustom js2-language-version 180
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
358 "Configures what JavaScript language version to recognize.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
359 Currently versions 150, 160, 170 and 180 are supported, corresponding
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
360 to JavaScript 1.5, 1.6, 1.7 and 1.8, respectively. In a nutshell,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
361 1.6 adds E4X support, 1.7 adds let, yield, and Array comprehensions,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
362 and 1.8 adds function closures."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
363 :type 'integer
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
364 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
365
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
366 (defcustom js2-allow-keywords-as-property-names t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
367 "If non-nil, you can use JavaScript keywords as object property names.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
368 Examples:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
369
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
370 var foo = {int: 5, while: 6, continue: 7};
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
371 foo.return = 8;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
372
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
373 Ecma-262 forbids this syntax, but many browsers support it."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
374 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
375 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
376
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
377 (defcustom js2-instanceof-has-side-effects nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
378 "If non-nil, treats the instanceof operator as having side effects.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
379 This is useful for xulrunner apps."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
380 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
381 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
382
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
383 (defcustom js2-cleanup-whitespace nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
384 "Non-nil to invoke `delete-trailing-whitespace' before saves."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
385 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
386 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
387
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
388 (defcustom js2-move-point-on-right-click t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
389 "Non-nil to move insertion point when you right-click.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
390 This makes right-click context menu behavior a bit more intuitive,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
391 since menu operations generally apply to the point. The exception
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
392 is if there is a region selection, in which case the point does -not-
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
393 move, so cut/copy/paste etc. can work properly.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
394
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
395 Note that IntelliJ moves the point, and Eclipse leaves it alone,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
396 so this behavior is customizable."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
397 :group 'js2-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
398 :type 'boolean)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
399
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
400 (defcustom js2-allow-rhino-new-expr-initializer t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
401 "Non-nil to support a Rhino's experimental syntactic construct.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
402
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
403 Rhino supports the ability to follow a `new' expression with an object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
404 literal, which is used to set additional properties on the new object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
405 after calling its constructor. Syntax:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
406
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
407 new <expr> [ ( arglist ) ] [initializer]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
408
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
409 Hence, this expression:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
410
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
411 new Object {a: 1, b: 2}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
412
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
413 results in an Object with properties a=1 and b=2. This syntax is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
414 apparently not configurable in Rhino - it's currently always enabled,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
415 as of Rhino version 1.7R2."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
416 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
417 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
418
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
419 (defcustom js2-allow-member-expr-as-function-name nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
420 "Non-nil to support experimental Rhino syntax for function names.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
421
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
422 Rhino supports an experimental syntax configured via the Rhino Context
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
423 setting `allowMemberExprAsFunctionName'. The experimental syntax is:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
424
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
425 function <member-expr> ( [ arg-list ] ) { <body> }
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
426
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
427 Where member-expr is a non-parenthesized 'member expression', which
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
428 is anything at the grammar level of a new-expression or lower, meaning
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
429 any expression that does not involve infix or unary operators.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
430
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
431 When <member-expr> is not a simple identifier, then it is syntactic
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
432 sugar for assigning the anonymous function to the <member-expr>. Hence,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
433 this code:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
434
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
435 function a.b().c[2] (x, y) { ... }
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
436
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
437 is rewritten as:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
438
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
439 a.b().c[2] = function(x, y) {...}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
440
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
441 which doesn't seem particularly useful, but Rhino permits it."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
442 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
443 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
444
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
445 (defvar js2-mode-version 20090727
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
446 "Release number for `js2-mode'.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
447
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
448 ;; scanner variables
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
449
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
450 (defmacro js2-deflocal (name value &optional comment)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
451 "Define a buffer-local variable NAME with VALUE and COMMENT."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
452 `(progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
453 (defvar ,name ,value ,comment)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
454 (make-variable-buffer-local ',name)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
455
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
456 ;; We record the start and end position of each token.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
457 (js2-deflocal js2-token-beg 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
458 (js2-deflocal js2-token-end -1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
459
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
460 (defvar js2-EOF_CHAR -1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
461 "Represents end of stream. Distinct from js2-EOF token type.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
462
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
463 ;; I originally used symbols to represent tokens, but Rhino uses
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
464 ;; ints and then sets various flag bits in them, so ints it is.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
465 ;; The upshot is that we need a `js2-' prefix in front of each name.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
466 (defvar js2-ERROR -1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
467 (defvar js2-EOF 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
468 (defvar js2-EOL 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
469 (defvar js2-ENTERWITH 2) ; begin interpreter bytecodes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
470 (defvar js2-LEAVEWITH 3)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
471 (defvar js2-RETURN 4)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
472 (defvar js2-GOTO 5)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
473 (defvar js2-IFEQ 6)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
474 (defvar js2-IFNE 7)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
475 (defvar js2-SETNAME 8)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
476 (defvar js2-BITOR 9)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
477 (defvar js2-BITXOR 10)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
478 (defvar js2-BITAND 11)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
479 (defvar js2-EQ 12)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
480 (defvar js2-NE 13)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
481 (defvar js2-LT 14)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
482 (defvar js2-LE 15)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
483 (defvar js2-GT 16)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
484 (defvar js2-GE 17)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
485 (defvar js2-LSH 18)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
486 (defvar js2-RSH 19)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
487 (defvar js2-URSH 20)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
488 (defvar js2-ADD 21) ; infix plus
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
489 (defvar js2-SUB 22) ; infix minus
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
490 (defvar js2-MUL 23)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
491 (defvar js2-DIV 24)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
492 (defvar js2-MOD 25)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
493 (defvar js2-NOT 26)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
494 (defvar js2-BITNOT 27)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
495 (defvar js2-POS 28) ; unary plus
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
496 (defvar js2-NEG 29) ; unary minus
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
497 (defvar js2-NEW 30)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
498 (defvar js2-DELPROP 31)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
499 (defvar js2-TYPEOF 32)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
500 (defvar js2-GETPROP 33)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
501 (defvar js2-GETPROPNOWARN 34)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
502 (defvar js2-SETPROP 35)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
503 (defvar js2-GETELEM 36)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
504 (defvar js2-SETELEM 37)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
505 (defvar js2-CALL 38)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
506 (defvar js2-NAME 39) ; an identifier
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
507 (defvar js2-NUMBER 40)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
508 (defvar js2-STRING 41)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
509 (defvar js2-NULL 42)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
510 (defvar js2-THIS 43)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
511 (defvar js2-FALSE 44)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
512 (defvar js2-TRUE 45)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
513 (defvar js2-SHEQ 46) ; shallow equality (===)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
514 (defvar js2-SHNE 47) ; shallow inequality (!==)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
515 (defvar js2-REGEXP 48)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
516 (defvar js2-BINDNAME 49)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
517 (defvar js2-THROW 50)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
518 (defvar js2-RETHROW 51) ; rethrow caught exception: catch (e if ) uses it
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
519 (defvar js2-IN 52)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
520 (defvar js2-INSTANCEOF 53)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
521 (defvar js2-LOCAL_LOAD 54)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
522 (defvar js2-GETVAR 55)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
523 (defvar js2-SETVAR 56)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
524 (defvar js2-CATCH_SCOPE 57)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
525 (defvar js2-ENUM_INIT_KEYS 58)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
526 (defvar js2-ENUM_INIT_VALUES 59)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
527 (defvar js2-ENUM_INIT_ARRAY 60)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
528 (defvar js2-ENUM_NEXT 61)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
529 (defvar js2-ENUM_ID 62)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
530 (defvar js2-THISFN 63)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
531 (defvar js2-RETURN_RESULT 64) ; to return previously stored return result
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
532 (defvar js2-ARRAYLIT 65) ; array literal
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
533 (defvar js2-OBJECTLIT 66) ; object literal
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
534 (defvar js2-GET_REF 67) ; *reference
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
535 (defvar js2-SET_REF 68) ; *reference = something
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
536 (defvar js2-DEL_REF 69) ; delete reference
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
537 (defvar js2-REF_CALL 70) ; f(args) = something or f(args)++
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
538 (defvar js2-REF_SPECIAL 71) ; reference for special properties like __proto
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
539 (defvar js2-YIELD 72) ; JS 1.7 yield pseudo keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
540
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
541 ;; XML support
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
542 (defvar js2-DEFAULTNAMESPACE 73)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
543 (defvar js2-ESCXMLATTR 74)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
544 (defvar js2-ESCXMLTEXT 75)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
545 (defvar js2-REF_MEMBER 76) ; Reference for x.@y, x..y etc.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
546 (defvar js2-REF_NS_MEMBER 77) ; Reference for x.ns::y, x..ns::y etc.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
547 (defvar js2-REF_NAME 78) ; Reference for @y, @[y] etc.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
548 (defvar js2-REF_NS_NAME 79) ; Reference for ns::y, @ns::y@[y] etc.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
549
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
550 (defvar js2-first-bytecode js2-ENTERWITH)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
551 (defvar js2-last-bytecode js2-REF_NS_NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
552
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
553 (defvar js2-TRY 80)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
554 (defvar js2-SEMI 81) ; semicolon
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
555 (defvar js2-LB 82) ; left and right brackets
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
556 (defvar js2-RB 83)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
557 (defvar js2-LC 84) ; left and right curly-braces
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
558 (defvar js2-RC 85)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
559 (defvar js2-LP 86) ; left and right parens
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
560 (defvar js2-RP 87)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
561 (defvar js2-COMMA 88) ; comma operator
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
562
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
563 (defvar js2-ASSIGN 89) ; simple assignment (=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
564 (defvar js2-ASSIGN_BITOR 90) ; |=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
565 (defvar js2-ASSIGN_BITXOR 91) ; ^=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
566 (defvar js2-ASSIGN_BITAND 92) ; &=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
567 (defvar js2-ASSIGN_LSH 93) ; <<=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
568 (defvar js2-ASSIGN_RSH 94) ; >>=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
569 (defvar js2-ASSIGN_URSH 95) ; >>>=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
570 (defvar js2-ASSIGN_ADD 96) ; +=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
571 (defvar js2-ASSIGN_SUB 97) ; -=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
572 (defvar js2-ASSIGN_MUL 98) ; *=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
573 (defvar js2-ASSIGN_DIV 99) ; /=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
574 (defvar js2-ASSIGN_MOD 100) ; %=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
575
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
576 (defvar js2-first-assign js2-ASSIGN)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
577 (defvar js2-last-assign js2-ASSIGN_MOD)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
578
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
579 (defvar js2-HOOK 101) ; conditional (?:)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
580 (defvar js2-COLON 102)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
581 (defvar js2-OR 103) ; logical or (||)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
582 (defvar js2-AND 104) ; logical and (&&)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
583 (defvar js2-INC 105) ; increment/decrement (++ --)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
584 (defvar js2-DEC 106)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
585 (defvar js2-DOT 107) ; member operator (.)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
586 (defvar js2-FUNCTION 108) ; function keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
587 (defvar js2-EXPORT 109) ; export keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
588 (defvar js2-IMPORT 110) ; import keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
589 (defvar js2-IF 111) ; if keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
590 (defvar js2-ELSE 112) ; else keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
591 (defvar js2-SWITCH 113) ; switch keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
592 (defvar js2-CASE 114) ; case keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
593 (defvar js2-DEFAULT 115) ; default keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
594 (defvar js2-WHILE 116) ; while keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
595 (defvar js2-DO 117) ; do keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
596 (defvar js2-FOR 118) ; for keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
597 (defvar js2-BREAK 119) ; break keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
598 (defvar js2-CONTINUE 120) ; continue keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
599 (defvar js2-VAR 121) ; var keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
600 (defvar js2-WITH 122) ; with keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
601 (defvar js2-CATCH 123) ; catch keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
602 (defvar js2-FINALLY 124) ; finally keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
603 (defvar js2-VOID 125) ; void keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
604 (defvar js2-RESERVED 126) ; reserved keywords
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
605
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
606 (defvar js2-EMPTY 127)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
607
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
608 ;; Types used for the parse tree - never returned by scanner.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
609
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
610 (defvar js2-BLOCK 128) ; statement block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
611 (defvar js2-LABEL 129) ; label
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
612 (defvar js2-TARGET 130)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
613 (defvar js2-LOOP 131)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
614 (defvar js2-EXPR_VOID 132) ; expression statement in functions
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
615 (defvar js2-EXPR_RESULT 133) ; expression statement in scripts
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
616 (defvar js2-JSR 134)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
617 (defvar js2-SCRIPT 135) ; top-level node for entire script
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
618 (defvar js2-TYPEOFNAME 136) ; for typeof(simple-name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
619 (defvar js2-USE_STACK 137)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
620 (defvar js2-SETPROP_OP 138) ; x.y op= something
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
621 (defvar js2-SETELEM_OP 139) ; x[y] op= something
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
622 (defvar js2-LOCAL_BLOCK 140)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
623 (defvar js2-SET_REF_OP 141) ; *reference op= something
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
624
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
625 ;; For XML support:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
626 (defvar js2-DOTDOT 142) ; member operator (..)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
627 (defvar js2-COLONCOLON 143) ; namespace::name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
628 (defvar js2-XML 144) ; XML type
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
629 (defvar js2-DOTQUERY 145) ; .() -- e.g., x.emps.emp.(name == "terry")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
630 (defvar js2-XMLATTR 146) ; @
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
631 (defvar js2-XMLEND 147)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
632
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
633 ;; Optimizer-only tokens
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
634 (defvar js2-TO_OBJECT 148)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
635 (defvar js2-TO_DOUBLE 149)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
636
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
637 (defvar js2-GET 150) ; JS 1.5 get pseudo keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
638 (defvar js2-SET 151) ; JS 1.5 set pseudo keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
639 (defvar js2-LET 152) ; JS 1.7 let pseudo keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
640 (defvar js2-CONST 153)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
641 (defvar js2-SETCONST 154)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
642 (defvar js2-SETCONSTVAR 155)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
643 (defvar js2-ARRAYCOMP 156)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
644 (defvar js2-LETEXPR 157)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
645 (defvar js2-WITHEXPR 158)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
646 (defvar js2-DEBUGGER 159)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
647
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
648 (defvar js2-COMMENT 160)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
649 (defvar js2-ENUM 161) ; for "enum" reserved word
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
650
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
651 (defconst js2-num-tokens (1+ js2-ENUM))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
652
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
653 (defconst js2-debug-print-trees nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
654
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
655 ;; Rhino accepts any string or stream as input. Emacs character
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
656 ;; processing works best in buffers, so we'll assume the input is a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
657 ;; buffer. JavaScript strings can be copied into temp buffers before
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
658 ;; scanning them.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
659
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
660 ;; Buffer-local variables yield much cleaner code than using `defstruct'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
661 ;; They're the Emacs equivalent of instance variables, more or less.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
662
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
663 (js2-deflocal js2-ts-dirty-line nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
664 "Token stream buffer-local variable.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
665 Indicates stuff other than whitespace since start of line.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
666
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
667 (js2-deflocal js2-ts-regexp-flags nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
668 "Token stream buffer-local variable.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
669
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
670 (js2-deflocal js2-ts-string ""
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
671 "Token stream buffer-local variable.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
672 Last string scanned.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
673
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
674 (js2-deflocal js2-ts-number nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
675 "Token stream buffer-local variable.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
676 Last literal number scanned.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
677
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
678 (js2-deflocal js2-ts-hit-eof nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
679 "Token stream buffer-local variable.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
680
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
681 (js2-deflocal js2-ts-line-start 0
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
682 "Token stream buffer-local variable.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
683
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
684 (js2-deflocal js2-ts-lineno 1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
685 "Token stream buffer-local variable.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
686
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
687 (js2-deflocal js2-ts-line-end-char -1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
688 "Token stream buffer-local variable.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
689
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
690 (js2-deflocal js2-ts-cursor 1 ; emacs buffers are 1-indexed
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
691 "Token stream buffer-local variable.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
692 Current scan position.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
693
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
694 (js2-deflocal js2-ts-is-xml-attribute nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
695 "Token stream buffer-local variable.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
696
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
697 (js2-deflocal js2-ts-xml-is-tag-content nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
698 "Token stream buffer-local variable.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
699
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
700 (js2-deflocal js2-ts-xml-open-tags-count 0
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
701 "Token stream buffer-local variable.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
702
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
703 (js2-deflocal js2-ts-string-buffer nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
704 "Token stream buffer-local variable.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
705 List of chars built up while scanning various tokens.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
706
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
707 (js2-deflocal js2-ts-comment-type nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
708 "Token stream buffer-local variable.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
709
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
710 ;;; Parser variables
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
711
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
712 (js2-deflocal js2-parsed-errors nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
713 "List of errors produced during scanning/parsing.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
714
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
715 (js2-deflocal js2-parsed-warnings nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
716 "List of warnings produced during scanning/parsing.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
717
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
718 (js2-deflocal js2-recover-from-parse-errors t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
719 "Non-nil to continue parsing after a syntax error.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
720
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
721 In recovery mode, the AST will be built in full, and any error
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
722 nodes will be flagged with appropriate error information. If
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
723 this flag is nil, a syntax error will result in an error being
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
724 signaled.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
725
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
726 The variable is automatically buffer-local, because different
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
727 modes that use the parser will need different settings.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
728
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
729 (js2-deflocal js2-parse-hook nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
730 "List of callbacks for receiving parsing progress.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
731
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
732 (defvar js2-parse-finished-hook nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
733 "List of callbacks to notify when parsing finishes.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
734 Not called if parsing was interrupted.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
735
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
736 (js2-deflocal js2-is-eval-code nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
737 "True if we're evaluating code in a string.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
738 If non-nil, the tokenizer will record the token text, and the AST nodes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
739 will record their source text. Off by default for IDE modes, since the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
740 text is available in the buffer.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
741
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
742 (defvar js2-parse-ide-mode t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
743 "Non-nil if the parser is being used for `js2-mode'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
744 If non-nil, the parser will set text properties for fontification
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
745 and the syntax table. The value should be nil when using the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
746 parser as a frontend to an interpreter or byte compiler.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
747
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
748 ;;; Parser instance variables (buffer-local vars for js2-parse)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
749
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
750 (defconst js2-clear-ti-mask #xFFFF
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
751 "Mask to clear token information bits.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
752
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
753 (defconst js2-ti-after-eol (lsh 1 16)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
754 "Flag: first token of the source line.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
755
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
756 (defconst js2-ti-check-label (lsh 1 17)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
757 "Flag: indicates to check for label.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
758
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
759 ;; Inline Rhino's CompilerEnvirons vars as buffer-locals.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
760
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
761 (js2-deflocal js2-compiler-generate-debug-info t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
762 (js2-deflocal js2-compiler-use-dynamic-scope nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
763 (js2-deflocal js2-compiler-reserved-keywords-as-identifier nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
764 (js2-deflocal js2-compiler-xml-available t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
765 (js2-deflocal js2-compiler-optimization-level 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
766 (js2-deflocal js2-compiler-generating-source t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
767 (js2-deflocal js2-compiler-strict-mode nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
768 (js2-deflocal js2-compiler-report-warning-as-error nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
769 (js2-deflocal js2-compiler-generate-observer-count nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
770 (js2-deflocal js2-compiler-activation-names nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
771
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
772 ;; SKIP: sourceURI
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
773
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
774 ;; There's a compileFunction method in Context.java - may need it.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
775 (js2-deflocal js2-called-by-compile-function nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
776 "True if `js2-parse' was called by `js2-compile-function'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
777 Will only be used when we finish implementing the interpreter.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
778
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
779 ;; SKIP: ts (we just call `js2-init-scanner' and use its vars)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
780
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
781 (js2-deflocal js2-current-flagged-token js2-EOF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
782 (js2-deflocal js2-current-token js2-EOF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
783
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
784 ;; SKIP: node factory - we're going to just call functions directly,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
785 ;; and eventually go to a unified AST format.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
786
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
787 (js2-deflocal js2-nesting-of-function 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
788
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
789 (js2-deflocal js2-recorded-assignments nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
790 "Tracks assignments found during parsing.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
791
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
792 (defcustom js2-global-externs nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
793 "A list of any extern names you'd like to consider always declared.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
794 This list is global and is used by all js2-mode files.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
795 You can create buffer-local externs list using `js2-additional-externs'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
796
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
797 There is also a buffer-local variable `js2-default-externs',
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
798 which is initialized by default to include the Ecma-262 externs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
799 and the standard browser externs. The three lists are all
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
800 checked during highlighting."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
801 :type 'list
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
802 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
803
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
804 (js2-deflocal js2-default-externs nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
805 "Default external declarations.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
806
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
807 These are currently only used for highlighting undeclared variables,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
808 which only worries about top-level (unqualified) references.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
809 As js2-mode's processing improves, we will flesh out this list.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
810
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
811 The initial value is set to `js2-ecma-262-externs', unless you
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
812 have set `js2-include-browser-externs', in which case the browser
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
813 externs are also included.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
814
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
815 See `js2-additional-externs' for more information.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
816
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
817 (defcustom js2-include-browser-externs t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
818 "Non-nil to include browser externs in the master externs list.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
819 If you work on JavaScript files that are not intended for browsers,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
820 such as Mozilla Rhino server-side JavaScript, set this to nil.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
821 You can always include them on a per-file basis by calling
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
822 `js2-add-browser-externs' from a function on `js2-mode-hook'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
823
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
824 See `js2-additional-externs' for more information about externs."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
825 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
826 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
827
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
828 (defcustom js2-include-rhino-externs t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
829 "Non-nil to include Mozilla Rhino externs in the master externs list.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
830 See `js2-additional-externs' for more information about externs."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
831 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
832 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
833
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
834 (defcustom js2-include-gears-externs t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
835 "Non-nil to include Google Gears externs in the master externs list.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
836 See `js2-additional-externs' for more information about externs."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
837 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
838 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
839
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
840 (js2-deflocal js2-additional-externs nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
841 "A buffer-local list of additional external declarations.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
842 It is used to decide whether variables are considered undeclared
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
843 for purposes of highlighting.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
844
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
845 Each entry is a lisp string. The string should be the fully qualified
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
846 name of an external entity. All externs should be added to this list,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
847 so that as js2-mode's processing improves it can take advantage of them.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
848
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
849 You may want to declare your externs in three ways.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
850 First, you can add externs that are valid for all your JavaScript files.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
851 You should probably do this by adding them to `js2-global-externs', which
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
852 is a global list used for all js2-mode files.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
853
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
854 Next, you can add a function to `js2-mode-hook' that adds additional
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
855 externs appropriate for the specific file, perhaps based on its path.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
856 These should go in `js2-additional-externs', which is buffer-local.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
857
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
858 Finally, you can add a function to `js2-post-parse-callbacks',
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
859 which is called after parsing completes, and `root' is bound to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
860 the root of the parse tree. At this stage you can set up an AST
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
861 node visitor using `js2-visit-ast' and examine the parse tree
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
862 for specific import patterns that may imply the existence of
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
863 other externs, possibly tied to your build system. These should also
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
864 be added to `js2-additional-externs'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
865
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
866 Your post-parse callback may of course also use the simpler and
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
867 faster (but perhaps less robust) approach of simply scanning the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
868 buffer text for your imports, using regular expressions.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
869
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
870 ;; SKIP: decompiler
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
871 ;; SKIP: encoded-source
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
872
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
873 ;;; The following variables are per-function and should be saved/restored
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
874 ;;; during function parsing...
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
875
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
876 (js2-deflocal js2-current-script-or-fn nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
877 (js2-deflocal js2-current-scope nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
878 (js2-deflocal js2-nesting-of-with 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
879 (js2-deflocal js2-label-set nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
880 "An alist mapping label names to nodes.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
881
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
882 (js2-deflocal js2-loop-set nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
883 (js2-deflocal js2-loop-and-switch-set nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
884 (js2-deflocal js2-has-return-value nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
885 (js2-deflocal js2-end-flags 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
886
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
887 ;;; ...end of per function variables
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
888
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
889 ;; Without 2-token lookahead, labels are a problem.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
890 ;; These vars store the token info of the last matched name,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
891 ;; iff it wasn't the last matched token. Only valid in some contexts.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
892 (defvar js2-prev-name-token-start nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
893 (defvar js2-prev-name-token-string nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
894
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
895 (defsubst js2-save-name-token-data (pos name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
896 (setq js2-prev-name-token-start pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
897 js2-prev-name-token-string name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
898
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
899 ;; These flags enumerate the possible ways a statement/function can
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
900 ;; terminate. These flags are used by endCheck() and by the Parser to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
901 ;; detect inconsistent return usage.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
902 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
903 ;; END_UNREACHED is reserved for code paths that are assumed to always be
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
904 ;; able to execute (example: throw, continue)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
905 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
906 ;; END_DROPS_OFF indicates if the statement can transfer control to the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
907 ;; next one. Statement such as return dont. A compound statement may have
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
908 ;; some branch that drops off control to the next statement.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
909 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
910 ;; END_RETURNS indicates that the statement can return (without arguments)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
911 ;; END_RETURNS_VALUE indicates that the statement can return a value.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
912 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
913 ;; A compound statement such as
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
914 ;; if (condition) {
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
915 ;; return value;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
916 ;; }
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
917 ;; Will be detected as (END_DROPS_OFF | END_RETURN_VALUE) by endCheck()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
918
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
919 (defconst js2-end-unreached #x0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
920 (defconst js2-end-drops-off #x1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
921 (defconst js2-end-returns #x2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
922 (defconst js2-end-returns-value #x4)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
923 (defconst js2-end-yields #x8)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
924
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
925 ;; Rhino awkwardly passes a statementLabel parameter to the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
926 ;; statementHelper() function, the main statement parser, which
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
927 ;; is then used by quite a few of the sub-parsers. We just make
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
928 ;; it a buffer-local variable and make sure it's cleaned up properly.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
929 (js2-deflocal js2-labeled-stmt nil) ; type `js2-labeled-stmt-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
930
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
931 ;; Similarly, Rhino passes an inForInit boolean through about half
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
932 ;; the expression parsers. We use a dynamically-scoped variable,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
933 ;; which makes it easier to funcall the parsers individually without
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
934 ;; worrying about whether they take the parameter or not.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
935 (js2-deflocal js2-in-for-init nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
936 (js2-deflocal js2-temp-name-counter 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
937 (js2-deflocal js2-parse-stmt-count 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
938
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
939 (defsubst js2-get-next-temp-name ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
940 (format "$%d" (incf js2-temp-name-counter)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
941
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
942 (defvar js2-parse-interruptable-p t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
943 "Set this to nil to force parse to continue until finished.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
944 This will mostly be useful for interpreters.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
945
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
946 (defvar js2-statements-per-pause 50
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
947 "Pause after this many statements to check for user input.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
948 If user input is pending, stop the parse and discard the tree.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
949 This makes for a smoother user experience for large files.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
950 You may have to wait a second or two before the highlighting
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
951 and error-reporting appear, but you can always type ahead if
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
952 you wish. This appears to be more or less how Eclipse, IntelliJ
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
953 and other editors work.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
954
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
955 (js2-deflocal js2-record-comments t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
956 "Instructs the scanner to record comments in `js2-scanned-comments'.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
957
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
958 (js2-deflocal js2-scanned-comments nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
959 "List of all comments from the current parse.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
960
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
961 (defcustom js2-mode-indent-inhibit-undo nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
962 "Non-nil to disable collection of Undo information when indenting lines.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
963 Some users have requested this behavior. It's nil by default because
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
964 other Emacs modes don't work this way."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
965 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
966 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
967
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
968 (defcustom js2-mode-indent-ignore-first-tab nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
969 "If non-nil, ignore first TAB keypress if we look indented properly.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
970 It's fairly common for users to navigate to an already-indented line
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
971 and press TAB for reassurance that it's been indented. For this class
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
972 of users, we want the first TAB press on a line to be ignored if the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
973 line is already indented to one of the precomputed alternatives.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
974
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
975 This behavior is only partly implemented. If you TAB-indent a line,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
976 navigate to another line, and then navigate back, it fails to clear
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
977 the last-indented variable, so it thinks you've already hit TAB once,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
978 and performs the indent. A full solution would involve getting on the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
979 point-motion hooks for the entire buffer. If we come across another
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
980 use cases that requires watching point motion, I'll consider doing it.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
981
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
982 If you set this variable to nil, then the TAB key will always change
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
983 the indentation of the current line, if more than one alternative
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
984 indentation spot exists."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
985 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
986 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
987
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
988 (defvar js2-indent-hook nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
989 "A hook for user-defined indentation rules.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
990
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
991 Functions on this hook should expect two arguments: (LIST INDEX)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
992 The LIST argument is the list of computed indentation points for
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
993 the current line. INDEX is the list index of the indentation point
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
994 that `js2-bounce-indent' plans to use. If INDEX is nil, then the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
995 indent function is not going to change the current line indentation.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
996
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
997 If a hook function on this list returns a non-nil value, then
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
998 `js2-bounce-indent' assumes the hook function has performed its own
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
999 indentation, and will do nothing. If all hook functions on the list
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1000 return nil, then `js2-bounce-indent' will use its computed indentation
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1001 and reindent the line.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1002
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1003 When hook functions on this hook list are called, the variable
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1004 `js2-mode-ast' may or may not be set, depending on whether the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1005 parse tree is available. If the variable is nil, you can pass a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1006 callback to `js2-mode-wait-for-parse', and your callback will be
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1007 called after the new parse tree is built. This can take some time
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1008 in large files.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1009
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1010 (defface js2-warning-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1011 `((((class color) (background light))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1012 (:underline "orange"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1013 (((class color) (background dark))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1014 (:underline "orange"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1015 (t (:underline t)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1016 "Face for JavaScript warnings."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1017 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1018
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1019 (defface js2-error-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1020 `((((class color) (background light))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1021 (:foreground "red"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1022 (((class color) (background dark))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1023 (:foreground "red"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1024 (t (:foreground "red")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1025 "Face for JavaScript errors."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1026 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1027
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1028 (defface js2-jsdoc-tag-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1029 '((t :foreground "SlateGray"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1030 "Face used to highlight @whatever tags in jsdoc comments."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1031 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1032
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1033 (defface js2-jsdoc-type-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1034 '((t :foreground "SteelBlue"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1035 "Face used to highlight {FooBar} types in jsdoc comments."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1036 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1037
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1038 (defface js2-jsdoc-value-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1039 '((t :foreground "PeachPuff3"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1040 "Face used to highlight tag values in jsdoc comments."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1041 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1042
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1043 (defface js2-function-param-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1044 '((t :foreground "SeaGreen"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1045 "Face used to highlight function parameters in javascript."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1046 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1047
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1048 (defface js2-instance-member-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1049 '((t :foreground "DarkOrchid"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1050 "Face used to highlight instance variables in javascript.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1051 Not currently used."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1052 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1053
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1054 (defface js2-private-member-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1055 '((t :foreground "PeachPuff3"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1056 "Face used to highlight calls to private methods in javascript.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1057 Not currently used."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1058 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1059
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1060 (defface js2-private-function-call-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1061 '((t :foreground "goldenrod"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1062 "Face used to highlight calls to private functions in javascript.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1063 Not currently used."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1064 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1065
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1066 (defface js2-jsdoc-html-tag-name-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1067 (if js2-emacs22
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1068 '((((class color) (min-colors 88) (background light))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1069 (:foreground "rosybrown"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1070 (((class color) (min-colors 8) (background dark))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1071 (:foreground "yellow"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1072 (((class color) (min-colors 8) (background light))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1073 (:foreground "magenta")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1074 '((((type tty pc) (class color) (background light))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1075 (:foreground "magenta"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1076 (((type tty pc) (class color) (background dark))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1077 (:foreground "yellow"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1078 (t (:foreground "RosyBrown"))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1079 "Face used to highlight jsdoc html tag names"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1080 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1081
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1082 (defface js2-jsdoc-html-tag-delimiter-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1083 (if js2-emacs22
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1084 '((((class color) (min-colors 88) (background light))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1085 (:foreground "dark khaki"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1086 (((class color) (min-colors 8) (background dark))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1087 (:foreground "green"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1088 (((class color) (min-colors 8) (background light))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1089 (:foreground "green")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1090 '((((type tty pc) (class color) (background light))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1091 (:foreground "green"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1092 (((type tty pc) (class color) (background dark))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1093 (:foreground "green"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1094 (t (:foreground "dark khaki"))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1095 "Face used to highlight brackets in jsdoc html tags."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1096 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1097
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1098 (defface js2-magic-paren-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1099 '((t :underline t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1100 "Face used to color parens that will be auto-overwritten."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1101 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1102
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1103 (defcustom js2-post-parse-callbacks nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1104 "A list of callback functions invoked after parsing finishes.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1105 Currently, the main use for this function is to add synthetic
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1106 declarations to `js2-recorded-assignments', which see."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1107 :type 'list
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1108 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1109
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1110 (defface js2-external-variable-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1111 '((t :foreground "orange"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1112 "Face used to highlight assignments to undeclared variables.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1113 An undeclared variable is any variable not declared with var or let
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1114 in the current scope or any lexically enclosing scope. If you assign
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1115 to such a variable, then you are either expecting it to originate from
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1116 another file, or you've got a potential bug."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1117 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1118
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1119 (defcustom js2-highlight-external-variables t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1120 "Non-nil to higlight assignments to undeclared variables."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1121 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1122 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1123
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1124 (defcustom js2-auto-insert-catch-block t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1125 "Non-nil to insert matching catch block on open-curly after `try'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1126 :type 'boolean
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1127 :group 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1128
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1129 (defvar js2-mode-map
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1130 (let ((map (make-sparse-keymap))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1131 keys)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1132 (define-key map [mouse-1] #'js2-mode-show-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1133 (define-key map (kbd "C-m") #'js2-enter-key)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1134 (when js2-rebind-eol-bol-keys
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1135 (define-key map (kbd "C-a") #'js2-beginning-of-line)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1136 (define-key map (kbd "C-e") #'js2-end-of-line))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1137 (define-key map (kbd "C-c C-e") #'js2-mode-hide-element)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1138 (define-key map (kbd "C-c C-s") #'js2-mode-show-element)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1139 (define-key map (kbd "C-c C-a") #'js2-mode-show-all)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1140 (define-key map (kbd "C-c C-f") #'js2-mode-toggle-hide-functions)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1141 (define-key map (kbd "C-c C-t") #'js2-mode-toggle-hide-comments)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1142 (define-key map (kbd "C-c C-o") #'js2-mode-toggle-element)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1143 (define-key map (kbd "C-c C-w") #'js2-mode-toggle-warnings-and-errors)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1144 (define-key map (kbd "C-c C-`") #'js2-next-error)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1145 ;; also define user's preference for next-error, if available
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1146 (if (setq keys (where-is-internal #'next-error))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1147 (define-key map (car keys) #'js2-next-error))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1148 (define-key map (or (car (where-is-internal #'mark-defun))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1149 (kbd "M-C-h"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1150 #'js2-mark-defun)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1151 (define-key map (or (car (where-is-internal #'narrow-to-defun))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1152 (kbd "C-x nd"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1153 #'js2-narrow-to-defun)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1154 (define-key map [down-mouse-3] #'js2-down-mouse-3)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1155 (when js2-auto-indent-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1156 (mapc (lambda (key)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1157 (define-key map key #'js2-insert-and-indent))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1158 js2-electric-keys))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1159
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1160 (define-key map [menu-bar javascript]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1161 (cons "JavaScript" (make-sparse-keymap "JavaScript")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1162
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1163 (define-key map [menu-bar javascript customize-js2-mode]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1164 '(menu-item "Customize js2-mode" js2-mode-customize
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1165 :help "Customize the behavior of this mode"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1166
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1167 (define-key map [menu-bar javascript js2-force-refresh]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1168 '(menu-item "Force buffer refresh" js2-mode-reset
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1169 :help "Re-parse the buffer from scratch"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1170
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1171 (define-key map [menu-bar javascript separator-2]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1172 '("--"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1173
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1174 (define-key map [menu-bar javascript next-error]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1175 '(menu-item "Next warning or error" js2-next-error
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1176 :enabled (and js2-mode-ast
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1177 (or (js2-ast-root-errors js2-mode-ast)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1178 (js2-ast-root-warnings js2-mode-ast)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1179 :help "Move to next warning or error"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1180
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1181 (define-key map [menu-bar javascript display-errors]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1182 '(menu-item "Show errors and warnings" js2-mode-display-warnings-and-errors
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1183 :visible (not js2-mode-show-parse-errors)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1184 :help "Turn on display of warnings and errors"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1185
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1186 (define-key map [menu-bar javascript hide-errors]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1187 '(menu-item "Hide errors and warnings" js2-mode-hide-warnings-and-errors
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1188 :visible js2-mode-show-parse-errors
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1189 :help "Turn off display of warnings and errors"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1190
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1191 (define-key map [menu-bar javascript separator-1]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1192 '("--"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1193
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1194 (define-key map [menu-bar javascript js2-toggle-function]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1195 '(menu-item "Show/collapse element" js2-mode-toggle-element
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1196 :help "Hide or show function body or comment"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1197
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1198 (define-key map [menu-bar javascript show-comments]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1199 '(menu-item "Show block comments" js2-mode-toggle-hide-comments
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1200 :visible js2-mode-comments-hidden
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1201 :help "Expand all hidden block comments"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1202
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1203 (define-key map [menu-bar javascript hide-comments]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1204 '(menu-item "Hide block comments" js2-mode-toggle-hide-comments
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1205 :visible (not js2-mode-comments-hidden)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1206 :help "Show block comments as /*...*/"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1207
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1208 (define-key map [menu-bar javascript show-all-functions]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1209 '(menu-item "Show function bodies" js2-mode-toggle-hide-functions
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1210 :visible js2-mode-functions-hidden
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1211 :help "Expand all hidden function bodies"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1212
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1213 (define-key map [menu-bar javascript hide-all-functions]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1214 '(menu-item "Hide function bodies" js2-mode-toggle-hide-functions
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1215 :visible (not js2-mode-functions-hidden)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1216 :help "Show {...} for all top-level function bodies"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1217
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1218 map)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1219 "Keymap used in `js2-mode' buffers.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1220
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1221 (defconst js2-mode-identifier-re "[a-zA-Z_$][a-zA-Z0-9_$]*")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1222
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1223 (defvar js2-mode-//-comment-re "^\\(\\s-*\\)//.+"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1224 "Matches a //-comment line. Must be first non-whitespace on line.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1225 First match-group is the leading whitespace.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1226
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1227 (defvar js2-mode-hook nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1228
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1229 (js2-deflocal js2-mode-ast nil "Private variable.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1230 (js2-deflocal js2-mode-parse-timer nil "Private variable.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1231 (js2-deflocal js2-mode-buffer-dirty-p nil "Private variable.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1232 (js2-deflocal js2-mode-parsing nil "Private variable.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1233 (js2-deflocal js2-mode-node-overlay nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1234
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1235 (defvar js2-mode-show-overlay js2-mode-dev-mode-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1236 "Debug: Non-nil to highlight AST nodes on mouse-down.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1237
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1238 (js2-deflocal js2-mode-fontifications nil "Private variable")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1239 (js2-deflocal js2-mode-deferred-properties nil "Private variable")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1240 (js2-deflocal js2-imenu-recorder nil "Private variable")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1241 (js2-deflocal js2-imenu-function-map nil "Private variable")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1242
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1243 (defvar js2-paragraph-start
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1244 "\\(@[a-zA-Z]+\\>\\|$\\)")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1245
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1246 ;; Note that we also set a 'c-in-sws text property in html comments,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1247 ;; so that `c-forward-sws' and `c-backward-sws' work properly.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1248 (defvar js2-syntactic-ws-start
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1249 "\\s \\|/[*/]\\|[\n\r]\\|\\\\[\n\r]\\|\\s!\\|<!--\\|^\\s-*-->")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1250
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1251 (defvar js2-syntactic-ws-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1252 "\\s \\|[\n\r/]\\|\\s!")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1253
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1254 (defvar js2-syntactic-eol
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1255 (concat "\\s *\\(/\\*[^*\n\r]*"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1256 "\\(\\*+[^*\n\r/][^*\n\r]*\\)*"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1257 "\\*+/\\s *\\)*"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1258 "\\(//\\|/\\*[^*\n\r]*"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1259 "\\(\\*+[^*\n\r/][^*\n\r]*\\)*$"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1260 "\\|\\\\$\\|$\\)")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1261 "Copied from `java-mode'. Needed for some cc-engine functions.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1262
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1263 (defvar js2-comment-prefix-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1264 "//+\\|\\**")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1265
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1266 (defvar js2-comment-start-skip
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1267 "\\(//+\\|/\\*+\\)\\s *")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1268
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1269 (defvar js2-mode-verbose-parse-p js2-mode-dev-mode-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1270 "Non-nil to emit status messages during parsing.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1271
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1272 (defvar js2-mode-functions-hidden nil "private variable")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1273 (defvar js2-mode-comments-hidden nil "private variable")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1274
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1275 (defvar js2-mode-syntax-table
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1276 (let ((table (make-syntax-table)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1277 (c-populate-syntax-table table)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1278 table)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1279 "Syntax table used in js2-mode buffers.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1280
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1281 (defvar js2-mode-abbrev-table nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1282 "Abbrev table in use in `js2-mode' buffers.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1283 (define-abbrev-table 'js2-mode-abbrev-table ())
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1284
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1285 (defvar js2-mode-pending-parse-callbacks nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1286 "List of functions waiting to be notified that parse is finished.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1287
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1288 (defvar js2-mode-last-indented-line -1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1289
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1290 ;;; Localizable error and warning messages
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1291
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1292 ;; Messages are copied from Rhino's Messages.properties.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1293 ;; Many of the Java-specific messages have been elided.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1294 ;; Add any js2-specific ones at the end, so we can keep
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1295 ;; this file synced with changes to Rhino's.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1296
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1297 (defvar js2-message-table
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1298 (make-hash-table :test 'equal :size 250)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1299 "Contains localized messages for js2-mode.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1300
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1301 ;; TODO(stevey): construct this table at compile-time.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1302 (defmacro js2-msg (key &rest strings)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1303 `(puthash ,key (funcall #'concat ,@strings)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1304 js2-message-table))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1305
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1306 (defun js2-get-msg (msg-key)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1307 "Look up a localized message.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1308 MSG-KEY is a list of (MSG ARGS). If the message takes parameters,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1309 the correct number of ARGS must be provided."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1310 (let* ((key (if (listp msg-key) (car msg-key) msg-key))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1311 (args (if (listp msg-key) (cdr msg-key)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1312 (msg (gethash key js2-message-table)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1313 (if msg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1314 (apply #'format msg args)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1315 key))) ; default to showing the key
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1316
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1317 (js2-msg "msg.dup.parms"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1318 "Duplicate parameter name '%s'.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1319
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1320 (js2-msg "msg.too.big.jump"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1321 "Program too complex: jump offset too big.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1322
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1323 (js2-msg "msg.too.big.index"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1324 "Program too complex: internal index exceeds 64K limit.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1325
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1326 (js2-msg "msg.while.compiling.fn"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1327 "Encountered code generation error while compiling function '%s': %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1328
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1329 (js2-msg "msg.while.compiling.script"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1330 "Encountered code generation error while compiling script: %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1331
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1332 ;; Context
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1333 (js2-msg "msg.ctor.not.found"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1334 "Constructor for '%s' not found.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1335
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1336 (js2-msg "msg.not.ctor"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1337 "'%s' is not a constructor.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1338
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1339 ;; FunctionObject
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1340 (js2-msg "msg.varargs.ctor"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1341 "Method or constructor '%s' must be static "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1342 "with the signature (Context cx, Object[] args, "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1343 "Function ctorObj, boolean inNewExpr) "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1344 "to define a variable arguments constructor.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1345
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1346 (js2-msg "msg.varargs.fun"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1347 "Method '%s' must be static with the signature "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1348 "(Context cx, Scriptable thisObj, Object[] args, Function funObj) "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1349 "to define a variable arguments function.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1350
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1351 (js2-msg "msg.incompat.call"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1352 "Method '%s' called on incompatible object.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1353
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1354 (js2-msg "msg.bad.parms"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1355 "Unsupported parameter type '%s' in method '%s'.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1356
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1357 (js2-msg "msg.bad.method.return"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1358 "Unsupported return type '%s' in method '%s'.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1359
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1360 (js2-msg "msg.bad.ctor.return"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1361 "Construction of objects of type '%s' is not supported.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1362
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1363 (js2-msg "msg.no.overload"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1364 "Method '%s' occurs multiple times in class '%s'.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1365
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1366 (js2-msg "msg.method.not.found"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1367 "Method '%s' not found in '%s'.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1368
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1369 ;; IRFactory
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1370
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1371 (js2-msg "msg.bad.for.in.lhs"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1372 "Invalid left-hand side of for..in loop.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1373
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1374 (js2-msg "msg.mult.index"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1375 "Only one variable allowed in for..in loop.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1376
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1377 (js2-msg "msg.bad.for.in.destruct"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1378 "Left hand side of for..in loop must be an array of "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1379 "length 2 to accept key/value pair.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1380
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1381 (js2-msg "msg.cant.convert"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1382 "Can't convert to type '%s'.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1383
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1384 (js2-msg "msg.bad.assign.left"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1385 "Invalid assignment left-hand side.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1386
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1387 (js2-msg "msg.bad.decr"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1388 "Invalid decerement operand.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1389
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1390 (js2-msg "msg.bad.incr"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1391 "Invalid increment operand.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1392
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1393 (js2-msg "msg.bad.yield"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1394 "yield must be in a function.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1395
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1396 (js2-msg "msg.yield.parenthesized"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1397 "yield expression must be parenthesized.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1398
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1399 ;; NativeGlobal
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1400 (js2-msg "msg.cant.call.indirect"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1401 "Function '%s' must be called directly, and not by way of a "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1402 "function of another name.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1403
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1404 (js2-msg "msg.eval.nonstring"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1405 "Calling eval() with anything other than a primitive "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1406 "string value will simply return the value. "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1407 "Is this what you intended?")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1408
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1409 (js2-msg "msg.eval.nonstring.strict"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1410 "Calling eval() with anything other than a primitive "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1411 "string value is not allowed in strict mode.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1412
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1413 (js2-msg "msg.bad.destruct.op"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1414 "Invalid destructuring assignment operator")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1415
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1416 ;; NativeCall
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1417 (js2-msg "msg.only.from.new"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1418 "'%s' may only be invoked from a `new' expression.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1419
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1420 (js2-msg "msg.deprec.ctor"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1421 "The '%s' constructor is deprecated.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1422
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1423 ;; NativeFunction
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1424 (js2-msg "msg.no.function.ref.found"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1425 "no source found to decompile function reference %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1426
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1427 (js2-msg "msg.arg.isnt.array"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1428 "second argument to Function.prototype.apply must be an array")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1429
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1430 ;; NativeGlobal
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1431 (js2-msg "msg.bad.esc.mask"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1432 "invalid string escape mask")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1433
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1434 ;; NativeRegExp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1435 (js2-msg "msg.bad.quant"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1436 "Invalid quantifier %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1437
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1438 (js2-msg "msg.overlarge.backref"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1439 "Overly large back reference %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1440
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1441 (js2-msg "msg.overlarge.min"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1442 "Overly large minimum %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1443
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1444 (js2-msg "msg.overlarge.max"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1445 "Overly large maximum %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1446
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1447 (js2-msg "msg.zero.quant"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1448 "Zero quantifier %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1449
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1450 (js2-msg "msg.max.lt.min"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1451 "Maximum %s less than minimum")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1452
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1453 (js2-msg "msg.unterm.quant"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1454 "Unterminated quantifier %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1455
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1456 (js2-msg "msg.unterm.paren"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1457 "Unterminated parenthetical %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1458
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1459 (js2-msg "msg.unterm.class"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1460 "Unterminated character class %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1461
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1462 (js2-msg "msg.bad.range"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1463 "Invalid range in character class.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1464
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1465 (js2-msg "msg.trail.backslash"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1466 "Trailing \\ in regular expression.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1467
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1468 (js2-msg "msg.re.unmatched.right.paren"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1469 "unmatched ) in regular expression.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1470
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1471 (js2-msg "msg.no.regexp"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1472 "Regular expressions are not available.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1473
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1474 (js2-msg "msg.bad.backref"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1475 "back-reference exceeds number of capturing parentheses.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1476
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1477 (js2-msg "msg.bad.regexp.compile"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1478 "Only one argument may be specified if the first "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1479 "argument to RegExp.prototype.compile is a RegExp object.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1480
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1481 ;; Parser
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1482 (js2-msg "msg.got.syntax.errors"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1483 "Compilation produced %s syntax errors.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1484
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1485 (js2-msg "msg.var.redecl"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1486 "TypeError: redeclaration of var %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1487
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1488 (js2-msg "msg.const.redecl"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1489 "TypeError: redeclaration of const %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1490
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1491 (js2-msg "msg.let.redecl"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1492 "TypeError: redeclaration of variable %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1493
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1494 (js2-msg "msg.parm.redecl"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1495 "TypeError: redeclaration of formal parameter %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1496
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1497 (js2-msg "msg.fn.redecl"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1498 "TypeError: redeclaration of function %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1499
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1500 (js2-msg "msg.let.decl.not.in.block"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1501 "SyntaxError: let declaration not directly within block")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1502
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1503 ;; NodeTransformer
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1504 (js2-msg "msg.dup.label"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1505 "duplicated label")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1506
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1507 (js2-msg "msg.undef.label"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1508 "undefined label")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1509
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1510 (js2-msg "msg.bad.break"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1511 "unlabelled break must be inside loop or switch")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1512
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1513 (js2-msg "msg.continue.outside"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1514 "continue must be inside loop")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1515
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1516 (js2-msg "msg.continue.nonloop"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1517 "continue can only use labels of iteration statements")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1518
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1519 (js2-msg "msg.bad.throw.eol"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1520 "Line terminator is not allowed between the throw "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1521 "keyword and throw expression.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1522
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1523 (js2-msg "msg.no.paren.parms"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1524 "missing ( before function parameters.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1525
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1526 (js2-msg "msg.no.parm"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1527 "missing formal parameter")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1528
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1529 (js2-msg "msg.no.paren.after.parms"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1530 "missing ) after formal parameters")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1531
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1532 (js2-msg "msg.no.brace.body"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1533 "missing '{' before function body")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1534
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1535 (js2-msg "msg.no.brace.after.body"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1536 "missing } after function body")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1537
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1538 (js2-msg "msg.no.paren.cond"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1539 "missing ( before condition")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1540
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1541 (js2-msg "msg.no.paren.after.cond"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1542 "missing ) after condition")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1543
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1544 (js2-msg "msg.no.semi.stmt"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1545 "missing ; before statement")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1546
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1547 (js2-msg "msg.missing.semi"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1548 "missing ; after statement")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1549
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1550 (js2-msg "msg.no.name.after.dot"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1551 "missing name after . operator")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1552
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1553 (js2-msg "msg.no.name.after.coloncolon"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1554 "missing name after :: operator")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1555
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1556 (js2-msg "msg.no.name.after.dotdot"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1557 "missing name after .. operator")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1558
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1559 (js2-msg "msg.no.name.after.xmlAttr"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1560 "missing name after .@")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1561
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1562 (js2-msg "msg.no.bracket.index"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1563 "missing ] in index expression")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1564
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1565 (js2-msg "msg.no.paren.switch"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1566 "missing ( before switch expression")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1567
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1568 (js2-msg "msg.no.paren.after.switch"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1569 "missing ) after switch expression")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1570
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1571 (js2-msg "msg.no.brace.switch"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1572 "missing '{' before switch body")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1573
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1574 (js2-msg "msg.bad.switch"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1575 "invalid switch statement")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1576
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1577 (js2-msg "msg.no.colon.case"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1578 "missing : after case expression")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1579
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1580 (js2-msg "msg.double.switch.default"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1581 "double default label in the switch statement")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1582
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1583 (js2-msg "msg.no.while.do"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1584 "missing while after do-loop body")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1585
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1586 (js2-msg "msg.no.paren.for"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1587 "missing ( after for")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1588
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1589 (js2-msg "msg.no.semi.for"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1590 "missing ; after for-loop initializer")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1591
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1592 (js2-msg "msg.no.semi.for.cond"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1593 "missing ; after for-loop condition")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1594
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1595 (js2-msg "msg.in.after.for.name"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1596 "missing in after for")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1597
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1598 (js2-msg "msg.no.paren.for.ctrl"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1599 "missing ) after for-loop control")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1600
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1601 (js2-msg "msg.no.paren.with"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1602 "missing ( before with-statement object")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1603
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1604 (js2-msg "msg.no.paren.after.with"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1605 "missing ) after with-statement object")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1606
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1607 (js2-msg "msg.no.paren.after.let"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1608 "missing ( after let")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1609
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1610 (js2-msg "msg.no.paren.let"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1611 "missing ) after variable list")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1612
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1613 (js2-msg "msg.no.curly.let"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1614 "missing } after let statement")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1615
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1616 (js2-msg "msg.bad.return"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1617 "invalid return")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1618
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1619 (js2-msg "msg.no.brace.block"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1620 "missing } in compound statement")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1621
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1622 (js2-msg "msg.bad.label"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1623 "invalid label")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1624
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1625 (js2-msg "msg.bad.var"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1626 "missing variable name")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1627
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1628 (js2-msg "msg.bad.var.init"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1629 "invalid variable initialization")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1630
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1631 (js2-msg "msg.no.colon.cond"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1632 "missing : in conditional expression")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1633
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1634 (js2-msg "msg.no.paren.arg"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1635 "missing ) after argument list")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1636
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1637 (js2-msg "msg.no.bracket.arg"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1638 "missing ] after element list")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1639
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1640 (js2-msg "msg.bad.prop"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1641 "invalid property id")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1642
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1643 (js2-msg "msg.no.colon.prop"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1644 "missing : after property id")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1645
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1646 (js2-msg "msg.no.brace.prop"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1647 "missing } after property list")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1648
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1649 (js2-msg "msg.no.paren"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1650 "missing ) in parenthetical")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1651
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1652 (js2-msg "msg.reserved.id"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1653 "identifier is a reserved word")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1654
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1655 (js2-msg "msg.no.paren.catch"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1656 "missing ( before catch-block condition")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1657
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1658 (js2-msg "msg.bad.catchcond"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1659 "invalid catch block condition")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1660
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1661 (js2-msg "msg.catch.unreachable"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1662 "any catch clauses following an unqualified catch are unreachable")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1663
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1664 (js2-msg "msg.no.brace.try"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1665 "missing '{' before try block")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1666
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1667 (js2-msg "msg.no.brace.catchblock"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1668 "missing '{' before catch-block body")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1669
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1670 (js2-msg "msg.try.no.catchfinally"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1671 "'try' without 'catch' or 'finally'")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1672
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1673 (js2-msg "msg.no.return.value"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1674 "function %s does not always return a value")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1675
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1676 (js2-msg "msg.anon.no.return.value"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1677 "anonymous function does not always return a value")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1678
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1679 (js2-msg "msg.return.inconsistent"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1680 "return statement is inconsistent with previous usage")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1681
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1682 (js2-msg "msg.generator.returns"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1683 "TypeError: generator function '%s' returns a value")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1684
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1685 (js2-msg "msg.anon.generator.returns"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1686 "TypeError: anonymous generator function returns a value")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1687
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1688 (js2-msg "msg.syntax"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1689 "syntax error")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1690
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1691 (js2-msg "msg.unexpected.eof"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1692 "Unexpected end of file")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1693
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1694 (js2-msg "msg.XML.bad.form"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1695 "illegally formed XML syntax")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1696
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1697 (js2-msg "msg.XML.not.available"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1698 "XML runtime not available")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1699
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1700 (js2-msg "msg.too.deep.parser.recursion"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1701 "Too deep recursion while parsing")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1702
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1703 (js2-msg "msg.no.side.effects"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1704 "Code has no side effects")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1705
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1706 (js2-msg "msg.extra.trailing.comma"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1707 "Trailing comma is not legal in an ECMA-262 object initializer")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1708
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1709 (js2-msg "msg.array.trailing.comma"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1710 "Trailing comma yields different behavior across browsers")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1711
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1712 (js2-msg "msg.equal.as.assign"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1713 (concat "Test for equality (==) mistyped as assignment (=)?"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1714 " (parenthesize to suppress warning)"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1715
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1716 (js2-msg "msg.var.hides.arg"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1717 "Variable %s hides argument")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1718
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1719 (js2-msg "msg.destruct.assign.no.init"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1720 "Missing = in destructuring declaration")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1721
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1722 ;; ScriptRuntime
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1723 (js2-msg "msg.no.properties"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1724 "%s has no properties.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1725
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1726 (js2-msg "msg.invalid.iterator"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1727 "Invalid iterator value")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1728
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1729 (js2-msg "msg.iterator.primitive"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1730 "__iterator__ returned a primitive value")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1731
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1732 (js2-msg "msg.assn.create.strict"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1733 "Assignment to undeclared variable %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1734
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1735 (js2-msg "msg.ref.undefined.prop"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1736 "Reference to undefined property '%s'")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1737
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1738 (js2-msg "msg.prop.not.found"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1739 "Property %s not found.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1740
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1741 (js2-msg "msg.invalid.type"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1742 "Invalid JavaScript value of type %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1743
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1744 (js2-msg "msg.primitive.expected"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1745 "Primitive type expected (had %s instead)")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1746
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1747 (js2-msg "msg.namespace.expected"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1748 "Namespace object expected to left of :: (found %s instead)")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1749
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1750 (js2-msg "msg.null.to.object"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1751 "Cannot convert null to an object.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1752
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1753 (js2-msg "msg.undef.to.object"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1754 "Cannot convert undefined to an object.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1755
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1756 (js2-msg "msg.cyclic.value"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1757 "Cyclic %s value not allowed.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1758
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1759 (js2-msg "msg.is.not.defined"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1760 "'%s' is not defined.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1761
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1762 (js2-msg "msg.undef.prop.read"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1763 "Cannot read property '%s' from %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1764
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1765 (js2-msg "msg.undef.prop.write"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1766 "Cannot set property '%s' of %s to '%s'")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1767
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1768 (js2-msg "msg.undef.prop.delete"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1769 "Cannot delete property '%s' of %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1770
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1771 (js2-msg "msg.undef.method.call"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1772 "Cannot call method '%s' of %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1773
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1774 (js2-msg "msg.undef.with"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1775 "Cannot apply 'with' to %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1776
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1777 (js2-msg "msg.isnt.function"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1778 "%s is not a function, it is %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1779
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1780 (js2-msg "msg.isnt.function.in"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1781 "Cannot call property %s in object %s. "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1782 "It is not a function, it is '%s'.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1783
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1784 (js2-msg "msg.function.not.found"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1785 "Cannot find function %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1786
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1787 (js2-msg "msg.function.not.found.in"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1788 "Cannot find function %s in object %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1789
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1790 (js2-msg "msg.isnt.xml.object"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1791 "%s is not an xml object.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1792
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1793 (js2-msg "msg.no.ref.to.get"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1794 "%s is not a reference to read reference value.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1795
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1796 (js2-msg "msg.no.ref.to.set"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1797 "%s is not a reference to set reference value to %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1798
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1799 (js2-msg "msg.no.ref.from.function"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1800 "Function %s can not be used as the left-hand "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1801 "side of assignment or as an operand of ++ or -- operator.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1802
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1803 (js2-msg "msg.bad.default.value"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1804 "Object's getDefaultValue() method returned an object.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1805
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1806 (js2-msg "msg.instanceof.not.object"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1807 "Can't use instanceof on a non-object.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1808
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1809 (js2-msg "msg.instanceof.bad.prototype"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1810 "'prototype' property of %s is not an object.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1811
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1812 (js2-msg "msg.bad.radix"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1813 "illegal radix %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1814
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1815 ;; ScriptableObject
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1816 (js2-msg "msg.default.value"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1817 "Cannot find default value for object.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1818
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1819 (js2-msg "msg.zero.arg.ctor"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1820 "Cannot load class '%s' which has no zero-parameter constructor.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1821
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1822 (js2-msg "msg.ctor.multiple.parms"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1823 "Can't define constructor or class %s since more than "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1824 "one constructor has multiple parameters.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1825
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1826 (js2-msg "msg.extend.scriptable"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1827 "%s must extend ScriptableObject in order to define property %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1828
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1829 (js2-msg "msg.bad.getter.parms"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1830 "In order to define a property, getter %s must have zero "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1831 "parameters or a single ScriptableObject parameter.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1832
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1833 (js2-msg "msg.obj.getter.parms"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1834 "Expected static or delegated getter %s to take "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1835 "a ScriptableObject parameter.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1836
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1837 (js2-msg "msg.getter.static"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1838 "Getter and setter must both be static or neither be static.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1839
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1840 (js2-msg "msg.setter.return"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1841 "Setter must have void return type: %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1842
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1843 (js2-msg "msg.setter2.parms"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1844 "Two-parameter setter must take a ScriptableObject as "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1845 "its first parameter.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1846
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1847 (js2-msg "msg.setter1.parms"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1848 "Expected single parameter setter for %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1849
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1850 (js2-msg "msg.setter2.expected"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1851 "Expected static or delegated setter %s to take two parameters.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1852
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1853 (js2-msg "msg.setter.parms"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1854 "Expected either one or two parameters for setter.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1855
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1856 (js2-msg "msg.setter.bad.type"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1857 "Unsupported parameter type '%s' in setter '%s'.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1858
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1859 (js2-msg "msg.add.sealed"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1860 "Cannot add a property to a sealed object: %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1861
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1862 (js2-msg "msg.remove.sealed"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1863 "Cannot remove a property from a sealed object: %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1864
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1865 (js2-msg "msg.modify.sealed"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1866 "Cannot modify a property of a sealed object: %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1867
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1868 (js2-msg "msg.modify.readonly"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1869 "Cannot modify readonly property: %s.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1870
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1871 ;; TokenStream
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1872 (js2-msg "msg.missing.exponent"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1873 "missing exponent")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1874
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1875 (js2-msg "msg.caught.nfe"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1876 "number format error")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1877
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1878 (js2-msg "msg.unterminated.string.lit"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1879 "unterminated string literal")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1880
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1881 (js2-msg "msg.unterminated.comment"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1882 "unterminated comment")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1883
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1884 (js2-msg "msg.unterminated.re.lit"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1885 "unterminated regular expression literal")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1886
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1887 (js2-msg "msg.invalid.re.flag"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1888 "invalid flag after regular expression")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1889
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1890 (js2-msg "msg.no.re.input.for"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1891 "no input for %s")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1892
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1893 (js2-msg "msg.illegal.character"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1894 "illegal character")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1895
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1896 (js2-msg "msg.invalid.escape"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1897 "invalid Unicode escape sequence")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1898
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1899 (js2-msg "msg.bad.namespace"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1900 "not a valid default namespace statement. "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1901 "Syntax is: default xml namespace = EXPRESSION;")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1902
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1903 ;; TokensStream warnings
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1904 (js2-msg "msg.bad.octal.literal"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1905 "illegal octal literal digit %s; "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1906 "interpreting it as a decimal digit")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1907
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1908 (js2-msg "msg.reserved.keyword"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1909 "illegal usage of future reserved keyword %s; "
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1910 "interpreting it as ordinary identifier")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1911
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1912 (js2-msg "msg.script.is.not.constructor"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1913 "Script objects are not constructors.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1914
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1915 ;; Arrays
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1916 (js2-msg "msg.arraylength.bad"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1917 "Inappropriate array length.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1918
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1919 ;; Arrays
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1920 (js2-msg "msg.arraylength.too.big"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1921 "Array length %s exceeds supported capacity limit.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1922
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1923 ;; URI
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1924 (js2-msg "msg.bad.uri"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1925 "Malformed URI sequence.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1926
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1927 ;; Number
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1928 (js2-msg "msg.bad.precision"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1929 "Precision %s out of range.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1930
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1931 ;; NativeGenerator
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1932 (js2-msg "msg.send.newborn"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1933 "Attempt to send value to newborn generator")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1934
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1935 (js2-msg "msg.already.exec.gen"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1936 "Already executing generator")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1937
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1938 (js2-msg "msg.StopIteration.invalid"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1939 "StopIteration may not be changed to an arbitrary object.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1940
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1941 ;; Interpreter
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1942 (js2-msg "msg.yield.closing"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1943 "Yield from closing generator")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1944
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1945 ;;; Utilities
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1946
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1947 (defun js2-delete-if (predicate list)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1948 "Remove all items satisfying PREDICATE in LIST."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1949 (loop for item in list
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1950 if (not (funcall predicate item))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1951 collect item))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1952
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1953 (defun js2-position (element list)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1954 "Find 0-indexed position of ELEMENT in LIST comparing with `eq'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1955 Returns nil if element is not found in the list."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1956 (let ((count 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1957 found)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1958 (while (and list (not found))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1959 (if (eq element (car list))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1960 (setq found t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1961 (setq count (1+ count)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1962 list (cdr list))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1963 (if found count)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1964
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1965 (defun js2-find-if (predicate list)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1966 "Find first item satisfying PREDICATE in LIST."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1967 (let (result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1968 (while (and list (not result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1969 (if (funcall predicate (car list))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1970 (setq result (car list)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1971 (setq list (cdr list)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1972 result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1973
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1974 (defmacro js2-time (form)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1975 "Evaluate FORM, discard result, and return elapsed time in sec"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1976 (declare (debug t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1977 (let ((beg (make-symbol "--js2-time-beg--"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1978 (delta (make-symbol "--js2-time-end--")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1979 `(let ((,beg (current-time))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1980 ,delta)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1981 ,form
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1982 (/ (truncate (* (- (float-time (current-time))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1983 (float-time ,beg)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1984 10000)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1985 10000.0))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1986
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1987 (defsubst js2-same-line (pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1988 "Return t if POS is on the same line as current point."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1989 (and (>= pos (point-at-bol))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1990 (<= pos (point-at-eol))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1991
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1992 (defsubst js2-same-line-2 (p1 p2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1993 "Return t if p1 is on the same line as p2."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1994 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1995 (goto-char p1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1996 (js2-same-line p2)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1997
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1998 (defun js2-code-bug ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
1999 "Signal an error when we encounter an unexpected code path."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2000 (error "failed assertion"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2001
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2002 ;; I'd like to associate errors with nodes, but for now the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2003 ;; easiest thing to do is get the context info from the last token.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2004 (defsubst js2-record-parse-error (msg &optional arg pos len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2005 (push (list (list msg arg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2006 (or pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2007 (or len (- js2-token-end js2-token-beg)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2008 js2-parsed-errors))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2009
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2010 (defsubst js2-report-error (msg &optional msg-arg pos len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2011 "Signal a syntax error or record a parse error."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2012 (if js2-recover-from-parse-errors
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2013 (js2-record-parse-error msg msg-arg pos len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2014 (signal 'js2-syntax-error
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2015 (list msg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2016 js2-ts-lineno
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2017 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2018 (goto-char js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2019 (current-column))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2020 js2-ts-hit-eof))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2021
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2022 (defsubst js2-report-warning (msg &optional msg-arg pos len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2023 (if js2-compiler-report-warning-as-error
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2024 (js2-report-error msg msg-arg pos len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2025 (push (list (list msg msg-arg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2026 (or pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2027 (or len (- js2-token-end js2-token-beg)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2028 js2-parsed-warnings)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2029
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2030 (defsubst js2-add-strict-warning (msg-id &optional msg-arg beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2031 (if js2-compiler-strict-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2032 (js2-report-warning msg-id msg-arg beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2033 (and beg end (- end beg)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2034
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2035 (put 'js2-syntax-error 'error-conditions
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2036 '(error syntax-error js2-syntax-error))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2037 (put 'js2-syntax-error 'error-message "Syntax error")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2038
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2039 (put 'js2-parse-error 'error-conditions
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2040 '(error parse-error js2-parse-error))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2041 (put 'js2-parse-error 'error-message "Parse error")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2042
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2043 (defmacro js2-clear-flag (flags flag)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2044 `(setq ,flags (logand ,flags (lognot ,flag))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2045
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2046 (defmacro js2-set-flag (flags flag)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2047 "Logical-or FLAG into FLAGS."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2048 `(setq ,flags (logior ,flags ,flag)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2049
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2050 (defsubst js2-flag-set-p (flags flag)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2051 (/= 0 (logand flags flag)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2052
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2053 (defsubst js2-flag-not-set-p (flags flag)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2054 (zerop (logand flags flag)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2055
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2056 ;; Stolen shamelessly from James Clark's nxml-mode.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2057 (defmacro js2-with-unmodifying-text-property-changes (&rest body)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2058 "Evaluate BODY without any text property changes modifying the buffer.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2059 Any text properties changes happen as usual but the changes are not treated as
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2060 modifications to the buffer."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2061 (declare (indent 0) (debug t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2062 (let ((modified (make-symbol "modified")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2063 `(let ((,modified (buffer-modified-p))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2064 (inhibit-read-only t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2065 (inhibit-modification-hooks t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2066 (buffer-undo-list t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2067 (deactivate-mark nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2068 ;; Apparently these avoid file locking problems.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2069 (buffer-file-name nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2070 (buffer-file-truename nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2071 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2072 (progn ,@body)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2073 (unless ,modified
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2074 (restore-buffer-modified-p nil))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2075
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2076 (defmacro js2-with-underscore-as-word-syntax (&rest body)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2077 "Evaluate BODY with the _ character set to be word-syntax."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2078 (declare (indent 0) (debug t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2079 (let ((old-syntax (make-symbol "old-syntax")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2080 `(let ((,old-syntax (string (char-syntax ?_))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2081 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2082 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2083 (modify-syntax-entry ?_ "w" js2-mode-syntax-table)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2084 ,@body)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2085 (modify-syntax-entry ?_ ,old-syntax js2-mode-syntax-table)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2086
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2087 (defsubst js2-char-uppercase-p (c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2088 "Return t if C is an uppercase character.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2089 Handles unicode and latin chars properly."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2090 (/= c (downcase c)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2091
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2092 (defsubst js2-char-lowercase-p (c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2093 "Return t if C is an uppercase character.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2094 Handles unicode and latin chars properly."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2095 (/= c (upcase c)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2096
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2097 ;;; AST struct and function definitions
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2098
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2099 ;; flags for ast node property 'member-type (used for e4x operators)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2100 (defvar js2-property-flag #x1 "property access: element is valid name")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2101 (defvar js2-attribute-flag #x2 "x.@y or x..@y")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2102 (defvar js2-descendants-flag #x4 "x..y or x..@i")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2103
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2104 (defsubst js2-relpos (pos anchor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2105 "Convert POS to be relative to ANCHOR.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2106 If POS is nil, returns nil."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2107 (and pos (- pos anchor)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2108
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2109 (defsubst js2-make-pad (indent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2110 (if (zerop indent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2111 ""
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2112 (make-string (* indent js2-basic-offset) ? )))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2113
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2114 (defsubst js2-visit-ast (node callback)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2115 "Visit every node in ast NODE with visitor CALLBACK.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2116
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2117 CALLBACK is a function that takes two arguments: (NODE END-P). It is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2118 called twice: once to visit the node, and again after all the node's
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2119 children have been processed. The END-P argument is nil on the first
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2120 call and non-nil on the second call. The return value of the callback
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2121 affects the traversal: if non-nil, the children of NODE are processed.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2122 If the callback returns nil, or if the node has no children, then the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2123 callback is called immediately with a non-nil END-P argument.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2124
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2125 The node traversal is approximately lexical-order, although there
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2126 are currently no guarantees around this."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2127 (let ((vfunc (get (aref node 0) 'js2-visitor)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2128 ;; visit the node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2129 (when (funcall callback node nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2130 ;; visit the kids
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2131 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2132 ((eq vfunc 'js2-visit-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2133 nil) ; don't even bother calling it
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2134 ;; Each AST node type has to define a `js2-visitor' function
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2135 ;; that takes a node and a callback, and calls `js2-visit-ast'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2136 ;; on each child of the node.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2137 (vfunc
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2138 (funcall vfunc node callback))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2139 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2140 (error "%s does not define a visitor-traversal function"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2141 (aref node 0)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2142 ;; call the end-visit
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2143 (funcall callback node t)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2144
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2145 (defstruct (js2-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2146 (:constructor nil)) ; abstract
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2147 "Base AST node type."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2148 (type -1) ; token type
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2149 (pos -1) ; start position of this AST node in parsed input
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2150 (len 1) ; num characters spanned by the node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2151 props ; optional node property list (an alist)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2152 parent) ; link to parent node; null for root
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2153
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2154 (defsubst js2-node-get-prop (node prop &optional default)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2155 (or (cadr (assoc prop (js2-node-props node))) default))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2156
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2157 (defsubst js2-node-set-prop (node prop value)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2158 (setf (js2-node-props node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2159 (cons (list prop value) (js2-node-props node))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2160
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2161 (defsubst js2-fixup-starts (n nodes)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2162 "Adjust the start positions of NODES to be relative to N.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2163 Any node in the list may be nil, for convenience."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2164 (dolist (node nodes)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2165 (when node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2166 (setf (js2-node-pos node) (- (js2-node-pos node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2167 (js2-node-pos n))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2168
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2169 (defsubst js2-node-add-children (parent &rest nodes)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2170 "Set parent node of NODES to PARENT, and return PARENT.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2171 Does nothing if we're not recording parent links.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2172 If any given node in NODES is nil, doesn't record that link."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2173 (js2-fixup-starts parent nodes)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2174 (dolist (node nodes)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2175 (and node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2176 (setf (js2-node-parent node) parent))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2177
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2178 ;; Non-recursive since it's called a frightening number of times.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2179 (defsubst js2-node-abs-pos (n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2180 (let ((pos (js2-node-pos n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2181 (while (setq n (js2-node-parent n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2182 (setq pos (+ pos (js2-node-pos n))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2183 pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2184
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2185 (defsubst js2-node-abs-end (n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2186 "Return absolute buffer position of end of N."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2187 (+ (js2-node-abs-pos n) (js2-node-len n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2188
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2189 ;; It's important to make sure block nodes have a lisp list for the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2190 ;; child nodes, to limit printing recursion depth in an AST that
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2191 ;; otherwise consists of defstruct vectors. Emacs will crash printing
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2192 ;; a sufficiently large vector tree.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2193
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2194 (defstruct (js2-block-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2195 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2196 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2197 (:constructor make-js2-block-node (&key (type js2-BLOCK)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2198 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2199 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2200 props
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2201 kids)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2202 "A block of statements."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2203 kids) ; a lisp list of the child statement nodes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2204
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2205 (put 'cl-struct-js2-block-node 'js2-visitor 'js2-visit-block)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2206 (put 'cl-struct-js2-block-node 'js2-printer 'js2-print-block)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2207
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2208 (defsubst js2-visit-block (ast callback)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2209 "Visit the `js2-block-node' children of AST."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2210 (dolist (kid (js2-block-node-kids ast))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2211 (js2-visit-ast kid callback)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2212
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2213 (defun js2-print-block (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2214 (let ((pad (js2-make-pad i)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2215 (insert pad "{\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2216 (dolist (kid (js2-block-node-kids n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2217 (js2-print-ast kid (1+ i)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2218 (insert pad "}")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2219
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2220 (defstruct (js2-scope
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2221 (:include js2-block-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2222 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2223 (:constructor make-js2-scope (&key (type js2-BLOCK)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2224 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2225 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2226 kids)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2227 ;; The symbol-table is a LinkedHashMap<String,Symbol> in Rhino.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2228 ;; I don't have one of those handy, so I'll use an alist for now.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2229 ;; It's as fast as an emacs hashtable for up to about 50 elements,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2230 ;; and is much lighter-weight to construct (both CPU and mem).
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2231 ;; The keys are interned strings (symbols) for faster lookup.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2232 ;; Should switch to hybrid alist/hashtable eventually.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2233 symbol-table ; an alist of (symbol . js2-symbol)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2234 parent-scope ; a `js2-scope'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2235 top) ; top-level `js2-scope' (script/function)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2236
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2237 (put 'cl-struct-js2-scope 'js2-visitor 'js2-visit-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2238 (put 'cl-struct-js2-scope 'js2-printer 'js2-print-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2239
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2240 (defun js2-scope-set-parent-scope (scope parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2241 (setf (js2-scope-parent-scope scope) parent
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2242 (js2-scope-top scope) (if (null parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2243 scope
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2244 (js2-scope-top parent))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2245
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2246 (defun js2-node-get-enclosing-scope (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2247 "Return the innermost `js2-scope' node surrounding NODE.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2248 Returns nil if there is no enclosing scope node."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2249 (let ((parent (js2-node-parent node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2250 (while (not (js2-scope-p parent))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2251 (setq parent (js2-node-parent parent)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2252 parent))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2253
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2254 (defun js2-get-defining-scope (scope name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2255 "Search up scope chain from SCOPE looking for NAME, a string or symbol.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2256 Returns `js2-scope' in which NAME is defined, or nil if not found."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2257 (let ((sym (if (symbolp name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2258 name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2259 (intern name)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2260 table
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2261 result
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2262 (continue t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2263 (while (and scope continue)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2264 (if (and (setq table (js2-scope-symbol-table scope))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2265 (assq sym table))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2266 (setq continue nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2267 result scope)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2268 (setq scope (js2-scope-parent-scope scope))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2269 result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2270
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2271 (defsubst js2-scope-get-symbol (scope name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2272 "Return symbol table entry for NAME in SCOPE.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2273 NAME can be a string or symbol. Returns a `js2-symbol' or nil if not found."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2274 (and (js2-scope-symbol-table scope)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2275 (cdr (assq (if (symbolp name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2276 name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2277 (intern name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2278 (js2-scope-symbol-table scope)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2279
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2280 (defsubst js2-scope-put-symbol (scope name symbol)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2281 "Enter SYMBOL into symbol-table for SCOPE under NAME.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2282 NAME can be a lisp symbol or string. SYMBOL is a `js2-symbol'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2283 (let* ((table (js2-scope-symbol-table scope))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2284 (sym (if (symbolp name) name (intern name)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2285 (entry (assq sym table)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2286 (if entry
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2287 (setcdr entry symbol)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2288 (push (cons sym symbol)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2289 (js2-scope-symbol-table scope)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2290
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2291 (defstruct (js2-symbol
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2292 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2293 (:constructor make-js2-symbol (decl-type name &optional ast-node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2294 "A symbol table entry."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2295 ;; One of js2-FUNCTION, js2-LP (for parameters), js2-VAR,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2296 ;; js2-LET, or js2-CONST
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2297 decl-type
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2298 name ; string
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2299 ast-node) ; a `js2-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2300
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2301 (defstruct (js2-error-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2302 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2303 (:constructor nil) ; silence emacs21 byte-compiler
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2304 (:constructor make-js2-error-node (&key (type js2-ERROR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2305 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2306 len)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2307 "AST node representing a parse error.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2308
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2309 (put 'cl-struct-js2-error-node 'js2-visitor 'js2-visit-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2310 (put 'cl-struct-js2-error-node 'js2-printer 'js2-print-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2311
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2312 (defstruct (js2-script-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2313 (:include js2-scope)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2314 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2315 (:constructor make-js2-script-node (&key (type js2-SCRIPT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2316 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2317 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2318 var-decls
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2319 fun-decls)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2320 functions ; lisp list of nested functions
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2321 regexps ; lisp list of (string . flags)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2322 symbols ; alist (every symbol gets unique index)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2323 (param-count 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2324 var-names ; vector of string names
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2325 consts ; bool-vector matching var-decls
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2326 (temp-number 0)) ; for generating temp variables
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2327
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2328 (put 'cl-struct-js2-script-node 'js2-visitor 'js2-visit-block)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2329 (put 'cl-struct-js2-script-node 'js2-printer 'js2-print-script)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2330
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2331 (defun js2-print-script (node indent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2332 (dolist (kid (js2-block-node-kids node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2333 (js2-print-ast kid indent)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2334
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2335 (defstruct (js2-ast-root
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2336 (:include js2-script-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2337 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2338 (:constructor make-js2-ast-root (&key (type js2-SCRIPT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2339 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2340 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2341 buffer)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2342 "The root node of a js2 AST."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2343 buffer ; the source buffer from which the code was parsed
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2344 comments ; a lisp list of comments, ordered by start position
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2345 errors ; a lisp list of errors found during parsing
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2346 warnings ; a lisp list of warnings found during parsing
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2347 node-count) ; number of nodes in the tree, including the root
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2348
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2349 (put 'cl-struct-js2-ast-root 'js2-visitor 'js2-visit-ast-root)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2350 (put 'cl-struct-js2-ast-root 'js2-printer 'js2-print-script)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2351
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2352 (defun js2-visit-ast-root (ast callback)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2353 (dolist (kid (js2-ast-root-kids ast))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2354 (js2-visit-ast kid callback))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2355 (dolist (comment (js2-ast-root-comments ast))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2356 (js2-visit-ast comment callback)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2357
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2358 (defstruct (js2-comment-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2359 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2360 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2361 (:constructor make-js2-comment-node (&key (type js2-COMMENT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2362 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2363 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2364 (format js2-ts-comment-type))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2365 format) ; 'line, 'block, 'jsdoc or 'html
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2366
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2367 (put 'cl-struct-js2-comment-node 'js2-visitor 'js2-visit-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2368 (put 'cl-struct-js2-comment-node 'js2-printer 'js2-print-comment)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2369
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2370 (defun js2-print-comment (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2371 ;; We really ought to link end-of-line comments to their nodes.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2372 ;; Or maybe we could add a new comment type, 'endline.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2373 (insert (js2-make-pad i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2374 (js2-node-string n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2375
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2376 (defstruct (js2-expr-stmt-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2377 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2378 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2379 (:constructor make-js2-expr-stmt-node (&key (type js2-EXPR_VOID)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2380 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2381 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2382 expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2383 "An expression statement."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2384 expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2385
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2386 (defsubst js2-expr-stmt-node-set-has-result (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2387 "Change the node type to `js2-EXPR_RESULT'. Used for code generation."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2388 (setf (js2-node-type node) js2-EXPR_RESULT))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2389
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2390 (put 'cl-struct-js2-expr-stmt-node 'js2-visitor 'js2-visit-expr-stmt-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2391 (put 'cl-struct-js2-expr-stmt-node 'js2-printer 'js2-print-expr-stmt-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2392
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2393 (defun js2-visit-expr-stmt-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2394 (js2-visit-ast (js2-expr-stmt-node-expr n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2395
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2396 (defun js2-print-expr-stmt-node (n indent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2397 (js2-print-ast (js2-expr-stmt-node-expr n) indent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2398 (insert ";\n"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2399
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2400 (defstruct (js2-loop-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2401 (:include js2-scope)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2402 (:constructor nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2403 "Abstract supertype of loop nodes."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2404 body ; a `js2-block-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2405 lp ; position of left-paren, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2406 rp) ; position of right-paren, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2407
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2408 (defstruct (js2-do-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2409 (:include js2-loop-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2410 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2411 (:constructor make-js2-do-node (&key (type js2-DO)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2412 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2413 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2414 body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2415 condition
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2416 while-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2417 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2418 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2419 "AST node for do-loop."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2420 condition ; while (expression)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2421 while-pos) ; buffer position of 'while' keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2422
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2423 (put 'cl-struct-js2-do-node 'js2-visitor 'js2-visit-do-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2424 (put 'cl-struct-js2-do-node 'js2-printer 'js2-print-do-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2425
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2426 (defun js2-visit-do-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2427 (js2-visit-ast (js2-do-node-body n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2428 (js2-visit-ast (js2-do-node-condition n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2429
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2430 (defun js2-print-do-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2431 (let ((pad (js2-make-pad i)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2432 (insert pad "do {\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2433 (dolist (kid (js2-block-node-kids (js2-do-node-body n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2434 (js2-print-ast kid (1+ i)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2435 (insert pad "} while (")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2436 (js2-print-ast (js2-do-node-condition n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2437 (insert ");\n")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2438
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2439 (defstruct (js2-while-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2440 (:include js2-loop-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2441 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2442 (:constructor make-js2-while-node (&key (type js2-WHILE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2443 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2444 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2445 body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2446 condition
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2447 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2448 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2449 "AST node for while-loop."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2450 condition) ; while-condition
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2451
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2452 (put 'cl-struct-js2-while-node 'js2-visitor 'js2-visit-while-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2453 (put 'cl-struct-js2-while-node 'js2-printer 'js2-print-while-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2454
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2455 (defun js2-visit-while-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2456 (js2-visit-ast (js2-while-node-condition n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2457 (js2-visit-ast (js2-while-node-body n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2458
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2459 (defun js2-print-while-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2460 (let ((pad (js2-make-pad i)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2461 (insert pad "while (")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2462 (js2-print-ast (js2-while-node-condition n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2463 (insert ") {\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2464 (js2-print-body (js2-while-node-body n) (1+ i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2465 (insert pad "}\n")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2466
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2467 (defstruct (js2-for-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2468 (:include js2-loop-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2469 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2470 (:constructor make-js2-for-node (&key (type js2-FOR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2471 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2472 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2473 body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2474 init
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2475 condition
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2476 update
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2477 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2478 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2479 "AST node for a C-style for-loop."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2480 init ; initialization expression
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2481 condition ; loop condition
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2482 update) ; update clause
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2483
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2484 (put 'cl-struct-js2-for-node 'js2-visitor 'js2-visit-for-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2485 (put 'cl-struct-js2-for-node 'js2-printer 'js2-print-for-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2486
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2487 (defun js2-visit-for-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2488 (js2-visit-ast (js2-for-node-init n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2489 (js2-visit-ast (js2-for-node-condition n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2490 (js2-visit-ast (js2-for-node-update n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2491 (js2-visit-ast (js2-for-node-body n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2492
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2493 (defun js2-print-for-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2494 (let ((pad (js2-make-pad i)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2495 (insert pad "for (")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2496 (js2-print-ast (js2-for-node-init n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2497 (insert "; ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2498 (js2-print-ast (js2-for-node-condition n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2499 (insert "; ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2500 (js2-print-ast (js2-for-node-update n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2501 (insert ") {\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2502 (js2-print-body (js2-for-node-body n) (1+ i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2503 (insert pad "}\n")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2504
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2505 (defstruct (js2-for-in-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2506 (:include js2-loop-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2507 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2508 (:constructor make-js2-for-in-node (&key (type js2-FOR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2509 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2510 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2511 body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2512 iterator
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2513 object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2514 in-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2515 each-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2516 foreach-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2517 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2518 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2519 "AST node for a for..in loop."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2520 iterator ; [var] foo in ...
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2521 object ; object over which we're iterating
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2522 in-pos ; buffer position of 'in' keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2523 each-pos ; buffer position of 'each' keyword, if foreach-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2524 foreach-p) ; t if it's a for-each loop
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2525
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2526 (put 'cl-struct-js2-for-in-node 'js2-visitor 'js2-visit-for-in-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2527 (put 'cl-struct-js2-for-in-node 'js2-printer 'js2-print-for-in-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2528
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2529 (defun js2-visit-for-in-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2530 (js2-visit-ast (js2-for-in-node-iterator n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2531 (js2-visit-ast (js2-for-in-node-object n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2532 (js2-visit-ast (js2-for-in-node-body n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2533
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2534 (defun js2-print-for-in-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2535 (let ((pad (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2536 (foreach (js2-for-in-node-foreach-p n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2537 (insert pad "for ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2538 (if foreach
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2539 (insert "each "))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2540 (insert "(")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2541 (js2-print-ast (js2-for-in-node-iterator n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2542 (insert " in ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2543 (js2-print-ast (js2-for-in-node-object n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2544 (insert ") {\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2545 (js2-print-body (js2-for-in-node-body n) (1+ i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2546 (insert pad "}\n")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2547
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2548 (defstruct (js2-return-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2549 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2550 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2551 (:constructor make-js2-return-node (&key (type js2-RETURN)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2552 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2553 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2554 retval)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2555 "AST node for a return statement."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2556 retval) ; expression to return, or 'undefined
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2557
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2558 (put 'cl-struct-js2-return-node 'js2-visitor 'js2-visit-return-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2559 (put 'cl-struct-js2-return-node 'js2-printer 'js2-print-return-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2560
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2561 (defun js2-visit-return-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2562 (if (js2-return-node-retval n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2563 (js2-visit-ast (js2-return-node-retval n) v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2564
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2565 (defun js2-print-return-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2566 (insert (js2-make-pad i) "return")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2567 (when (js2-return-node-retval n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2568 (insert " ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2569 (js2-print-ast (js2-return-node-retval n) 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2570 (insert ";\n"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2571
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2572 (defstruct (js2-if-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2573 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2574 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2575 (:constructor make-js2-if-node (&key (type js2-IF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2576 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2577 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2578 condition
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2579 then-part
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2580 else-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2581 else-part
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2582 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2583 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2584 "AST node for an if-statement."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2585 condition ; expression
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2586 then-part ; statement or block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2587 else-pos ; optional buffer position of 'else' keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2588 else-part ; optional statement or block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2589 lp ; position of left-paren, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2590 rp) ; position of right-paren, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2591
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2592 (put 'cl-struct-js2-if-node 'js2-visitor 'js2-visit-if-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2593 (put 'cl-struct-js2-if-node 'js2-printer 'js2-print-if-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2594
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2595 (defun js2-visit-if-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2596 (js2-visit-ast (js2-if-node-condition n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2597 (js2-visit-ast (js2-if-node-then-part n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2598 (if (js2-if-node-else-part n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2599 (js2-visit-ast (js2-if-node-else-part n) v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2600
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2601 (defun js2-print-if-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2602 (let ((pad (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2603 (then-part (js2-if-node-then-part n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2604 (else-part (js2-if-node-else-part n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2605 (insert pad "if (")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2606 (js2-print-ast (js2-if-node-condition n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2607 (insert ") {\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2608 (js2-print-body then-part (1+ i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2609 (insert pad "}")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2610 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2611 ((not else-part)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2612 (insert "\n"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2613 ((js2-if-node-p else-part)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2614 (insert " else ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2615 (js2-print-body else-part i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2616 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2617 (insert " else {\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2618 (js2-print-body else-part (1+ i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2619 (insert pad "}\n")))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2620
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2621 (defstruct (js2-try-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2622 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2623 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2624 (:constructor make-js2-try-node (&key (type js2-TRY)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2625 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2626 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2627 try-block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2628 catch-clauses
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2629 finally-block)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2630 "AST node for a try-statement."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2631 try-block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2632 catch-clauses ; a lisp list of `js2-catch-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2633 finally-block) ; a `js2-finally-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2634
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2635 (put 'cl-struct-js2-try-node 'js2-visitor 'js2-visit-try-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2636 (put 'cl-struct-js2-try-node 'js2-printer 'js2-print-try-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2637
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2638 (defun js2-visit-try-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2639 (js2-visit-ast (js2-try-node-try-block n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2640 (dolist (clause (js2-try-node-catch-clauses n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2641 (js2-visit-ast clause v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2642 (if (js2-try-node-finally-block n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2643 (js2-visit-ast (js2-try-node-finally-block n) v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2644
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2645 (defun js2-print-try-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2646 (let ((pad (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2647 (catches (js2-try-node-catch-clauses n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2648 (finally (js2-try-node-finally-block n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2649 (insert pad "try {\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2650 (js2-print-body (js2-try-node-try-block n) (1+ i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2651 (insert pad "}")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2652 (when catches
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2653 (dolist (catch catches)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2654 (js2-print-ast catch i)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2655 (if finally
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2656 (js2-print-ast finally i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2657 (insert "\n"))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2658
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2659 (defstruct (js2-catch-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2660 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2661 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2662 (:constructor make-js2-catch-node (&key (type js2-CATCH)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2663 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2664 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2665 var-name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2666 guard-kwd
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2667 guard-expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2668 block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2669 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2670 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2671 "AST node for a catch clause."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2672 var-name ; a `js2-name-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2673 guard-kwd ; relative buffer position of "if" in "catch (x if ...)"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2674 guard-expr ; catch condition, a `js2-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2675 block ; statements, a `js2-block-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2676 lp ; buffer position of left-paren, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2677 rp) ; buffer position of right-paren, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2678
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2679 (put 'cl-struct-js2-catch-node 'js2-visitor 'js2-visit-catch-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2680 (put 'cl-struct-js2-catch-node 'js2-printer 'js2-print-catch-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2681
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2682 (defun js2-visit-catch-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2683 (js2-visit-ast (js2-catch-node-var-name n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2684 (when (js2-catch-node-guard-kwd n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2685 (js2-visit-ast (js2-catch-node-guard-expr n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2686 (js2-visit-ast (js2-catch-node-block n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2687
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2688 (defun js2-print-catch-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2689 (let ((pad (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2690 (guard-kwd (js2-catch-node-guard-kwd n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2691 (guard-expr (js2-catch-node-guard-expr n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2692 (insert " catch (")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2693 (js2-print-ast (js2-catch-node-var-name n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2694 (when guard-kwd
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2695 (insert " if ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2696 (js2-print-ast guard-expr 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2697 (insert ") {\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2698 (js2-print-body (js2-catch-node-block n) (1+ i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2699 (insert pad "}")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2700
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2701 (defstruct (js2-finally-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2702 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2703 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2704 (:constructor make-js2-finally-node (&key (type js2-FINALLY)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2705 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2706 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2707 body)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2708 "AST node for a finally clause."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2709 body) ; a `js2-node', often but not always a block node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2710
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2711 (put 'cl-struct-js2-finally-node 'js2-visitor 'js2-visit-finally-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2712 (put 'cl-struct-js2-finally-node 'js2-printer 'js2-print-finally-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2713
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2714 (defun js2-visit-finally-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2715 (js2-visit-ast (js2-finally-node-body n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2716
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2717 (defun js2-print-finally-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2718 (let ((pad (js2-make-pad i)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2719 (insert " finally {\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2720 (js2-print-body (js2-finally-node-body n) (1+ i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2721 (insert pad "}\n")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2722
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2723 (defstruct (js2-switch-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2724 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2725 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2726 (:constructor make-js2-switch-node (&key (type js2-SWITCH)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2727 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2728 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2729 discriminant
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2730 cases
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2731 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2732 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2733 "AST node for a switch statement."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2734 discriminant ; a `js2-node' (switch expression)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2735 cases ; a lisp list of `js2-case-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2736 lp ; position of open-paren for discriminant, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2737 rp) ; position of close-paren for discriminant, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2738
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2739 (put 'cl-struct-js2-switch-node 'js2-visitor 'js2-visit-switch-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2740 (put 'cl-struct-js2-switch-node 'js2-printer 'js2-print-switch-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2741
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2742 (defun js2-visit-switch-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2743 (js2-visit-ast (js2-switch-node-discriminant n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2744 (dolist (c (js2-switch-node-cases n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2745 (js2-visit-ast c v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2746
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2747 (defun js2-print-switch-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2748 (let ((pad (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2749 (cases (js2-switch-node-cases n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2750 (insert pad "switch (")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2751 (js2-print-ast (js2-switch-node-discriminant n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2752 (insert ") {\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2753 (dolist (case cases)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2754 (js2-print-ast case i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2755 (insert pad "}\n")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2756
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2757 (defstruct (js2-case-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2758 (:include js2-block-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2759 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2760 (:constructor make-js2-case-node (&key (type js2-CASE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2761 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2762 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2763 kids
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2764 expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2765 "AST node for a case clause of a switch statement."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2766 expr) ; the case expression (nil for default)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2767
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2768 (put 'cl-struct-js2-case-node 'js2-visitor 'js2-visit-case-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2769 (put 'cl-struct-js2-case-node 'js2-printer 'js2-print-case-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2770
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2771 (defun js2-visit-case-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2772 (if (js2-case-node-expr n) ; nil for default: case
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2773 (js2-visit-ast (js2-case-node-expr n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2774 (js2-visit-block n v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2775
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2776 (defun js2-print-case-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2777 (let ((pad (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2778 (expr (js2-case-node-expr n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2779 (insert pad)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2780 (if (null expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2781 (insert "default:\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2782 (insert "case ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2783 (js2-print-ast expr 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2784 (insert ":\n"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2785 (dolist (kid (js2-case-node-kids n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2786 (js2-print-ast kid (1+ i)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2787
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2788 (defstruct (js2-throw-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2789 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2790 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2791 (:constructor make-js2-throw-node (&key (type js2-THROW)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2792 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2793 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2794 expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2795 "AST node for a throw statement."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2796 expr) ; the expression to throw
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2797
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2798 (put 'cl-struct-js2-throw-node 'js2-visitor 'js2-visit-throw-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2799 (put 'cl-struct-js2-throw-node 'js2-printer 'js2-print-throw-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2800
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2801 (defun js2-visit-throw-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2802 (js2-visit-ast (js2-throw-node-expr n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2803
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2804 (defun js2-print-throw-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2805 (insert (js2-make-pad i) "throw ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2806 (js2-print-ast (js2-throw-node-expr n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2807 (insert ";\n"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2808
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2809 (defstruct (js2-with-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2810 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2811 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2812 (:constructor make-js2-with-node (&key (type js2-WITH)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2813 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2814 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2815 object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2816 body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2817 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2818 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2819 "AST node for a with-statement."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2820 object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2821 body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2822 lp ; buffer position of left-paren around object, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2823 rp) ; buffer position of right-paren around object, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2824
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2825 (put 'cl-struct-js2-with-node 'js2-visitor 'js2-visit-with-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2826 (put 'cl-struct-js2-with-node 'js2-printer 'js2-print-with-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2827
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2828 (defun js2-visit-with-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2829 (js2-visit-ast (js2-with-node-object n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2830 (js2-visit-ast (js2-with-node-body n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2831
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2832 (defun js2-print-with-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2833 (let ((pad (js2-make-pad i)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2834 (insert pad "with (")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2835 (js2-print-ast (js2-with-node-object n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2836 (insert ") {\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2837 (js2-print-body (js2-with-node-body n) (1+ i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2838 (insert pad "}\n")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2839
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2840 (defstruct (js2-label-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2841 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2842 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2843 (:constructor make-js2-label-node (&key (type js2-LABEL)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2844 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2845 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2846 name)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2847 "AST node for a statement label or case label."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2848 name ; a string
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2849 loop) ; for validating and code-generating continue-to-label
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2850
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2851 (put 'cl-struct-js2-label-node 'js2-visitor 'js2-visit-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2852 (put 'cl-struct-js2-label-node 'js2-printer 'js2-print-label)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2853
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2854 (defun js2-print-label (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2855 (insert (js2-make-pad i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2856 (js2-label-node-name n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2857 ":\n"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2858
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2859 (defstruct (js2-labeled-stmt-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2860 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2861 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2862 ;; type needs to be in `js2-side-effecting-tokens' to avoid spurious
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2863 ;; no-side-effects warnings, hence js2-EXPR_RESULT.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2864 (:constructor make-js2-labeled-stmt-node (&key (type js2-EXPR_RESULT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2865 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2866 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2867 labels
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2868 stmt)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2869 "AST node for a statement with one or more labels.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2870 Multiple labels for a statement are collapsed into the labels field."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2871 labels ; lisp list of `js2-label-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2872 stmt) ; the statement these labels are for
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2873
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2874 (put 'cl-struct-js2-labeled-stmt-node 'js2-visitor 'js2-visit-labeled-stmt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2875 (put 'cl-struct-js2-labeled-stmt-node 'js2-printer 'js2-print-labeled-stmt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2876
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2877 (defun js2-get-label-by-name (lbl-stmt name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2878 "Return a `js2-label-node' by NAME from LBL-STMT's labels list.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2879 Returns nil if no such label is in the list."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2880 (let ((label-list (js2-labeled-stmt-node-labels lbl-stmt))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2881 result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2882 (while (and label-list (not result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2883 (if (string= (js2-label-node-name (car label-list)) name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2884 (setq result (car label-list))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2885 (setq label-list (cdr label-list))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2886 result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2887
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2888 (defun js2-visit-labeled-stmt (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2889 (dolist (label (js2-labeled-stmt-node-labels n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2890 (js2-visit-ast label v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2891 (js2-visit-ast (js2-labeled-stmt-node-stmt n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2892
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2893 (defun js2-print-labeled-stmt (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2894 (dolist (label (js2-labeled-stmt-node-labels n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2895 (js2-print-ast label i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2896 (js2-print-ast (js2-labeled-stmt-node-stmt n) (1+ i)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2897
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2898 (defun js2-labeled-stmt-node-contains (node label)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2899 "Return t if NODE contains LABEL in its label set.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2900 NODE is a `js2-labels-node'. LABEL is an identifier."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2901 (loop for nl in (js2-labeled-stmt-node-labels node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2902 if (string= label (js2-label-node-name nl))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2903 return t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2904 finally return nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2905
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2906 (defsubst js2-labeled-stmt-node-add-label (node label)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2907 "Add a `js2-label-node' to the label set for this statement."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2908 (setf (js2-labeled-stmt-node-labels node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2909 (nconc (js2-labeled-stmt-node-labels node) (list label))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2910
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2911 (defstruct (js2-jump-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2912 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2913 (:constructor nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2914 "Abstract supertype of break and continue nodes."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2915 label ; `js2-name-node' for location of label identifier, if present
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2916 target) ; target js2-labels-node or loop/switch statement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2917
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2918 (defun js2-visit-jump-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2919 ;; we don't visit the target, since it's a back-link
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2920 (if (js2-jump-node-label n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2921 (js2-visit-ast (js2-jump-node-label n) v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2922
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2923 (defstruct (js2-break-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2924 (:include js2-jump-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2925 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2926 (:constructor make-js2-break-node (&key (type js2-BREAK)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2927 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2928 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2929 label
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2930 target)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2931 "AST node for a break statement.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2932 The label field is a `js2-name-node', possibly nil, for the named label
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2933 if provided. E.g. in 'break foo', it represents 'foo'. The target field
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2934 is the target of the break - a label node or enclosing loop/switch statement.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2935
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2936 (put 'cl-struct-js2-break-node 'js2-visitor 'js2-visit-jump-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2937 (put 'cl-struct-js2-break-node 'js2-printer 'js2-print-break-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2938
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2939 (defun js2-print-break-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2940 (insert (js2-make-pad i) "break")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2941 (when (js2-break-node-label n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2942 (insert " ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2943 (js2-print-ast (js2-break-node-label n) 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2944 (insert ";\n"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2945
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2946 (defstruct (js2-continue-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2947 (:include js2-jump-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2948 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2949 (:constructor make-js2-continue-node (&key (type js2-CONTINUE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2950 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2951 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2952 label
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2953 target)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2954 "AST node for a continue statement.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2955 The label field is the user-supplied enclosing label name, a `js2-name-node'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2956 It is nil if continue specifies no label. The target field is the jump target:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2957 a `js2-label-node' or the innermost enclosing loop.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2958
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2959 (put 'cl-struct-js2-continue-node 'js2-visitor 'js2-visit-jump-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2960 (put 'cl-struct-js2-continue-node 'js2-printer 'js2-print-continue-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2961
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2962 (defun js2-print-continue-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2963 (insert (js2-make-pad i) "continue")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2964 (when (js2-continue-node-label n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2965 (insert " ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2966 (js2-print-ast (js2-continue-node-label n) 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2967 (insert ";\n"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2968
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2969 (defstruct (js2-function-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2970 (:include js2-script-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2971 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2972 (:constructor make-js2-function-node (&key (type js2-FUNCTION)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2973 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2974 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2975 (ftype 'FUNCTION)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2976 (form 'FUNCTION_STATEMENT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2977 (name "")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2978 params
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2979 body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2980 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2981 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2982 "AST node for a function declaration.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2983 The `params' field is a lisp list of nodes. Each node is either a simple
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2984 `js2-name-node', or if it's a destructuring-assignment parameter, a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2985 `js2-array-node' or `js2-object-node'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2986 ftype ; FUNCTION, GETTER or SETTER
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2987 form ; FUNCTION_{STATEMENT|EXPRESSION|EXPRESSION_STATEMENT}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2988 name ; function name (a `js2-name-node', or nil if anonymous)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2989 params ; a lisp list of destructuring forms or simple name nodes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2990 body ; a `js2-block-node' or expression node (1.8 only)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2991 lp ; position of arg-list open-paren, or nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2992 rp ; position of arg-list close-paren, or nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2993 ignore-dynamic ; ignore value of the dynamic-scope flag (interpreter only)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2994 needs-activation ; t if we need an activation object for this frame
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2995 is-generator ; t if this function contains a yield
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2996 member-expr) ; nonstandard Ecma extension from Rhino
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2997
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2998 (put 'cl-struct-js2-function-node 'js2-visitor 'js2-visit-function-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
2999 (put 'cl-struct-js2-function-node 'js2-printer 'js2-print-function-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3000
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3001 (defun js2-visit-function-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3002 (if (js2-function-node-name n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3003 (js2-visit-ast (js2-function-node-name n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3004 (dolist (p (js2-function-node-params n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3005 (js2-visit-ast p v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3006 (js2-visit-ast (js2-function-node-body n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3007
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3008 (defun js2-print-function-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3009 (let ((pad (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3010 (getter (js2-node-get-prop n 'GETTER_SETTER))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3011 (name (js2-function-node-name n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3012 (params (js2-function-node-params n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3013 (body (js2-function-node-body n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3014 (expr (eq (js2-function-node-form n) 'FUNCTION_EXPRESSION)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3015 (unless getter
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3016 (insert pad "function"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3017 (when name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3018 (insert " ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3019 (js2-print-ast name 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3020 (insert "(")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3021 (loop with len = (length params)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3022 for param in params
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3023 for count from 1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3024 do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3025 (js2-print-ast param 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3026 (if (< count len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3027 (insert ", ")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3028 (insert ") {")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3029 (unless expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3030 (insert "\n"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3031 ;; TODO: fix this to be smarter about indenting, etc.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3032 (js2-print-body body (1+ i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3033 (insert pad "}")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3034 (unless expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3035 (insert "\n"))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3036
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3037 (defsubst js2-function-name (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3038 "Return function name for NODE, a `js2-function-node', or nil if anonymous."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3039 (and (js2-function-node-name node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3040 (js2-name-node-name (js2-function-node-name node))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3041
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3042 ;; Having this be an expression node makes it more flexible.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3043 ;; There are IDE contexts, such as indentation in a for-loop initializer,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3044 ;; that work better if you assume it's an expression. Whenever we have
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3045 ;; a standalone var/const declaration, we just wrap with an expr stmt.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3046 ;; Eclipse apparently screwed this up and now has two versions, expr and stmt.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3047 (defstruct (js2-var-decl-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3048 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3049 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3050 (:constructor make-js2-var-decl-node (&key (type js2-VAR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3051 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3052 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3053 kids
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3054 decl-type)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3055 "AST node for a variable declaration list (VAR, CONST or LET).
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3056 The node bounds differ depending on the declaration type. For VAR or
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3057 CONST declarations, the bounds include the var/const keyword. For LET
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3058 declarations, the node begins at the position of the first child."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3059 kids ; a lisp list of `js2-var-init-node' structs.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3060 decl-type) ; js2-VAR, js2-CONST or js2-LET
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3061
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3062 (put 'cl-struct-js2-var-decl-node 'js2-visitor 'js2-visit-var-decl)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3063 (put 'cl-struct-js2-var-decl-node 'js2-printer 'js2-print-var-decl)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3064
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3065 (defun js2-visit-var-decl (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3066 (dolist (kid (js2-var-decl-node-kids n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3067 (js2-visit-ast kid v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3068
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3069 (defun js2-print-var-decl (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3070 (let ((pad (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3071 (tt (js2-var-decl-node-decl-type n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3072 (insert pad)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3073 (insert (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3074 ((= tt js2-VAR) "var ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3075 ((= tt js2-LET) "") ; handled by parent let-{expr/stmt}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3076 ((= tt js2-CONST) "const ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3077 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3078 (error "malformed var-decl node"))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3079 (loop with kids = (js2-var-decl-node-kids n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3080 with len = (length kids)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3081 for kid in kids
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3082 for count from 1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3083 do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3084 (js2-print-ast kid 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3085 (if (< count len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3086 (insert ", ")))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3087
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3088 (defstruct (js2-var-init-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3089 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3090 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3091 (:constructor make-js2-var-init-node (&key (type js2-VAR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3092 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3093 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3094 target
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3095 initializer)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3096 "AST node for a variable declaration.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3097 The type field will be js2-CONST for a const decl."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3098 target ; `js2-name-node', `js2-object-node', or `js2-array-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3099 initializer) ; initializer expression, a `js2-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3100
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3101 (put 'cl-struct-js2-var-init-node 'js2-visitor 'js2-visit-var-init-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3102 (put 'cl-struct-js2-var-init-node 'js2-printer 'js2-print-var-init-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3103
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3104 (defun js2-visit-var-init-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3105 (js2-visit-ast (js2-var-init-node-target n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3106 (if (js2-var-init-node-initializer n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3107 (js2-visit-ast (js2-var-init-node-initializer n) v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3108
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3109 (defun js2-print-var-init-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3110 (let ((pad (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3111 (name (js2-var-init-node-target n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3112 (init (js2-var-init-node-initializer n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3113 (insert pad)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3114 (js2-print-ast name 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3115 (when init
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3116 (insert " = ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3117 (js2-print-ast init 0))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3118
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3119 (defstruct (js2-cond-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3120 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3121 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3122 (:constructor make-js2-cond-node (&key (type js2-HOOK)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3123 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3124 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3125 test-expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3126 true-expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3127 false-expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3128 q-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3129 c-pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3130 "AST node for the ternary operator"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3131 test-expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3132 true-expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3133 false-expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3134 q-pos ; buffer position of ?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3135 c-pos) ; buffer position of :
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3136
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3137 (put 'cl-struct-js2-cond-node 'js2-visitor 'js2-visit-cond-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3138 (put 'cl-struct-js2-cond-node 'js2-printer 'js2-print-cond-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3139
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3140 (defun js2-visit-cond-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3141 (js2-visit-ast (js2-cond-node-test-expr n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3142 (js2-visit-ast (js2-cond-node-true-expr n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3143 (js2-visit-ast (js2-cond-node-false-expr n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3144
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3145 (defun js2-print-cond-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3146 (let ((pad (js2-make-pad i)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3147 (insert pad)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3148 (js2-print-ast (js2-cond-node-test-expr n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3149 (insert " ? ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3150 (js2-print-ast (js2-cond-node-true-expr n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3151 (insert " : ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3152 (js2-print-ast (js2-cond-node-false-expr n) 0)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3153
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3154 (defstruct (js2-infix-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3155 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3156 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3157 (:constructor make-js2-infix-node (&key type
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3158 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3159 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3160 op-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3161 left
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3162 right)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3163 "Represents infix expressions.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3164 Includes assignment ops like `|=', and the comma operator.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3165 The type field inherited from `js2-node' holds the operator."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3166 op-pos ; buffer position where operator begins
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3167 left ; any `js2-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3168 right) ; any `js2-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3169
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3170 (put 'cl-struct-js2-infix-node 'js2-visitor 'js2-visit-infix-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3171 (put 'cl-struct-js2-infix-node 'js2-printer 'js2-print-infix-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3172
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3173 (defun js2-visit-infix-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3174 (when (js2-infix-node-left n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3175 (js2-visit-ast (js2-infix-node-left n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3176 (when (js2-infix-node-right n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3177 (js2-visit-ast (js2-infix-node-right n) v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3178
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3179 (defconst js2-operator-tokens
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3180 (let ((table (make-hash-table :test 'eq))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3181 (tokens
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3182 (list (cons js2-IN "in")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3183 (cons js2-TYPEOF "typeof")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3184 (cons js2-INSTANCEOF "instanceof")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3185 (cons js2-DELPROP "delete")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3186 (cons js2-COMMA ",")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3187 (cons js2-COLON ":")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3188 (cons js2-OR "||")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3189 (cons js2-AND "&&")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3190 (cons js2-INC "++")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3191 (cons js2-DEC "--")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3192 (cons js2-BITOR "|")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3193 (cons js2-BITXOR "^")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3194 (cons js2-BITAND "&")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3195 (cons js2-EQ "==")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3196 (cons js2-NE "!=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3197 (cons js2-LT "<")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3198 (cons js2-LE "<=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3199 (cons js2-GT ">")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3200 (cons js2-GE ">=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3201 (cons js2-LSH "<<")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3202 (cons js2-RSH ">>")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3203 (cons js2-URSH ">>>")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3204 (cons js2-ADD "+") ; infix plus
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3205 (cons js2-SUB "-") ; infix minus
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3206 (cons js2-MUL "*")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3207 (cons js2-DIV "/")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3208 (cons js2-MOD "%")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3209 (cons js2-NOT "!")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3210 (cons js2-BITNOT "~")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3211 (cons js2-POS "+") ; unary plus
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3212 (cons js2-NEG "-") ; unary minus
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3213 (cons js2-SHEQ "===") ; shallow equality
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3214 (cons js2-SHNE "!==") ; shallow inequality
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3215 (cons js2-ASSIGN "=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3216 (cons js2-ASSIGN_BITOR "|=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3217 (cons js2-ASSIGN_BITXOR "^=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3218 (cons js2-ASSIGN_BITAND "&=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3219 (cons js2-ASSIGN_LSH "<<=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3220 (cons js2-ASSIGN_RSH ">>=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3221 (cons js2-ASSIGN_URSH ">>>=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3222 (cons js2-ASSIGN_ADD "+=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3223 (cons js2-ASSIGN_SUB "-=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3224 (cons js2-ASSIGN_MUL "*=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3225 (cons js2-ASSIGN_DIV "/=")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3226 (cons js2-ASSIGN_MOD "%="))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3227 (loop for (k . v) in tokens do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3228 (puthash k v table))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3229 table))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3230
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3231 (defun js2-print-infix-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3232 (let* ((tt (js2-node-type n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3233 (op (gethash tt js2-operator-tokens)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3234 (unless op
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3235 (error "unrecognized infix operator %s" (js2-node-type n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3236 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3237 (js2-print-ast (js2-infix-node-left n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3238 (unless (= tt js2-COMMA)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3239 (insert " "))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3240 (insert op)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3241 (insert " ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3242 (js2-print-ast (js2-infix-node-right n) 0)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3243
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3244 (defstruct (js2-assign-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3245 (:include js2-infix-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3246 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3247 (:constructor make-js2-assign-node (&key type
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3248 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3249 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3250 op-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3251 left
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3252 right)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3253 "Represents any assignment.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3254 The type field holds the actual assignment operator.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3255
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3256 (put 'cl-struct-js2-assign-node 'js2-visitor 'js2-visit-infix-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3257 (put 'cl-struct-js2-assign-node 'js2-printer 'js2-print-infix-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3258
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3259 (defstruct (js2-unary-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3260 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3261 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3262 (:constructor make-js2-unary-node (&key type ; required
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3263 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3264 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3265 operand)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3266 "AST node type for unary operator nodes.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3267 The type field can be NOT, BITNOT, POS, NEG, INC, DEC,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3268 TYPEOF, or DELPROP. For INC or DEC, a 'postfix node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3269 property is added if the operator follows the operand."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3270 operand) ; a `js2-node' expression
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3271
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3272 (put 'cl-struct-js2-unary-node 'js2-visitor 'js2-visit-unary-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3273 (put 'cl-struct-js2-unary-node 'js2-printer 'js2-print-unary-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3274
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3275 (defun js2-visit-unary-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3276 (js2-visit-ast (js2-unary-node-operand n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3277
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3278 (defun js2-print-unary-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3279 (let* ((tt (js2-node-type n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3280 (op (gethash tt js2-operator-tokens))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3281 (postfix (js2-node-get-prop n 'postfix)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3282 (unless op
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3283 (error "unrecognized unary operator %s" tt))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3284 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3285 (unless postfix
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3286 (insert op))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3287 (if (or (= tt js2-TYPEOF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3288 (= tt js2-DELPROP))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3289 (insert " "))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3290 (js2-print-ast (js2-unary-node-operand n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3291 (when postfix
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3292 (insert op))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3293
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3294 (defstruct (js2-let-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3295 (:include js2-scope)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3296 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3297 (:constructor make-js2-let-node (&key (type js2-LETEXPR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3298 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3299 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3300 vars
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3301 body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3302 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3303 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3304 "AST node for a let expression or a let statement.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3305 Note that a let declaration such as let x=6, y=7 is a `js2-var-decl-node'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3306 vars ; a `js2-var-decl-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3307 body ; a `js2-node' representing the expression or body block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3308 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3309 rp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3310
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3311 (put 'cl-struct-js2-let-node 'js2-visitor 'js2-visit-let-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3312 (put 'cl-struct-js2-let-node 'js2-printer 'js2-print-let-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3313
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3314 (defun js2-visit-let-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3315 (when (js2-let-node-vars n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3316 (js2-visit-ast (js2-let-node-vars n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3317 (when (js2-let-node-body n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3318 (js2-visit-ast (js2-let-node-body n) v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3319
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3320 (defun js2-print-let-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3321 (insert (js2-make-pad i) "let (")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3322 (js2-print-ast (js2-let-node-vars n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3323 (insert ") ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3324 (js2-print-ast (js2-let-node-body n) i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3325
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3326 (defstruct (js2-keyword-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3327 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3328 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3329 (:constructor make-js2-keyword-node (&key type
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3330 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3331 (len (- js2-ts-cursor pos)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3332 "AST node representing a literal keyword such as `null'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3333 Used for `null', `this', `true', `false' and `debugger'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3334 The node type is set to js2-NULL, js2-THIS, etc.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3335
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3336 (put 'cl-struct-js2-keyword-node 'js2-visitor 'js2-visit-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3337 (put 'cl-struct-js2-keyword-node 'js2-printer 'js2-print-keyword-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3338
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3339 (defun js2-print-keyword-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3340 (insert (js2-make-pad i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3341 (let ((tt (js2-node-type n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3342 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3343 ((= tt 'js2-THIS) "this")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3344 ((= tt 'js2-NULL) "null")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3345 ((= tt 'js2-TRUE) "true")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3346 ((= tt 'js2-FALSE) "false")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3347 ((= tt 'js2-DEBUGGER) "debugger")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3348 (t (error "Invalid keyword literal type: %d" tt))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3349
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3350 (defsubst js2-this-node-p (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3351 "Return t if this node is a `js2-literal-node' of type js2-THIS."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3352 (eq (js2-node-type node) js2-THIS))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3353
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3354 (defstruct (js2-new-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3355 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3356 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3357 (:constructor make-js2-new-node (&key (type js2-NEW)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3358 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3359 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3360 target
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3361 args
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3362 initializer
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3363 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3364 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3365 "AST node for new-expression such as new Foo()."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3366 target ; an identifier or reference
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3367 args ; a lisp list of argument nodes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3368 lp ; position of left-paren, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3369 rp ; position of right-paren, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3370 initializer) ; experimental Rhino syntax: optional `js2-object-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3371
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3372 (put 'cl-struct-js2-new-node 'js2-visitor 'js2-visit-new-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3373 (put 'cl-struct-js2-new-node 'js2-printer 'js2-print-new-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3374
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3375 (defun js2-visit-new-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3376 (js2-visit-ast (js2-new-node-target n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3377 (dolist (arg (js2-new-node-args n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3378 (js2-visit-ast arg v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3379 (when (js2-new-node-initializer n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3380 (js2-visit-ast (js2-new-node-initializer n) v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3381
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3382 (defun js2-print-new-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3383 (insert (js2-make-pad i) "new ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3384 (js2-print-ast (js2-new-node-target n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3385 (insert "(")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3386 (js2-print-list (js2-new-node-args n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3387 (insert ")")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3388 (when (js2-new-node-initializer n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3389 (insert " ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3390 (js2-print-ast (js2-new-node-initializer n))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3391
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3392 (defstruct (js2-name-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3393 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3394 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3395 (:constructor make-js2-name-node (&key (type js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3396 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3397 (len (- js2-ts-cursor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3398 js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3399 (name js2-ts-string))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3400 "AST node for a JavaScript identifier"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3401 name ; a string
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3402 scope) ; a `js2-scope' (optional, used for codegen)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3403
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3404 (put 'cl-struct-js2-name-node 'js2-visitor 'js2-visit-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3405 (put 'cl-struct-js2-name-node 'js2-printer 'js2-print-name-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3406
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3407 (defun js2-print-name-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3408 (insert (js2-make-pad i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3409 (js2-name-node-name n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3410
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3411 (defsubst js2-name-node-length (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3412 "Return identifier length of NODE, a `js2-name-node'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3413 Returns 0 if NODE is nil or its identifier field is nil."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3414 (if node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3415 (length (js2-name-node-name node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3416 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3417
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3418 (defstruct (js2-number-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3419 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3420 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3421 (:constructor make-js2-number-node (&key (type js2-NUMBER)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3422 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3423 (len (- js2-ts-cursor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3424 js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3425 (value js2-ts-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3426 (num-value js2-ts-number))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3427 "AST node for a number literal."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3428 value ; the original string, e.g. "6.02e23"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3429 num-value) ; the parsed number value
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3430
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3431 (put 'cl-struct-js2-number-node 'js2-visitor 'js2-visit-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3432 (put 'cl-struct-js2-number-node 'js2-printer 'js2-print-number-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3433
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3434 (defun js2-print-number-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3435 (insert (js2-make-pad i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3436 (number-to-string (js2-number-node-value n))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3437
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3438 (defstruct (js2-regexp-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3439 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3440 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3441 (:constructor make-js2-regexp-node (&key (type js2-REGEXP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3442 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3443 (len (- js2-ts-cursor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3444 js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3445 value
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3446 flags)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3447 "AST node for a regular expression literal."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3448 value ; the regexp string, without // delimiters
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3449 flags) ; a string of flags, e.g. `mi'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3450
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3451 (put 'cl-struct-js2-regexp-node 'js2-visitor 'js2-visit-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3452 (put 'cl-struct-js2-regexp-node 'js2-printer 'js2-print-regexp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3453
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3454 (defun js2-print-regexp (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3455 (insert (js2-make-pad i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3456 "/"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3457 (js2-regexp-node-value n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3458 "/")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3459 (if (js2-regexp-node-flags n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3460 (insert (js2-regexp-node-flags n))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3461
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3462 (defstruct (js2-string-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3463 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3464 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3465 (:constructor make-js2-string-node (&key (type js2-STRING)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3466 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3467 (len (- js2-ts-cursor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3468 js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3469 (value js2-ts-string))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3470 "String literal.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3471 Escape characters are not evaluated; e.g. \n is 2 chars in value field.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3472 You can tell the quote type by looking at the first character."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3473 value) ; the characters of the string, including the quotes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3474
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3475 (put 'cl-struct-js2-string-node 'js2-visitor 'js2-visit-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3476 (put 'cl-struct-js2-string-node 'js2-printer 'js2-print-string-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3477
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3478 (defun js2-print-string-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3479 (insert (js2-make-pad i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3480 (js2-node-string n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3481
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3482 (defstruct (js2-array-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3483 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3484 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3485 (:constructor make-js2-array-node (&key (type js2-ARRAYLIT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3486 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3487 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3488 elems)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3489 "AST node for an array literal."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3490 elems) ; list of expressions. [foo,,bar] yields a nil middle element.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3491
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3492 (put 'cl-struct-js2-array-node 'js2-visitor 'js2-visit-array-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3493 (put 'cl-struct-js2-array-node 'js2-printer 'js2-print-array-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3494
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3495 (defun js2-visit-array-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3496 (dolist (e (js2-array-node-elems n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3497 (when e ; can be nil, e.g. [a, ,b]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3498 (js2-visit-ast e v))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3499
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3500 (defun js2-print-array-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3501 (insert (js2-make-pad i) "[")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3502 (js2-print-list (js2-array-node-elems n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3503 (insert "]"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3504
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3505 (defstruct (js2-object-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3506 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3507 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3508 (:constructor make-js2-object-node (&key (type js2-OBJECTLIT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3509 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3510 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3511 elems)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3512 "AST node for an object literal expression."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3513 elems) ; a lisp list of `js2-object-prop-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3514
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3515 (put 'cl-struct-js2-object-node 'js2-visitor 'js2-visit-object-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3516 (put 'cl-struct-js2-object-node 'js2-printer 'js2-print-object-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3517
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3518 (defun js2-visit-object-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3519 (dolist (e (js2-object-node-elems n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3520 (js2-visit-ast e v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3521
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3522 (defun js2-print-object-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3523 (insert (js2-make-pad i) "{")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3524 (js2-print-list (js2-object-node-elems n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3525 (insert "}"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3526
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3527 (defstruct (js2-object-prop-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3528 (:include js2-infix-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3529 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3530 (:constructor make-js2-object-prop-node (&key (type js2-COLON)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3531 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3532 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3533 left
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3534 right
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3535 op-pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3536 "AST node for an object literal prop:value entry.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3537 The `left' field is the property: a name node, string node or number node.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3538 The `right' field is a `js2-node' representing the initializer value.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3539
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3540 (put 'cl-struct-js2-object-prop-node 'js2-visitor 'js2-visit-infix-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3541 (put 'cl-struct-js2-object-prop-node 'js2-printer 'js2-print-object-prop-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3542
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3543 (defun js2-print-object-prop-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3544 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3545 (js2-print-ast (js2-object-prop-node-left n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3546 (insert ":")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3547 (js2-print-ast (js2-object-prop-node-right n) 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3548
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3549 (defstruct (js2-getter-setter-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3550 (:include js2-infix-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3551 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3552 (:constructor make-js2-getter-setter-node (&key type ; GET or SET
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3553 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3554 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3555 left
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3556 right)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3557 "AST node for a getter/setter property in an object literal.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3558 The `left' field is the `js2-name-node' naming the getter/setter prop.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3559 The `right' field is always an anonymous `js2-function-node' with a node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3560 property `GETTER_SETTER' set to js2-GET or js2-SET. ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3561
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3562 (put 'cl-struct-js2-getter-setter-node 'js2-visitor 'js2-visit-infix-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3563 (put 'cl-struct-js2-getter-setter-node 'js2-printer 'js2-print-getter-setter)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3564
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3565 (defun js2-print-getter-setter (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3566 (let ((pad (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3567 (left (js2-getter-setter-node-left n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3568 (right (js2-getter-setter-node-right n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3569 (insert pad)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3570 (insert (if (= (js2-node-type n) js2-GET) "get " "set "))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3571 (js2-print-ast left 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3572 (js2-print-ast right 0)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3573
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3574 (defstruct (js2-prop-get-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3575 (:include js2-infix-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3576 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3577 (:constructor make-js2-prop-get-node (&key (type js2-GETPROP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3578 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3579 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3580 left
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3581 right)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3582 "AST node for a dotted property reference, e.g. foo.bar or foo().bar")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3583
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3584 (put 'cl-struct-js2-prop-get-node 'js2-visitor 'js2-visit-prop-get-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3585 (put 'cl-struct-js2-prop-get-node 'js2-printer 'js2-print-prop-get-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3586
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3587 (defun js2-visit-prop-get-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3588 (when (js2-prop-get-node-left n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3589 (js2-visit-ast (js2-prop-get-node-left n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3590 (when (js2-prop-get-node-right n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3591 (js2-visit-ast (js2-prop-get-node-right n) v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3592
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3593 (defun js2-print-prop-get-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3594 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3595 (js2-print-ast (js2-prop-get-node-left n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3596 (insert ".")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3597 (js2-print-ast (js2-prop-get-node-right n) 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3598
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3599 (defstruct (js2-elem-get-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3600 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3601 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3602 (:constructor make-js2-elem-get-node (&key (type js2-GETELEM)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3603 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3604 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3605 target
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3606 element
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3607 lb
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3608 rb)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3609 "AST node for an array index expression such as foo[bar]."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3610 target ; a `js2-node' - the expression preceding the "."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3611 element ; a `js2-node' - the expression in brackets
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3612 lb ; position of left-bracket, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3613 rb) ; position of right-bracket, nil if omitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3614
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3615 (put 'cl-struct-js2-elem-get-node 'js2-visitor 'js2-visit-elem-get-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3616 (put 'cl-struct-js2-elem-get-node 'js2-printer 'js2-print-elem-get-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3617
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3618 (defun js2-visit-elem-get-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3619 (when (js2-elem-get-node-target n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3620 (js2-visit-ast (js2-elem-get-node-target n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3621 (when (js2-elem-get-node-element n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3622 (js2-visit-ast (js2-elem-get-node-element n) v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3623
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3624 (defun js2-print-elem-get-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3625 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3626 (js2-print-ast (js2-elem-get-node-target n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3627 (insert "[")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3628 (js2-print-ast (js2-elem-get-node-element n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3629 (insert "]"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3630
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3631 (defstruct (js2-call-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3632 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3633 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3634 (:constructor make-js2-call-node (&key (type js2-CALL)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3635 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3636 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3637 target
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3638 args
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3639 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3640 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3641 "AST node for a JavaScript function call."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3642 target ; a `js2-node' evaluating to the function to call
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3643 args ; a lisp list of `js2-node' arguments
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3644 lp ; position of open-paren, or nil if missing
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3645 rp) ; position of close-paren, or nil if missing
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3646
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3647 (put 'cl-struct-js2-call-node 'js2-visitor 'js2-visit-call-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3648 (put 'cl-struct-js2-call-node 'js2-printer 'js2-print-call-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3649
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3650 (defun js2-visit-call-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3651 (js2-visit-ast (js2-call-node-target n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3652 (dolist (arg (js2-call-node-args n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3653 (js2-visit-ast arg v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3654
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3655 (defun js2-print-call-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3656 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3657 (js2-print-ast (js2-call-node-target n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3658 (insert "(")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3659 (js2-print-list (js2-call-node-args n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3660 (insert ")"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3661
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3662 (defstruct (js2-yield-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3663 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3664 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3665 (:constructor make-js2-yield-node (&key (type js2-YIELD)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3666 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3667 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3668 value)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3669 "AST node for yield statement or expression."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3670 value) ; optional: value to be yielded
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3671
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3672 (put 'cl-struct-js2-yield-node 'js2-visitor 'js2-visit-yield-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3673 (put 'cl-struct-js2-yield-node 'js2-printer 'js2-print-yield-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3674
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3675 (defun js2-visit-yield-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3676 (js2-visit-ast (js2-yield-node-value n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3677
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3678 (defun js2-print-yield-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3679 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3680 (insert "yield")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3681 (when (js2-yield-node-value n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3682 (insert " ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3683 (js2-print-ast (js2-yield-node-value n) 0)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3684
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3685 (defstruct (js2-paren-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3686 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3687 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3688 (:constructor make-js2-paren-node (&key (type js2-LP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3689 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3690 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3691 expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3692 "AST node for a parenthesized expression.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3693 In particular, used when the parens are syntactically optional,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3694 as opposed to required parens such as those enclosing an if-conditional."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3695 expr) ; `js2-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3696
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3697 (put 'cl-struct-js2-paren-node 'js2-visitor 'js2-visit-paren-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3698 (put 'cl-struct-js2-paren-node 'js2-printer 'js2-print-paren-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3699
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3700 (defun js2-visit-paren-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3701 (js2-visit-ast (js2-paren-node-expr n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3702
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3703 (defun js2-print-paren-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3704 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3705 (insert "(")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3706 (js2-print-ast (js2-paren-node-expr n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3707 (insert ")"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3708
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3709 (defstruct (js2-array-comp-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3710 (:include js2-scope)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3711 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3712 (:constructor make-js2-array-comp-node (&key (type js2-ARRAYCOMP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3713 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3714 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3715 result
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3716 loops
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3717 filter
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3718 if-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3719 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3720 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3721 "AST node for an Array comprehension such as [[x,y] for (x in foo) for (y in bar)]."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3722 result ; result expression (just after left-bracket)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3723 loops ; a lisp list of `js2-array-comp-loop-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3724 filter ; guard/filter expression
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3725 if-pos ; buffer pos of 'if' keyword, if present, else nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3726 lp ; buffer position of if-guard left-paren, or nil if not present
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3727 rp) ; buffer position of if-guard right-paren, or nil if not present
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3728
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3729 (put 'cl-struct-js2-array-comp-node 'js2-visitor 'js2-visit-array-comp-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3730 (put 'cl-struct-js2-array-comp-node 'js2-printer 'js2-print-array-comp-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3731
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3732 (defun js2-visit-array-comp-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3733 (js2-visit-ast (js2-array-comp-node-result n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3734 (dolist (l (js2-array-comp-node-loops n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3735 (js2-visit-ast l v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3736 (if (js2-array-comp-node-filter n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3737 (js2-visit-ast (js2-array-comp-node-filter n) v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3738
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3739 (defun js2-print-array-comp-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3740 (let ((pad (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3741 (result (js2-array-comp-node-result n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3742 (loops (js2-array-comp-node-loops n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3743 (filter (js2-array-comp-node-filter n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3744 (insert pad "[")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3745 (js2-print-ast result 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3746 (dolist (l loops)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3747 (insert " ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3748 (js2-print-ast l 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3749 (when filter
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3750 (insert " if (")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3751 (js2-print-ast filter 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3752 (insert ")]")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3753
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3754 (defstruct (js2-array-comp-loop-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3755 (:include js2-for-in-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3756 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3757 (:constructor make-js2-array-comp-loop-node (&key (type js2-FOR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3758 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3759 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3760 iterator
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3761 object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3762 in-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3763 foreach-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3764 each-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3765 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3766 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3767 "AST subtree for each 'for (foo in bar)' loop in an array comprehension.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3768
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3769 (put 'cl-struct-js2-array-comp-loop-node 'js2-visitor 'js2-visit-array-comp-loop)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3770 (put 'cl-struct-js2-array-comp-loop-node 'js2-printer 'js2-print-array-comp-loop)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3771
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3772 (defun js2-visit-array-comp-loop (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3773 (js2-visit-ast (js2-array-comp-loop-node-iterator n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3774 (js2-visit-ast (js2-array-comp-loop-node-object n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3775
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3776 (defun js2-print-array-comp-loop (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3777 (insert "for (")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3778 (js2-print-ast (js2-array-comp-loop-node-iterator n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3779 (insert " in ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3780 (js2-print-ast (js2-array-comp-loop-node-object n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3781 (insert ")"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3782
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3783 (defstruct (js2-empty-expr-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3784 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3785 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3786 (:constructor make-js2-empty-expr-node (&key (type js2-EMPTY)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3787 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3788 len)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3789 "AST node for an empty expression.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3790
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3791 (put 'cl-struct-js2-empty-expr-node 'js2-visitor 'js2-visit-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3792 (put 'cl-struct-js2-empty-expr-node 'js2-printer 'js2-print-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3793
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3794 (defstruct (js2-xml-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3795 (:include js2-block-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3796 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3797 (:constructor make-js2-xml-node (&key (type js2-XML)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3798 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3799 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3800 kids)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3801 "AST node for initial parse of E4X literals.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3802 The kids field is a list of XML fragments, each a `js2-string-node' or
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3803 a `js2-xml-js-expr-node'. Equivalent to Rhino's XmlLiteral node.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3804
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3805 (put 'cl-struct-js2-xml-node 'js2-visitor 'js2-visit-block)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3806 (put 'cl-struct-js2-xml-node 'js2-printer 'js2-print-xml-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3807
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3808 (defun js2-print-xml-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3809 (dolist (kid (js2-xml-node-kids n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3810 (js2-print-ast kid i)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3811
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3812 (defstruct (js2-xml-js-expr-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3813 (:include js2-xml-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3814 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3815 (:constructor make-js2-xml-js-expr-node (&key (type js2-XML)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3816 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3817 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3818 expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3819 "AST node for an embedded JavaScript {expression} in an E4X literal.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3820 The start and end fields correspond to the curly-braces."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3821 expr) ; a `js2-expr-node' of some sort
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3822
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3823 (put 'cl-struct-js2-xml-js-expr-node 'js2-visitor 'js2-visit-xml-js-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3824 (put 'cl-struct-js2-xml-js-expr-node 'js2-printer 'js2-print-xml-js-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3825
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3826 (defun js2-visit-xml-js-expr (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3827 (js2-visit-ast (js2-xml-js-expr-node-expr n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3828
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3829 (defun js2-print-xml-js-expr (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3830 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3831 (insert "{")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3832 (js2-print-ast (js2-xml-js-expr-node-expr n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3833 (insert "}"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3834
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3835 (defstruct (js2-xml-dot-query-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3836 (:include js2-infix-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3837 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3838 (:constructor make-js2-xml-dot-query-node (&key (type js2-DOTQUERY)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3839 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3840 op-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3841 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3842 left
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3843 right
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3844 rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3845 "AST node for an E4X foo.(bar) filter expression.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3846 Note that the left-paren is automatically the character immediately
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3847 following the dot (.) in the operator. No whitespace is permitted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3848 between the dot and the lp by the scanner."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3849 rp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3850
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3851 (put 'cl-struct-js2-xml-dot-query-node 'js2-visitor 'js2-visit-infix-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3852 (put 'cl-struct-js2-xml-dot-query-node 'js2-printer 'js2-print-xml-dot-query)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3853
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3854 (defun js2-print-xml-dot-query (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3855 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3856 (js2-print-ast (js2-xml-dot-query-node-left n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3857 (insert ".(")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3858 (js2-print-ast (js2-xml-dot-query-node-right n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3859 (insert ")"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3860
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3861 (defstruct (js2-xml-ref-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3862 (:include js2-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3863 (:constructor nil)) ; abstract
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3864 "Base type for E4X XML attribute-access or property-get expressions.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3865 Such expressions can take a variety of forms. The general syntax has
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3866 three parts:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3867
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3868 - (optional) an @ (specifying an attribute access)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3869 - (optional) a namespace (a `js2-name-node') and double-colon
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3870 - (required) either a `js2-name-node' or a bracketed [expression]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3871
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3872 The property-name expressions (examples: ns::name, @name) are
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3873 represented as `js2-xml-prop-ref' nodes. The bracketed-expression
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3874 versions (examples: ns::[name], @[name]) become `js2-xml-elem-ref' nodes.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3875
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3876 This node type (or more specifically, its subclasses) will sometimes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3877 be the right-hand child of a `js2-prop-get-node' or a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3878 `js2-infix-node' of type `js2-DOTDOT', the .. xml-descendants operator.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3879 The `js2-xml-ref-node' may also be a standalone primary expression with
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3880 no explicit target, which is valid in certain expression contexts such as
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3881
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3882 company..employee.(@id < 100)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3883
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3884 in this case, the @id is a `js2-xml-ref' that is part of an infix '<'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3885 expression whose parent is a `js2-xml-dot-query-node'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3886 namespace
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3887 at-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3888 colon-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3889
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3890 (defsubst js2-xml-ref-node-attr-access-p (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3891 "Return non-nil if this expression began with an @-token."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3892 (and (numberp (js2-xml-ref-node-at-pos node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3893 (plusp (js2-xml-ref-node-at-pos node))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3894
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3895 (defstruct (js2-xml-prop-ref-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3896 (:include js2-xml-ref-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3897 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3898 (:constructor make-js2-xml-prop-ref-node (&key (type js2-REF_NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3899 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3900 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3901 propname
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3902 namespace
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3903 at-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3904 colon-pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3905 "AST node for an E4X XML [expr] property-ref expression.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3906 The JavaScript syntax is an optional @, an optional ns::, and a name.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3907
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3908 [ '@' ] [ name '::' ] name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3909
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3910 Examples include name, ns::name, ns::*, *::name, *::*, @attr, @ns::attr,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3911 @ns::*, @*::attr, @*::*, and @*.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3912
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3913 The node starts at the @ token, if present. Otherwise it starts at the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3914 namespace name. The node bounds extend through the closing right-bracket,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3915 or if it is missing due to a syntax error, through the end of the index
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3916 expression."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3917 propname)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3918
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3919 (put 'cl-struct-js2-xml-prop-ref-node 'js2-visitor 'js2-visit-xml-prop-ref-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3920 (put 'cl-struct-js2-xml-prop-ref-node 'js2-printer 'js2-print-xml-prop-ref-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3921
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3922 (defun js2-visit-xml-prop-ref-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3923 (if (js2-xml-prop-ref-node-namespace n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3924 (js2-visit-ast (js2-xml-prop-ref-node-namespace n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3925 (if (js2-xml-prop-ref-node-propname n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3926 (js2-visit-ast (js2-xml-prop-ref-node-propname n) v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3927
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3928 (defun js2-print-xml-prop-ref-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3929 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3930 (if (js2-xml-ref-node-attr-access-p n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3931 (insert "@"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3932 (when (js2-xml-prop-ref-node-namespace n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3933 (js2-print-ast (js2-xml-prop-ref-node-namespace n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3934 (insert "::"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3935 (if (js2-xml-prop-ref-node-propname n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3936 (js2-print-ast (js2-xml-prop-ref-node-propname n) 0)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3937
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3938 (defstruct (js2-xml-elem-ref-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3939 (:include js2-xml-ref-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3940 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3941 (:constructor make-js2-xml-elem-ref-node (&key (type js2-REF_MEMBER)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3942 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3943 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3944 expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3945 lb
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3946 rb
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3947 namespace
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3948 at-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3949 colon-pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3950 "AST node for an E4X XML [expr] member-ref expression.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3951 Syntax:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3952
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3953 [ '@' ] [ name '::' ] '[' expr ']'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3954
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3955 Examples include ns::[expr], @ns::[expr], @[expr], *::[expr] and @*::[expr].
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3956
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3957 Note that the form [expr] (i.e. no namespace or attribute-qualifier)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3958 is not a legal E4X XML element-ref expression, since it's already used
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3959 for standard JavaScript element-get array indexing. Hence, a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3960 `js2-xml-elem-ref-node' always has either the attribute-qualifier, a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3961 non-nil namespace node, or both.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3962
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3963 The node starts at the @ token, if present. Otherwise it starts
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3964 at the namespace name. The node bounds extend through the closing
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3965 right-bracket, or if it is missing due to a syntax error, through the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3966 end of the index expression."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3967 expr ; the bracketed index expression
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3968 lb
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3969 rb)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3970
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3971 (put 'cl-struct-js2-xml-elem-ref-node 'js2-visitor 'js2-visit-xml-elem-ref-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3972 (put 'cl-struct-js2-xml-elem-ref-node 'js2-printer 'js2-print-xml-elem-ref-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3973
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3974 (defun js2-visit-xml-elem-ref-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3975 (if (js2-xml-elem-ref-node-namespace n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3976 (js2-visit-ast (js2-xml-elem-ref-node-namespace n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3977 (if (js2-xml-elem-ref-node-expr n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3978 (js2-visit-ast (js2-xml-elem-ref-node-expr n) v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3979
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3980 (defun js2-print-xml-elem-ref-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3981 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3982 (if (js2-xml-ref-node-attr-access-p n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3983 (insert "@"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3984 (when (js2-xml-elem-ref-node-namespace n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3985 (js2-print-ast (js2-xml-elem-ref-node-namespace n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3986 (insert "::"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3987 (insert "[")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3988 (if (js2-xml-elem-ref-node-expr n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3989 (js2-print-ast (js2-xml-elem-ref-node-expr n) 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3990 (insert "]"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3991
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3992 ;;; Placeholder nodes for when we try parsing the XML literals structurally.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3993
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3994 (defstruct (js2-xml-start-tag-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3995 (:include js2-xml-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3996 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3997 (:constructor make-js2-xml-start-tag-node (&key (type js2-XML)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3998 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
3999 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4000 name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4001 attrs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4002 kids
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4003 empty-p)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4004 "AST node for an XML start-tag. Not currently used.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4005 The `kids' field is a lisp list of child content nodes."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4006 name ; a `js2-xml-name-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4007 attrs ; a lisp list of `js2-xml-attr-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4008 empty-p) ; t if this is an empty element such as <foo bar="baz"/>
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4009
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4010 (put 'cl-struct-js2-xml-start-tag-node 'js2-visitor 'js2-visit-xml-start-tag)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4011 (put 'cl-struct-js2-xml-start-tag-node 'js2-printer 'js2-print-xml-start-tag)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4012
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4013 (defun js2-visit-xml-start-tag (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4014 (js2-visit-ast (js2-xml-start-tag-node-name n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4015 (dolist (attr (js2-xml-start-tag-node-attrs n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4016 (js2-visit-ast attr v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4017 (js2-visit-block n v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4018
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4019 (defun js2-print-xml-start-tag (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4020 (insert (js2-make-pad i) "<")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4021 (js2-print-ast (js2-xml-start-tag-node-name n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4022 (when (js2-xml-start-tag-node-attrs n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4023 (insert " ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4024 (js2-print-list (js2-xml-start-tag-node-attrs n) " "))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4025 (insert ">"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4026
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4027 ;; I -think- I'm going to make the parent node the corresponding start-tag,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4028 ;; and add the end-tag to the kids list of the parent as well.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4029 (defstruct (js2-xml-end-tag-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4030 (:include js2-xml-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4031 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4032 (:constructor make-js2-xml-end-tag-node (&key (type js2-XML)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4033 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4034 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4035 name)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4036 "AST node for an XML end-tag. Not currently used."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4037 name) ; a `js2-xml-name-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4038
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4039 (put 'cl-struct-js2-xml-end-tag-node 'js2-visitor 'js2-visit-xml-end-tag)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4040 (put 'cl-struct-js2-xml-end-tag-node 'js2-printer 'js2-print-xml-end-tag)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4041
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4042 (defun js2-visit-xml-end-tag (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4043 (js2-visit-ast (js2-xml-end-tag-node-name n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4044
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4045 (defun js2-print-xml-end-tag (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4046 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4047 (insert "</")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4048 (js2-print-ast (js2-xml-end-tag-node-name n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4049 (insert ">"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4050
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4051 (defstruct (js2-xml-name-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4052 (:include js2-xml-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4053 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4054 (:constructor make-js2-xml-name-node (&key (type js2-XML)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4055 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4056 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4057 namespace
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4058 kids)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4059 "AST node for an E4X XML name. Not currently used.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4060 Any XML name can be qualified with a namespace, hence the namespace field.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4061 Further, any E4X name can be comprised of arbitrary JavaScript {} expressions.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4062 The kids field is a list of `js2-name-node' and `js2-xml-js-expr-node'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4063 For a simple name, the kids list has exactly one node, a `js2-name-node'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4064 namespace) ; a `js2-string-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4065
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4066 (put 'cl-struct-js2-xml-name-node 'js2-visitor 'js2-visit-xml-name-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4067 (put 'cl-struct-js2-xml-name-node 'js2-printer 'js2-print-xml-name-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4068
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4069 (defun js2-visit-xml-name-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4070 (js2-visit-ast (js2-xml-name-node-namespace n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4071
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4072 (defun js2-print-xml-name-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4073 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4074 (when (js2-xml-name-node-namespace n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4075 (js2-print-ast (js2-xml-name-node-namespace n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4076 (insert "::"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4077 (dolist (kid (js2-xml-name-node-kids n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4078 (js2-print-ast kid 0)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4079
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4080 (defstruct (js2-xml-pi-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4081 (:include js2-xml-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4082 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4083 (:constructor make-js2-xml-pi-node (&key (type js2-XML)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4084 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4085 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4086 name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4087 attrs)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4088 "AST node for an E4X XML processing instruction. Not currently used."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4089 name ; a `js2-xml-name-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4090 attrs) ; a list of `js2-xml-attr-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4091
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4092 (put 'cl-struct-js2-xml-pi-node 'js2-visitor 'js2-visit-xml-pi-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4093 (put 'cl-struct-js2-xml-pi-node 'js2-printer 'js2-print-xml-pi-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4094
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4095 (defun js2-visit-xml-pi-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4096 (js2-visit-ast (js2-xml-pi-node-name n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4097 (dolist (attr (js2-xml-pi-node-attrs n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4098 (js2-visit-ast attr v)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4099
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4100 (defun js2-print-xml-pi-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4101 (insert (js2-make-pad i) "<?")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4102 (js2-print-ast (js2-xml-pi-node-name n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4103 (when (js2-xml-pi-node-attrs n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4104 (insert " ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4105 (js2-print-list (js2-xml-pi-node-attrs n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4106 (insert "?>"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4107
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4108 (defstruct (js2-xml-cdata-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4109 (:include js2-xml-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4110 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4111 (:constructor make-js2-xml-cdata-node (&key (type js2-XML)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4112 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4113 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4114 content)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4115 "AST node for a CDATA escape section. Not currently used."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4116 content) ; a `js2-string-node' with node-property 'quote-type 'cdata
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4117
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4118 (put 'cl-struct-js2-xml-cdata-node 'js2-visitor 'js2-visit-xml-cdata-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4119 (put 'cl-struct-js2-xml-cdata-node 'js2-printer 'js2-print-xml-cdata-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4120
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4121 (defun js2-visit-xml-cdata-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4122 (js2-visit-ast (js2-xml-cdata-node-content n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4123
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4124 (defun js2-print-xml-cdata-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4125 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4126 (js2-print-ast (js2-xml-cdata-node-content n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4127
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4128 (defstruct (js2-xml-attr-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4129 (:include js2-xml-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4130 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4131 (:constructor make-js2-attr-node (&key (type js2-XML)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4132 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4133 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4134 name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4135 value
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4136 eq-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4137 quote-type)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4138 "AST node representing a foo='bar' XML attribute value. Not yet used."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4139 name ; a `js2-xml-name-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4140 value ; a `js2-xml-name-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4141 eq-pos ; buffer position of "=" sign
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4142 quote-type) ; 'single or 'double
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4143
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4144 (put 'cl-struct-js2-xml-attr-node 'js2-visitor 'js2-visit-xml-attr-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4145 (put 'cl-struct-js2-xml-attr-node 'js2-printer 'js2-print-xml-attr-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4146
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4147 (defun js2-visit-xml-attr-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4148 (js2-visit-ast (js2-xml-attr-node-name n) v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4149 (js2-visit-ast (js2-xml-attr-node-value n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4150
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4151 (defun js2-print-xml-attr-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4152 (let ((quote (if (eq (js2-xml-attr-node-quote-type n) 'single)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4153 "'"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4154 "\"")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4155 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4156 (js2-print-ast (js2-xml-attr-node-name n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4157 (insert "=" quote)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4158 (js2-print-ast (js2-xml-attr-node-value n) 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4159 (insert quote)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4160
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4161 (defstruct (js2-xml-text-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4162 (:include js2-xml-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4163 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4164 (:constructor make-js2-text-node (&key (type js2-XML)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4165 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4166 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4167 content)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4168 "AST node for an E4X XML text node. Not currently used."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4169 content) ; a lisp list of `js2-string-node' and `js2-xml-js-expr-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4170
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4171 (put 'cl-struct-js2-xml-text-node 'js2-visitor 'js2-visit-xml-text-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4172 (put 'cl-struct-js2-xml-text-node 'js2-printer 'js2-print-xml-text-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4173
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4174 (defun js2-visit-xml-text-node (n v)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4175 (js2-visit-ast (js2-xml-text-node-content n) v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4176
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4177 (defun js2-print-xml-text-node (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4178 (insert (js2-make-pad i))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4179 (dolist (kid (js2-xml-text-node-content n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4180 (js2-print-ast kid)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4181
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4182 (defstruct (js2-xml-comment-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4183 (:include js2-xml-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4184 (:constructor nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4185 (:constructor make-js2-xml-comment-node (&key (type js2-XML)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4186 (pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4187 len)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4188 "AST node for E4X XML comment. Not currently used.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4189
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4190 (put 'cl-struct-js2-xml-comment-node 'js2-visitor 'js2-visit-none)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4191 (put 'cl-struct-js2-xml-comment-node 'js2-printer 'js2-print-xml-comment)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4192
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4193 (defun js2-print-xml-comment (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4194 (insert (js2-make-pad i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4195 (js2-node-string n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4196
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4197 ;;; Node utilities
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4198
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4199 (defsubst js2-node-line (n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4200 "Fetch the source line number at the start of node N.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4201 This is O(n) in the length of the source buffer; use prudently."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4202 (1+ (count-lines (point-min) (js2-node-abs-pos n))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4203
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4204 (defsubst js2-block-node-kid (n i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4205 "Return child I of node N, or nil if there aren't that many."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4206 (nth i (js2-block-node-kids n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4207
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4208 (defsubst js2-block-node-first (n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4209 "Return first child of block node N, or nil if there is none."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4210 (first (js2-block-node-kids n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4211
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4212 (defun js2-node-root (n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4213 "Return the root of the AST containing N.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4214 If N has no parent pointer, returns N."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4215 (let ((parent (js2-node-parent n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4216 (if parent
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4217 (js2-node-root parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4218 n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4219
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4220 (defun js2-node-position-in-parent (node &optional parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4221 "Return the position of NODE in parent's block-kids list.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4222 PARENT can be supplied if known. Positioned returned is zero-indexed.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4223 Returns 0 if NODE is not a child of a block statement, or if NODE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4224 is not a statement node."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4225 (let ((p (or parent (js2-node-parent node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4226 (i 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4227 (if (not (js2-block-node-p p))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4228 i
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4229 (or (js2-position node (js2-block-node-kids p))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4230 0))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4231
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4232 (defsubst js2-node-short-name (n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4233 "Return the short name of node N as a string, e.g. `js2-if-node'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4234 (substring (symbol-name (aref n 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4235 (length "cl-struct-")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4236
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4237 (defsubst js2-node-child-list (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4238 "Return the child list for NODE, a lisp list of nodes.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4239 Works for block nodes, array nodes, obj literals, funarg lists,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4240 var decls and try nodes (for catch clauses). Note that you should call
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4241 `js2-block-node-kids' on the function body for the body statements.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4242 Returns nil for zero-length child lists or unsupported nodes."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4243 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4244 ((js2-function-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4245 (js2-function-node-params node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4246 ((js2-block-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4247 (js2-block-node-kids node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4248 ((js2-try-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4249 (js2-try-node-catch-clauses node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4250 ((js2-array-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4251 (js2-array-node-elems node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4252 ((js2-object-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4253 (js2-object-node-elems node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4254 ((js2-call-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4255 (js2-call-node-args node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4256 ((js2-new-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4257 (js2-new-node-args node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4258 ((js2-var-decl-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4259 (js2-var-decl-node-kids node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4260 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4261 nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4262
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4263 (defsubst js2-node-set-child-list (node kids)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4264 "Set the child list for NODE to KIDS."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4265 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4266 ((js2-function-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4267 (setf (js2-function-node-params node) kids))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4268 ((js2-block-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4269 (setf (js2-block-node-kids node) kids))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4270 ((js2-try-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4271 (setf (js2-try-node-catch-clauses node) kids))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4272 ((js2-array-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4273 (setf (js2-array-node-elems node) kids))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4274 ((js2-object-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4275 (setf (js2-object-node-elems node) kids))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4276 ((js2-call-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4277 (setf (js2-call-node-args node) kids))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4278 ((js2-new-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4279 (setf (js2-new-node-args node) kids))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4280 ((js2-var-decl-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4281 (setf (js2-var-decl-node-kids node) kids))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4282 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4283 (error "Unsupported node type: %s" (js2-node-short-name node))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4284 kids)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4285
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4286 ;; All because Common Lisp doesn't support multiple inheritance for defstructs.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4287 (defconst js2-paren-expr-nodes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4288 '(cl-struct-js2-array-comp-loop-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4289 cl-struct-js2-array-comp-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4290 cl-struct-js2-call-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4291 cl-struct-js2-catch-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4292 cl-struct-js2-do-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4293 cl-struct-js2-elem-get-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4294 cl-struct-js2-for-in-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4295 cl-struct-js2-for-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4296 cl-struct-js2-function-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4297 cl-struct-js2-if-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4298 cl-struct-js2-let-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4299 cl-struct-js2-new-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4300 cl-struct-js2-paren-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4301 cl-struct-js2-switch-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4302 cl-struct-js2-while-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4303 cl-struct-js2-with-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4304 cl-struct-js2-xml-dot-query-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4305 "Node types that can have a parenthesized child expression.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4306 In particular, nodes that respond to `js2-node-lp' and `js2-node-rp'.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4307
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4308 (defsubst js2-paren-expr-node-p (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4309 "Return t for nodes that typically have a parenthesized child expression.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4310 Useful for computing the indentation anchors for arg-lists and conditions.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4311 Note that it may return a false positive, for instance when NODE is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4312 a `js2-new-node' and there are no arguments or parentheses."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4313 (memq (aref node 0) js2-paren-expr-nodes))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4314
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4315 ;; Fake polymorphism... yech.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4316 (defsubst js2-node-lp (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4317 "Return relative left-paren position for NODE, if applicable.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4318 For `js2-elem-get-node' structs, returns left-bracket position.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4319 Note that the position may be nil in the case of a parse error."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4320 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4321 ((js2-elem-get-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4322 (js2-elem-get-node-lb node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4323 ((js2-loop-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4324 (js2-loop-node-lp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4325 ((js2-function-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4326 (js2-function-node-lp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4327 ((js2-if-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4328 (js2-if-node-lp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4329 ((js2-new-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4330 (js2-new-node-lp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4331 ((js2-call-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4332 (js2-call-node-lp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4333 ((js2-paren-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4334 (js2-node-pos node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4335 ((js2-switch-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4336 (js2-switch-node-lp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4337 ((js2-catch-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4338 (js2-catch-node-lp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4339 ((js2-let-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4340 (js2-let-node-lp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4341 ((js2-array-comp-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4342 (js2-array-comp-node-lp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4343 ((js2-with-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4344 (js2-with-node-lp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4345 ((js2-xml-dot-query-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4346 (1+ (js2-infix-node-op-pos node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4347 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4348 (error "Unsupported node type: %s" (js2-node-short-name node)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4349
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4350 ;; Fake polymorphism... blech.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4351 (defsubst js2-node-rp (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4352 "Return relative right-paren position for NODE, if applicable.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4353 For `js2-elem-get-node' structs, returns right-bracket position.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4354 Note that the position may be nil in the case of a parse error."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4355 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4356 ((js2-elem-get-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4357 (js2-elem-get-node-lb node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4358 ((js2-loop-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4359 (js2-loop-node-rp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4360 ((js2-function-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4361 (js2-function-node-rp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4362 ((js2-if-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4363 (js2-if-node-rp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4364 ((js2-new-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4365 (js2-new-node-rp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4366 ((js2-call-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4367 (js2-call-node-rp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4368 ((js2-paren-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4369 (+ (js2-node-pos node) (js2-node-len node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4370 ((js2-switch-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4371 (js2-switch-node-rp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4372 ((js2-catch-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4373 (js2-catch-node-rp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4374 ((js2-let-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4375 (js2-let-node-rp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4376 ((js2-array-comp-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4377 (js2-array-comp-node-rp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4378 ((js2-with-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4379 (js2-with-node-rp node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4380 ((js2-xml-dot-query-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4381 (1+ (js2-xml-dot-query-node-rp node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4382 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4383 (error "Unsupported node type: %s" (js2-node-short-name node)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4384
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4385 (defsubst js2-node-first-child (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4386 "Returns the first element of `js2-node-child-list' for NODE."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4387 (car (js2-node-child-list node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4388
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4389 (defsubst js2-node-last-child (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4390 "Returns the last element of `js2-node-last-child' for NODE."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4391 (car (last (js2-node-child-list node))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4392
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4393 (defun js2-node-prev-sibling (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4394 "Return the previous statement in parent.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4395 Works for parents supported by `js2-node-child-list'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4396 Returns nil if NODE is not in the parent, or PARENT is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4397 not a supported node, or if NODE is the first child."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4398 (let* ((p (js2-node-parent node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4399 (kids (js2-node-child-list p))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4400 (sib (car kids)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4401 (while (and kids
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4402 (not (eq node (cadr kids))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4403 (setq kids (cdr kids)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4404 sib (car kids)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4405 sib))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4406
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4407 (defun js2-node-next-sibling (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4408 "Return the next statement in parent block.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4409 Returns nil if NODE is not in the block, or PARENT is not
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4410 a block node, or if NODE is the last statement."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4411 (let* ((p (js2-node-parent node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4412 (kids (js2-node-child-list p)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4413 (while (and kids
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4414 (not (eq node (car kids))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4415 (setq kids (cdr kids)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4416 (cadr kids)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4417
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4418 (defun js2-node-find-child-before (pos parent &optional after)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4419 "Find the last child that starts before POS in parent.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4420 If AFTER is non-nil, returns first child starting after POS.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4421 POS is an absolute buffer position. PARENT is any node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4422 supported by `js2-node-child-list'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4423 Returns nil if no applicable child is found."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4424 (let ((kids (if (js2-function-node-p parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4425 (js2-block-node-kids (js2-function-node-body parent))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4426 (js2-node-child-list parent)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4427 (beg (if (js2-function-node-p parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4428 (js2-node-abs-pos (js2-function-node-body parent))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4429 (js2-node-abs-pos parent)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4430 kid
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4431 result
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4432 fn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4433 (continue t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4434 (setq fn (if after '> '<))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4435 (while (and kids continue)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4436 (setq kid (car kids))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4437 (if (funcall fn (+ beg (js2-node-pos kid)) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4438 (setq result kid
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4439 continue (if after nil t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4440 (setq continue (if after t nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4441 (setq kids (cdr kids)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4442 result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4443
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4444 (defun js2-node-find-child-after (pos parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4445 "Find first child that starts after POS in parent.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4446 POS is an absolute buffer position. PARENT is any node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4447 supported by `js2-node-child-list'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4448 Returns nil if no applicable child is found."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4449 (js2-node-find-child-before pos parent 'after))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4450
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4451 (defun js2-node-replace-child (pos parent new-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4452 "Replace node at index POS in PARENT with NEW-NODE.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4453 Only works for parents supported by `js2-node-child-list'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4454 (let ((kids (js2-node-child-list parent))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4455 (i 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4456 (while (< i pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4457 (setq kids (cdr kids)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4458 i (1+ i)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4459 (setcar kids new-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4460 (js2-node-add-children parent new-node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4461
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4462 (defun js2-node-buffer (n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4463 "Return the buffer associated with AST N.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4464 Returns nil if the buffer is not set as a property on the root
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4465 node, or if parent links were not recorded during parsing."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4466 (let ((root (js2-node-root n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4467 (and root
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4468 (js2-ast-root-p root)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4469 (js2-ast-root-buffer root))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4470
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4471 (defsubst js2-block-node-push (n kid)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4472 "Push js2-node KID onto the end of js2-block-node N's child list.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4473 KID is always added to the -end- of the kids list.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4474 Function also calls `js2-node-add-children' to add the parent link."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4475 (let ((kids (js2-node-child-list n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4476 (if kids
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4477 (setcdr kids (nconc (cdr kids) (list kid)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4478 (js2-node-set-child-list n (list kid)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4479 (js2-node-add-children n kid)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4480
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4481 (defun js2-node-string (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4482 (let ((buf (js2-node-buffer node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4483 pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4484 (unless buf
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4485 (error "No buffer available for node %s" node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4486 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4487 (set-buffer buf)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4488 (buffer-substring-no-properties (setq pos (js2-node-abs-pos node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4489 (+ pos (js2-node-len node))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4490
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4491 ;; Container for storing the node we're looking for in a traversal.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4492 (js2-deflocal js2-discovered-node nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4493
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4494 ;; Keep track of absolute node position during traversals.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4495 (js2-deflocal js2-visitor-offset nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4496
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4497 (js2-deflocal js2-node-search-point nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4498
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4499 (when js2-mode-dev-mode-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4500 (defun js2-find-node-at-point ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4501 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4502 (let ((node (js2-node-at-point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4503 (message "%s" (or node "No node found at point"))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4504 (defun js2-node-name-at-point ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4505 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4506 (let ((node (js2-node-at-point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4507 (message "%s" (if node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4508 (js2-node-short-name node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4509 "No node found at point.")))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4510
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4511 (defun js2-node-at-point (&optional pos skip-comments)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4512 "Return AST node at POS, a buffer position, defaulting to current point.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4513 The `js2-mode-ast' variable must be set to the current parse tree.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4514 Signals an error if the AST (`js2-mode-ast') is nil.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4515 Always returns a node - if it can't find one, it returns the root.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4516 If SKIP-COMMENTS is non-nil, comment nodes are ignored."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4517 (let ((ast js2-mode-ast)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4518 result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4519 (unless ast
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4520 (error "No JavaScript AST available"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4521 ;; Look through comments first, since they may be inside nodes that
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4522 ;; would otherwise report a match.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4523 (setq pos (or pos (point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4524 result (if (> pos (js2-node-abs-end ast))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4525 ast
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4526 (if (not skip-comments)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4527 (js2-comment-at-point pos))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4528 (unless result
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4529 (setq js2-discovered-node nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4530 js2-visitor-offset 0
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4531 js2-node-search-point pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4532 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4533 (catch 'js2-visit-done
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4534 (js2-visit-ast ast #'js2-node-at-point-visitor))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4535 (setq js2-visitor-offset nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4536 js2-node-search-point nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4537 (setq result js2-discovered-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4538 ;; may have found a comment beyond end of last child node,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4539 ;; since visiting the ast-root looks at the comment-list last.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4540 (if (and skip-comments
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4541 (js2-comment-node-p result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4542 (setq result nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4543 (or result js2-mode-ast)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4544
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4545 (defun js2-node-at-point-visitor (node end-p)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4546 (let ((rel-pos (js2-node-pos node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4547 abs-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4548 abs-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4549 (point js2-node-search-point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4550 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4551 (end-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4552 ;; this evaluates to a non-nil return value, even if it's zero
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4553 (decf js2-visitor-offset rel-pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4554 ;; we already looked for comments before visiting, and don't want them now
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4555 ((js2-comment-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4556 nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4557 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4558 (setq abs-pos (incf js2-visitor-offset rel-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4559 ;; we only want to use the node if the point is before
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4560 ;; the last character position in the node, so we decrement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4561 ;; the absolute end by 1.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4562 abs-end (+ abs-pos (js2-node-len node) -1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4563 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4564 ;; If this node starts after search-point, stop the search.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4565 ((> abs-pos point)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4566 (throw 'js2-visit-done nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4567 ;; If this node ends before the search-point, don't check kids.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4568 ((> point abs-end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4569 nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4570 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4571 ;; Otherwise point is within this node, possibly in a child.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4572 (setq js2-discovered-node node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4573 t)))))) ; keep processing kids to look for more specific match
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4574
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4575 (defsubst js2-block-comment-p (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4576 "Return non-nil if NODE is a comment node of format `jsdoc' or `block'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4577 (and (js2-comment-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4578 (memq (js2-comment-node-format node) '(jsdoc block))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4579
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4580 ;; TODO: put the comments in a vector and binary-search them instead
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4581 (defun js2-comment-at-point (&optional pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4582 "Look through scanned comment nodes for one containing POS.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4583 POS is a buffer position that defaults to current point.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4584 Function returns nil if POS was not in any comment node."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4585 (let ((ast js2-mode-ast)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4586 (x (or pos (point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4587 beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4588 end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4589 (unless ast
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4590 (error "No JavaScript AST available"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4591 (catch 'done
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4592 ;; Comments are stored in lexical order.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4593 (dolist (comment (js2-ast-root-comments ast) nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4594 (setq beg (js2-node-abs-pos comment)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4595 end (+ beg (js2-node-len comment)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4596 (if (and (>= x beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4597 (<= x end))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4598 (throw 'done comment))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4599
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4600 (defun js2-mode-find-parent-fn (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4601 "Find function enclosing NODE.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4602 Returns nil if NODE is not inside a function."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4603 (setq node (js2-node-parent node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4604 (while (and node (not (js2-function-node-p node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4605 (setq node (js2-node-parent node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4606 (and (js2-function-node-p node) node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4607
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4608 (defun js2-mode-find-enclosing-fn (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4609 "Find function or root enclosing NODE."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4610 (if (js2-ast-root-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4611 node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4612 (setq node (js2-node-parent node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4613 (while (not (or (js2-ast-root-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4614 (js2-function-node-p node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4615 (setq node (js2-node-parent node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4616 node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4617
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4618 (defun js2-mode-find-enclosing-node (beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4619 "Find script or function fully enclosing BEG and END."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4620 (let ((node (js2-node-at-point beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4621 pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4622 (continue t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4623 (while continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4624 (if (or (js2-ast-root-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4625 (and (js2-function-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4626 (<= (setq pos (js2-node-abs-pos node)) beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4627 (>= (+ pos (js2-node-len node)) end)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4628 (setq continue nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4629 (setq node (js2-node-parent node))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4630 node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4631
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4632 (defun js2-node-parent-script-or-fn (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4633 "Find script or function immediately enclosing NODE.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4634 If NODE is the ast-root, returns nil."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4635 (if (js2-ast-root-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4636 nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4637 (setq node (js2-node-parent node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4638 (while (and node (not (or (js2-function-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4639 (js2-script-node-p node))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4640 (setq node (js2-node-parent node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4641 node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4642
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4643 (defsubst js2-nested-function-p (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4644 "Return t if NODE is a nested function, or is inside a nested function."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4645 (js2-function-node-p (if (js2-function-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4646 (js2-node-parent-script-or-fn node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4647 (js2-node-parent-script-or-fn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4648 (js2-node-parent-script-or-fn node)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4649
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4650 (defsubst js2-mode-shift-kids (kids start offset)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4651 (dolist (kid kids)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4652 (if (> (js2-node-pos kid) start)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4653 (incf (js2-node-pos kid) offset))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4654
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4655 (defsubst js2-mode-shift-children (parent start offset)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4656 "Update start-positions of all children of PARENT beyond START."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4657 (let ((root (js2-node-root parent)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4658 (js2-mode-shift-kids (js2-node-child-list parent) start offset)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4659 (js2-mode-shift-kids (js2-ast-root-comments root) start offset)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4660
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4661 (defsubst js2-node-is-descendant (node ancestor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4662 "Return t if NODE is a descendant of ANCESTOR."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4663 (while (and node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4664 (not (eq node ancestor)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4665 (setq node (js2-node-parent node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4666 node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4667
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4668 ;;; visitor infrastructure
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4669
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4670 (defun js2-visit-none (node callback)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4671 "Visitor for AST node that have no node children."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4672 nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4673
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4674 (defun js2-print-none (node indent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4675 "Visitor for AST node with no printed representation.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4676
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4677 (defun js2-print-body (node indent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4678 "Print a statement, or a block without braces."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4679 (if (js2-block-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4680 (dolist (kid (js2-block-node-kids node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4681 (js2-print-ast kid indent))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4682 (js2-print-ast node indent)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4683
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4684 (defun js2-print-list (args &optional delimiter)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4685 (loop with len = (length args)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4686 for arg in args
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4687 for count from 1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4688 do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4689 (js2-print-ast arg 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4690 (if (< count len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4691 (insert (or delimiter ", ")))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4692
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4693 (defun js2-print-tree (ast)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4694 "Prints an AST to the current buffer.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4695 Makes `js2-ast-parent-nodes' available to the printer functions."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4696 (let ((max-lisp-eval-depth (max max-lisp-eval-depth 1500)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4697 (js2-print-ast ast)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4698
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4699 (defun js2-print-ast (node &optional indent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4700 "Helper function for printing AST nodes.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4701 Requires `js2-ast-parent-nodes' to be non-nil.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4702 You should use `js2-print-tree' instead of this function."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4703 (let ((printer (get (aref node 0) 'js2-printer))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4704 (i (or indent 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4705 (pos (js2-node-abs-pos node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4706 ;; TODO: wedge comments in here somewhere
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4707 (if printer
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4708 (funcall printer node i))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4709
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4710 (defconst js2-side-effecting-tokens
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4711 (let ((tokens (make-bool-vector js2-num-tokens nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4712 (dolist (tt (list js2-ASSIGN
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4713 js2-ASSIGN_ADD
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4714 js2-ASSIGN_BITAND
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4715 js2-ASSIGN_BITOR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4716 js2-ASSIGN_BITXOR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4717 js2-ASSIGN_DIV
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4718 js2-ASSIGN_LSH
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4719 js2-ASSIGN_MOD
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4720 js2-ASSIGN_MUL
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4721 js2-ASSIGN_RSH
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4722 js2-ASSIGN_SUB
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4723 js2-ASSIGN_URSH
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4724 js2-BLOCK
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4725 js2-BREAK
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4726 js2-CALL
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4727 js2-CATCH
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4728 js2-CATCH_SCOPE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4729 js2-CONST
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4730 js2-CONTINUE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4731 js2-DEBUGGER
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4732 js2-DEC
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4733 js2-DELPROP
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4734 js2-DEL_REF
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4735 js2-DO
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4736 js2-ELSE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4737 js2-EMPTY
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4738 js2-ENTERWITH
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4739 js2-EXPORT
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4740 js2-EXPR_RESULT
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4741 js2-FINALLY
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4742 js2-FOR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4743 js2-FUNCTION
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4744 js2-GOTO
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4745 js2-IF
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4746 js2-IFEQ
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4747 js2-IFNE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4748 js2-IMPORT
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4749 js2-INC
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4750 js2-JSR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4751 js2-LABEL
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4752 js2-LEAVEWITH
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4753 js2-LET
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4754 js2-LETEXPR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4755 js2-LOCAL_BLOCK
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4756 js2-LOOP
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4757 js2-NEW
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4758 js2-REF_CALL
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4759 js2-RETHROW
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4760 js2-RETURN
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4761 js2-RETURN_RESULT
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4762 js2-SEMI
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4763 js2-SETELEM
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4764 js2-SETELEM_OP
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4765 js2-SETNAME
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4766 js2-SETPROP
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4767 js2-SETPROP_OP
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4768 js2-SETVAR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4769 js2-SET_REF
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4770 js2-SET_REF_OP
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4771 js2-SWITCH
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4772 js2-TARGET
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4773 js2-THROW
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4774 js2-TRY
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4775 js2-VAR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4776 js2-WHILE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4777 js2-WITH
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4778 js2-WITHEXPR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4779 js2-YIELD))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4780 (aset tokens tt t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4781 (if js2-instanceof-has-side-effects
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4782 (aset tokens js2-INSTANCEOF t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4783 tokens))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4784
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4785 (defun js2-node-has-side-effects (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4786 "Return t if NODE has side effects."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4787 (when node ; makes it easier to handle malformed expressions
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4788 (let ((tt (js2-node-type node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4789 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4790 ;; This doubtless needs some work, since EXPR_VOID is used
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4791 ;; in several ways in Rhino, and I may not have caught them all.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4792 ;; I'll wait for people to notice incorrect warnings.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4793 ((and (= tt js2-EXPR_VOID)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4794 (js2-expr-stmt-node-p node)) ; but not if EXPR_RESULT
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4795 (js2-node-has-side-effects (js2-expr-stmt-node-expr node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4796 ((= tt js2-COMMA)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4797 (js2-node-has-side-effects (js2-infix-node-right node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4798 ((or (= tt js2-AND)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4799 (= tt js2-OR))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4800 (or (js2-node-has-side-effects (js2-infix-node-right node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4801 (js2-node-has-side-effects (js2-infix-node-left node))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4802 ((= tt js2-HOOK)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4803 (and (js2-node-has-side-effects (js2-cond-node-true-expr node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4804 (js2-node-has-side-effects (js2-cond-node-false-expr node))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4805 ((js2-paren-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4806 (js2-node-has-side-effects (js2-paren-node-expr node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4807 ((= tt js2-ERROR) ; avoid cascaded error messages
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4808 nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4809 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4810 (aref js2-side-effecting-tokens tt))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4811
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4812 (defun js2-member-expr-leftmost-name (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4813 "For an expr such as foo.bar.baz, return leftmost node foo.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4814 NODE is any `js2-node' object. If it represents a member expression,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4815 which is any sequence of property gets, element-gets, function calls,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4816 or xml descendants/filter operators, then we look at the lexically
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4817 leftmost (first) node in the chain. If it is a name-node we return it.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4818 Note that NODE can be a raw name-node and it will be returned as well.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4819 If NODE is not a name-node or member expression, or if it is a member
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4820 expression whose leftmost target is not a name node, returns nil."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4821 (let ((continue t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4822 result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4823 (while (and continue (not result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4824 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4825 ((js2-name-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4826 (setq result node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4827 ((js2-prop-get-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4828 (setq node (js2-prop-get-node-left node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4829 ;; TODO: handle call-nodes, xml-nodes, others?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4830 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4831 (setq continue nil))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4832 result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4833
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4834 (defconst js2-stmt-node-types
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4835 (list js2-BLOCK
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4836 js2-BREAK
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4837 js2-CONTINUE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4838 js2-DEFAULT ; e4x "default xml namespace" statement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4839 js2-DO
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4840 js2-EXPR_RESULT
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4841 js2-EXPR_VOID
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4842 js2-FOR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4843 js2-IF
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4844 js2-RETURN
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4845 js2-SWITCH
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4846 js2-THROW
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4847 js2-TRY
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4848 js2-WHILE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4849 js2-WITH)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4850 "Node types that only appear in statement contexts.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4851 The list does not include nodes that always appear as the child
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4852 of another specific statement type, such as switch-cases,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4853 catch and finally blocks, and else-clauses. The list also excludes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4854 nodes like yield, let and var, which may appear in either expression
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4855 or statement context, and in the latter context always have a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4856 `js2-expr-stmt-node' parent. Finally, the list does not include
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4857 functions or scripts, which are treated separately from statements
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4858 by the JavaScript parser and runtime.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4859
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4860 (defun js2-stmt-node-p (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4861 "Heuristic for figuring out if NODE is a statement.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4862 Some node types can appear in either an expression context or a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4863 statement context, e.g. let-nodes, yield-nodes, and var-decl nodes.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4864 For these node types in a statement context, the parent will be a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4865 `js2-expr-stmt-node'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4866 Functions aren't included in the check."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4867 (memq (js2-node-type node) js2-stmt-node-types))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4868
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4869 (defsubst js2-mode-find-first-stmt (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4870 "Search upward starting from NODE looking for a statement.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4871 For purposes of this function, a `js2-function-node' counts."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4872 (while (not (or (js2-stmt-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4873 (js2-function-node-p node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4874 (setq node (js2-node-parent node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4875 node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4876
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4877 (defun js2-node-parent-stmt (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4878 "Return the node's first ancestor that is a statement.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4879 Returns nil if NODE is a `js2-ast-root'. Note that any expression
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4880 appearing in a statement context will have a parent that is a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4881 `js2-expr-stmt-node' that will be returned by this function."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4882 (let ((parent (js2-node-parent node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4883 (if (or (null parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4884 (js2-stmt-node-p parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4885 (and (js2-function-node-p parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4886 (not (eq (js2-function-node-form parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4887 'FUNCTION_EXPRESSION))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4888 parent
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4889 (js2-node-parent-stmt parent))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4890
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4891 ;; In the Mozilla Rhino sources, Roshan James writes:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4892 ;; Does consistent-return analysis on the function body when strict mode is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4893 ;; enabled.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4894 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4895 ;; function (x) { return (x+1) }
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4896 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4897 ;; is ok, but
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4898 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4899 ;; function (x) { if (x < 0) return (x+1); }
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4900 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4901 ;; is not because the function can potentially return a value when the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4902 ;; condition is satisfied and if not, the function does not explicitly
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4903 ;; return a value.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4904 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4905 ;; This extends to checking mismatches such as "return" and "return <value>"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4906 ;; used in the same function. Warnings are not emitted if inconsistent
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4907 ;; returns exist in code that can be statically shown to be unreachable.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4908 ;; Ex.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4909 ;; function (x) { while (true) { ... if (..) { return value } ... } }
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4910 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4911 ;; emits no warning. However if the loop had a break statement, then a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4912 ;; warning would be emitted.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4913 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4914 ;; The consistency analysis looks at control structures such as loops, ifs,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4915 ;; switch, try-catch-finally blocks, examines the reachable code paths and
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4916 ;; warns the user about an inconsistent set of termination possibilities.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4917 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4918 ;; These flags enumerate the possible ways a statement/function can
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4919 ;; terminate. These flags are used by endCheck() and by the Parser to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4920 ;; detect inconsistent return usage.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4921 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4922 ;; END_UNREACHED is reserved for code paths that are assumed to always be
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4923 ;; able to execute (example: throw, continue)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4924 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4925 ;; END_DROPS_OFF indicates if the statement can transfer control to the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4926 ;; next one. Statement such as return dont. A compound statement may have
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4927 ;; some branch that drops off control to the next statement.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4928 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4929 ;; END_RETURNS indicates that the statement can return with no value.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4930 ;; END_RETURNS_VALUE indicates that the statement can return a value.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4931 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4932 ;; A compound statement such as
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4933 ;; if (condition) {
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4934 ;; return value;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4935 ;; }
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4936 ;; Will be detected as (END_DROPS_OFF | END_RETURN_VALUE) by endCheck()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4937
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4938 (defconst js2-END_UNREACHED 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4939 (defconst js2-END_DROPS_OFF 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4940 (defconst js2-END_RETURNS 2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4941 (defconst js2-END_RETURNS_VALUE 4)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4942 (defconst js2-END_YIELDS 8)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4943
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4944 (defun js2-has-consistent-return-usage (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4945 "Check that every return usage in a function body is consistent.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4946 Returns t if the function satisfies strict mode requirement."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4947 (let ((n (js2-end-check node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4948 ;; either it doesn't return a value in any branch...
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4949 (or (js2-flag-not-set-p n js2-END_RETURNS_VALUE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4950 ;; or it returns a value (or is unreached) at every branch
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4951 (js2-flag-not-set-p n (logior js2-END_DROPS_OFF
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4952 js2-END_RETURNS
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4953 js2-END_YIELDS)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4954
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4955 (defun js2-end-check-if (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4956 "Returns in the then and else blocks must be consistent with each other.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4957 If there is no else block, then the return statement can fall through.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4958 Returns logical OR of END_* flags"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4959 (let ((th (js2-if-node-then-part node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4960 (el (js2-if-node-else-part node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4961 (if (null th)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4962 js2-END_UNREACHED
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4963 (logior (js2-end-check th) (if el
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4964 (js2-end-check el)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4965 js2-END_DROPS_OFF)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4966
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4967 (defun js2-end-check-switch (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4968 "Consistency of return statements is checked between the case statements.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4969 If there is no default, then the switch can fall through. If there is a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4970 default, we check to see if all code paths in the default return or if
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4971 there is a code path that can fall through.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4972 Returns logical OR of END_* flags."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4973 (let ((rv js2-END_UNREACHED)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4974 default-case)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4975 ;; examine the cases
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4976 (catch 'break
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4977 (dolist (c (js2-switch-node-cases node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4978 (if (js2-case-node-expr c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4979 (js2-set-flag rv (js2-end-check-block c))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4980 (setq default-case c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4981 (throw 'break nil))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4982 ;; we don't care how the cases drop into each other
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4983 (js2-clear-flag rv js2-END_DROPS_OFF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4984 ;; examine the default
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4985 (js2-set-flag rv (if default-case
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4986 (js2-end-check default-case)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4987 js2-END_DROPS_OFF))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4988 rv))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4989
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4990 (defun js2-end-check-try (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4991 "If the block has a finally, return consistency is checked in the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4992 finally block. If all code paths in the finally return, then the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4993 returns in the try-catch blocks don't matter. If there is a code path
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4994 that does not return or if there is no finally block, the returns
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4995 of the try and catch blocks are checked for mismatch.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4996 Returns logical OR of END_* flags."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4997 (let ((finally (js2-try-node-finally-block node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4998 rv)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
4999 ;; check the finally if it exists
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5000 (setq rv (if finally
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5001 (js2-end-check (js2-finally-node-body finally))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5002 js2-END_DROPS_OFF))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5003 ;; If the finally block always returns, then none of the returns
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5004 ;; in the try or catch blocks matter.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5005 (when (js2-flag-set-p rv js2-END_DROPS_OFF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5006 (js2-clear-flag rv js2-END_DROPS_OFF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5007 ;; examine the try block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5008 (js2-set-flag rv (js2-end-check (js2-try-node-try-block node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5009 ;; check each catch block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5010 (dolist (cb (js2-try-node-catch-clauses node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5011 (js2-set-flag rv (js2-end-check (js2-catch-node-block cb)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5012 rv))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5013
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5014 (defun js2-end-check-loop (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5015 "Return statement in the loop body must be consistent. The default
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5016 assumption for any kind of a loop is that it will eventually terminate.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5017 The only exception is a loop with a constant true condition. Code that
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5018 follows such a loop is examined only if one can statically determine
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5019 that there is a break out of the loop.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5020
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5021 for(... ; ... ; ...) {}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5022 for(... in ... ) {}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5023 while(...) { }
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5024 do { } while(...)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5025
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5026 Returns logical OR of END_* flags."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5027 (let ((rv (js2-end-check (js2-loop-node-body node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5028 (condition (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5029 ((js2-while-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5030 (js2-while-node-condition node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5031 ((js2-do-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5032 (js2-do-node-condition node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5033 ((js2-for-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5034 (js2-for-node-condition node)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5035
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5036 ;; check to see if the loop condition is always true
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5037 (if (and condition
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5038 (eq (js2-always-defined-boolean-p condition) 'ALWAYS_TRUE))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5039 (js2-clear-flag rv js2-END_DROPS_OFF))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5040
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5041 ;; look for effect of breaks
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5042 (js2-set-flag rv (js2-node-get-prop node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5043 'CONTROL_BLOCK_PROP
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5044 js2-END_UNREACHED))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5045 rv))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5046
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5047 (defun js2-end-check-block (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5048 "A general block of code is examined statement by statement.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5049 If any statement (even a compound one) returns in all branches, then
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5050 subsequent statements are not examined.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5051 Returns logical OR of END_* flags."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5052 (let* ((rv js2-END_DROPS_OFF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5053 (kids (js2-block-node-kids node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5054 (n (car kids)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5055 ;; Check each statment. If the statement can continue onto the next
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5056 ;; one (i.e. END_DROPS_OFF is set), then check the next statement.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5057 (while (and n (js2-flag-set-p rv js2-END_DROPS_OFF))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5058 (js2-clear-flag rv js2-END_DROPS_OFF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5059 (js2-set-flag rv (js2-end-check n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5060 (setq kids (cdr kids)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5061 n (car kids)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5062 rv))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5063
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5064 (defun js2-end-check-label (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5065 "A labeled statement implies that there may be a break to the label.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5066 The function processes the labeled statement and then checks the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5067 CONTROL_BLOCK_PROP property to see if there is ever a break to the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5068 particular label.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5069 Returns logical OR of END_* flags."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5070 (let ((rv (js2-end-check (js2-labeled-stmt-node-stmt node))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5071 (logior rv (js2-node-get-prop node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5072 'CONTROL_BLOCK_PROP
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5073 js2-END_UNREACHED))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5074
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5075 (defun js2-end-check-break (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5076 "When a break is encountered annotate the statement being broken
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5077 out of by setting its CONTROL_BLOCK_PROP property.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5078 Returns logical OR of END_* flags."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5079 (and (js2-break-node-target node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5080 (js2-node-set-prop (js2-break-node-target node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5081 'CONTROL_BLOCK_PROP
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5082 js2-END_DROPS_OFF))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5083 js2-END_UNREACHED)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5084
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5085 (defun js2-end-check (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5086 "Examine the body of a function, doing a basic reachability analysis.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5087 Returns a combination of flags END_* flags that indicate
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5088 how the function execution can terminate. These constitute only the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5089 pessimistic set of termination conditions. It is possible that at
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5090 runtime certain code paths will never be actually taken. Hence this
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5091 analysis will flag errors in cases where there may not be errors.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5092 Returns logical OR of END_* flags"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5093 (let (kid)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5094 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5095 ((js2-break-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5096 (js2-end-check-break node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5097 ((js2-expr-stmt-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5098 (if (setq kid (js2-expr-stmt-node-expr node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5099 (js2-end-check kid)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5100 js2-END_DROPS_OFF))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5101 ((or (js2-continue-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5102 (js2-throw-node-p node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5103 js2-END_UNREACHED)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5104 ((js2-return-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5105 (if (setq kid (js2-return-node-retval node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5106 js2-END_RETURNS_VALUE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5107 js2-END_RETURNS))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5108 ((js2-loop-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5109 (js2-end-check-loop node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5110 ((js2-switch-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5111 (js2-end-check-switch node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5112 ((js2-labeled-stmt-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5113 (js2-end-check-label node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5114 ((js2-if-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5115 (js2-end-check-if node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5116 ((js2-try-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5117 (js2-end-check-try node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5118 ((js2-block-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5119 (if (null (js2-block-node-kids node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5120 js2-END_DROPS_OFF
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5121 (js2-end-check-block node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5122 ((js2-yield-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5123 js2-END_YIELDS)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5124 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5125 js2-END_DROPS_OFF))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5126
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5127 (defun js2-always-defined-boolean-p (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5128 "Check if NODE always evaluates to true or false in boolean context.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5129 Returns 'ALWAYS_TRUE, 'ALWAYS_FALSE, or nil if it's neither always true
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5130 nor always false."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5131 (let ((tt (js2-node-type node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5132 num)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5133 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5134 ((or (= tt js2-FALSE) (= tt js2-NULL))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5135 'ALWAYS_FALSE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5136 ((= tt js2-TRUE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5137 'ALWAYS_TRUE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5138 ((= tt js2-NUMBER)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5139 (setq num (js2-number-node-num-value node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5140 (if (and (not (eq num 0.0e+NaN))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5141 (not (zerop num)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5142 'ALWAYS_TRUE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5143 'ALWAYS_FALSE))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5144 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5145 nil))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5146
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5147 ;;; Scanner -- a port of Mozilla Rhino's lexer.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5148 ;; Corresponds to Rhino files Token.java and TokenStream.java.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5149
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5150 (defvar js2-tokens nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5151 "List of all defined token names.") ; initialized in `js2-token-names'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5152
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5153 (defconst js2-token-names
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5154 (let* ((names (make-vector js2-num-tokens -1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5155 (case-fold-search nil) ; only match js2-UPPER_CASE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5156 (syms (apropos-internal "^js2-\\(?:[A-Z_]+\\)")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5157 (loop for sym in syms
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5158 for i from 0
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5159 do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5160 (unless (or (memq sym '(js2-EOF_CHAR js2-ERROR))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5161 (not (boundp sym)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5162 (aset names (symbol-value sym) ; code, e.g. 152
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5163 (substring (symbol-name sym) 4)) ; name, e.g. "LET"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5164 (push sym js2-tokens)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5165 names)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5166 "Vector mapping int values to token string names, sans `js2-' prefix.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5167
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5168 (defun js2-token-name (tok)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5169 "Return a string name for TOK, a token symbol or code.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5170 Signals an error if it's not a recognized token."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5171 (let ((code tok))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5172 (if (symbolp tok)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5173 (setq code (symbol-value tok)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5174 (if (eq code -1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5175 "ERROR"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5176 (if (and (numberp code)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5177 (not (minusp code))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5178 (< code js2-num-tokens))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5179 (aref js2-token-names code)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5180 (error "Invalid token: %s" code)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5181
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5182 (defsubst js2-token-sym (tok)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5183 "Return symbol for TOK given its code, e.g. 'js2-LP for code 86."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5184 (intern (js2-token-name tok)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5185
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5186 (defconst js2-token-codes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5187 (let ((table (make-hash-table :test 'eq :size 256)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5188 (loop for name across js2-token-names
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5189 for sym = (intern (concat "js2-" name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5190 do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5191 (puthash sym (symbol-value sym) table))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5192 ;; clean up a few that are "wrong" in Rhino's token codes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5193 (puthash 'js2-DELETE js2-DELPROP table)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5194 table)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5195 "Hashtable mapping token symbols to their bytecodes.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5196
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5197 (defsubst js2-token-code (sym)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5198 "Return code for token symbol SYM, e.g. 86 for 'js2-LP."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5199 (or (gethash sym js2-token-codes)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5200 (error "Invalid token symbol: %s " sym))) ; signal code bug
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5201
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5202 (defsubst js2-report-scan-error (msg &optional no-throw beg len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5203 (setq js2-token-end js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5204 (js2-report-error msg nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5205 (or beg js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5206 (or len (- js2-token-end js2-token-beg)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5207 (unless no-throw
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5208 (throw 'return js2-ERROR)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5209
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5210 (defsubst js2-get-string-from-buffer ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5211 "Reverse the char accumulator and return it as a string."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5212 (setq js2-token-end js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5213 (if js2-ts-string-buffer
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5214 (apply #'string (nreverse js2-ts-string-buffer))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5215 ""))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5216
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5217 ;; TODO: could potentially avoid a lot of consing by allocating a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5218 ;; char buffer the way Rhino does.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5219 (defsubst js2-add-to-string (c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5220 (push c js2-ts-string-buffer))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5221
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5222 ;; Note that when we "read" the end-of-file, we advance js2-ts-cursor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5223 ;; to (1+ (point-max)), which lets the scanner treat end-of-file like
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5224 ;; any other character: when it's not part of the current token, we
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5225 ;; unget it, allowing it to be read again by the following call.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5226 (defsubst js2-unget-char ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5227 (decf js2-ts-cursor))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5228
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5229 ;; Rhino distinguishes \r and \n line endings. We don't need to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5230 ;; because we only scan from Emacs buffers, which always use \n.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5231 (defsubst js2-get-char ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5232 "Read and return the next character from the input buffer.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5233 Increments `js2-ts-lineno' if the return value is a newline char.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5234 Updates `js2-ts-cursor' to the point after the returned char.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5235 Returns `js2-EOF_CHAR' if we hit the end of the buffer.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5236 Also updates `js2-ts-hit-eof' and `js2-ts-line-start' as needed."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5237 (let (c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5238 ;; check for end of buffer
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5239 (if (>= js2-ts-cursor (point-max))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5240 (setq js2-ts-hit-eof t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5241 js2-ts-cursor (1+ js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5242 c js2-EOF_CHAR) ; return value
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5243 ;; otherwise read next char
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5244 (setq c (char-before (incf js2-ts-cursor)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5245 ;; if we read a newline, update counters
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5246 (if (= c ?\n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5247 (setq js2-ts-line-start js2-ts-cursor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5248 js2-ts-lineno (1+ js2-ts-lineno)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5249 ;; TODO: skip over format characters
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5250 c)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5251
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5252 (defsubst js2-read-unicode-escape ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5253 "Read a \\uNNNN sequence from the input.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5254 Assumes the ?\ and ?u have already been read.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5255 Returns the unicode character, or nil if it wasn't a valid character.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5256 Doesn't change the values of any scanner variables."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5257 ;; I really wish I knew a better way to do this, but I can't
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5258 ;; find the Emacs function that takes a 16-bit int and converts
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5259 ;; it to a Unicode/utf-8 character. So I basically eval it with (read).
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5260 ;; Have to first check that it's 4 hex characters or it may stop
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5261 ;; the read early.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5262 (ignore-errors
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5263 (let ((s (buffer-substring-no-properties js2-ts-cursor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5264 (+ 4 js2-ts-cursor))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5265 (if (string-match "[a-zA-Z0-9]\\{4\\}" s)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5266 (read (concat "?\\u" s))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5267
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5268 (defsubst js2-match-char (test)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5269 "Consume and return next character if it matches TEST, a character.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5270 Returns nil and consumes nothing if TEST is not the next character."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5271 (let ((c (js2-get-char)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5272 (if (eq c test)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5273 t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5274 (js2-unget-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5275 nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5276
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5277 (defsubst js2-peek-char ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5278 (prog1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5279 (js2-get-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5280 (js2-unget-char)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5281
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5282 (defsubst js2-java-identifier-start-p (c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5283 (or
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5284 (memq c '(?$ ?_))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5285 (js2-char-uppercase-p c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5286 (js2-char-lowercase-p c)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5287
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5288 (defsubst js2-java-identifier-part-p (c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5289 "Implementation of java.lang.Character.isJavaIdentifierPart()"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5290 ;; TODO: make me Unicode-friendly. See comments above.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5291 (or
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5292 (memq c '(?$ ?_))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5293 (js2-char-uppercase-p c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5294 (js2-char-lowercase-p c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5295 (and (>= c ?0) (<= c ?9))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5296
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5297 (defsubst js2-alpha-p (c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5298 (cond ((and (<= ?A c) (<= c ?Z)) t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5299 ((and (<= ?a c) (<= c ?z)) t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5300 (t nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5301
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5302 (defsubst js2-digit-p (c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5303 (and (<= ?0 c) (<= c ?9)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5304
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5305 (defsubst js2-js-space-p (c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5306 (if (<= c 127)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5307 (memq c '(#x20 #x9 #xB #xC #xD))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5308 (or
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5309 (eq c #xA0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5310 ;; TODO: change this nil to check for Unicode space character
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5311 nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5312
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5313 (defconst js2-eol-chars (list js2-EOF_CHAR ?\n ?\r))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5314
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5315 (defsubst js2-skip-line ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5316 "Skip to end of line"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5317 (let (c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5318 (while (not (memq (setq c (js2-get-char)) js2-eol-chars)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5319 (js2-unget-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5320 (setq js2-token-end js2-ts-cursor)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5321
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5322 (defun js2-init-scanner (&optional buf line)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5323 "Create token stream for BUF starting on LINE.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5324 BUF defaults to current-buffer and line defaults to 1.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5325
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5326 A buffer can only have one scanner active at a time, which yields
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5327 dramatically simpler code than using a defstruct. If you need to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5328 have simultaneous scanners in a buffer, copy the regions to scan
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5329 into temp buffers."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5330 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5331 (when buf
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5332 (set-buffer buf))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5333 (setq js2-ts-dirty-line nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5334 js2-ts-regexp-flags nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5335 js2-ts-string ""
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5336 js2-ts-number nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5337 js2-ts-hit-eof nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5338 js2-ts-line-start 0
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5339 js2-ts-lineno (or line 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5340 js2-ts-line-end-char -1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5341 js2-ts-cursor (point-min)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5342 js2-ts-is-xml-attribute nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5343 js2-ts-xml-is-tag-content nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5344 js2-ts-xml-open-tags-count 0
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5345 js2-ts-string-buffer nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5346
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5347 ;; This function uses the cached op, string and number fields in
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5348 ;; TokenStream; if getToken has been called since the passed token
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5349 ;; was scanned, the op or string printed may be incorrect.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5350 (defun js2-token-to-string (token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5351 ;; Not sure where this function is used in Rhino. Not tested.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5352 (if (not js2-debug-print-trees)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5353 ""
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5354 (let ((name (js2-token-name token)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5355 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5356 ((memq token (list js2-STRING js2-REGEXP js2-NAME))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5357 (concat name " `" js2-ts-string "'"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5358 ((eq token js2-NUMBER)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5359 (format "NUMBER %g" js2-ts-number))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5360 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5361 name)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5362
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5363 (defconst js2-keywords
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5364 '(break
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5365 case catch const continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5366 debugger default delete do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5367 else enum
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5368 false finally for function
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5369 if in instanceof import
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5370 let
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5371 new null
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5372 return
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5373 switch
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5374 this throw true try typeof
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5375 var void
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5376 while with
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5377 yield))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5378
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5379 ;; Token names aren't exactly the same as the keywords, unfortunately.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5380 ;; E.g. enum isn't in the tokens, and delete is js2-DELPROP.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5381 (defconst js2-kwd-tokens
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5382 (let ((table (make-vector js2-num-tokens nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5383 (tokens
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5384 (list js2-BREAK
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5385 js2-CASE js2-CATCH js2-CONST js2-CONTINUE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5386 js2-DEBUGGER js2-DEFAULT js2-DELPROP js2-DO
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5387 js2-ELSE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5388 js2-FALSE js2-FINALLY js2-FOR js2-FUNCTION
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5389 js2-IF js2-IN js2-INSTANCEOF js2-IMPORT
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5390 js2-LET
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5391 js2-NEW js2-NULL
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5392 js2-RETURN
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5393 js2-SWITCH
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5394 js2-THIS js2-THROW js2-TRUE js2-TRY js2-TYPEOF
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5395 js2-VAR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5396 js2-WHILE js2-WITH
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5397 js2-YIELD)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5398 (dolist (i tokens)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5399 (aset table i 'font-lock-keyword-face))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5400 (aset table js2-STRING 'font-lock-string-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5401 (aset table js2-REGEXP 'font-lock-string-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5402 (aset table js2-COMMENT 'font-lock-comment-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5403 (aset table js2-THIS 'font-lock-builtin-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5404 (aset table js2-VOID 'font-lock-constant-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5405 (aset table js2-NULL 'font-lock-constant-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5406 (aset table js2-TRUE 'font-lock-constant-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5407 (aset table js2-FALSE 'font-lock-constant-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5408 table)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5409 "Vector whose values are non-nil for tokens that are keywords.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5410 The values are default faces to use for highlighting the keywords.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5411
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5412 (defconst js2-reserved-words
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5413 '(abstract
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5414 boolean byte
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5415 char class
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5416 double
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5417 enum export extends
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5418 final float
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5419 goto
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5420 implements import int interface
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5421 long
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5422 native
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5423 package private protected public
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5424 short static super synchronized
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5425 throws transient
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5426 volatile))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5427
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5428 (defconst js2-keyword-names
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5429 (let ((table (make-hash-table :test 'equal)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5430 (loop for k in js2-keywords
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5431 do (puthash
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5432 (symbol-name k) ; instanceof
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5433 (intern (concat "js2-"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5434 (upcase (symbol-name k)))) ; js2-INSTANCEOF
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5435 table))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5436 table)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5437 "JavaScript keywords by name, mapped to their symbols.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5438
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5439 (defconst js2-reserved-word-names
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5440 (let ((table (make-hash-table :test 'equal)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5441 (loop for k in js2-reserved-words
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5442 do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5443 (puthash (symbol-name k) 'js2-RESERVED table))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5444 table)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5445 "JavaScript reserved words by name, mapped to 'js2-RESERVED.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5446
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5447 (defsubst js2-collect-string (buf)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5448 "Convert BUF, a list of chars, to a string.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5449 Reverses BUF before converting."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5450 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5451 ((stringp buf)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5452 buf)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5453 ((null buf) ; for emacs21 compat
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5454 "")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5455 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5456 (if buf
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5457 (apply #'string (nreverse buf))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5458 ""))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5459
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5460 (defun js2-string-to-keyword (s)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5461 "Return token for S, a string, if S is a keyword or reserved word.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5462 Returns a symbol such as 'js2-BREAK, or nil if not keyword/reserved."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5463 (or (gethash s js2-keyword-names)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5464 (gethash s js2-reserved-word-names)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5465
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5466 (defsubst js2-ts-set-char-token-bounds ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5467 "Used when next token is one character."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5468 (setq js2-token-beg (1- js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5469 js2-token-end js2-ts-cursor))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5470
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5471 (defsubst js2-ts-return (token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5472 "Return an N-character TOKEN from `js2-get-token'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5473 Updates `js2-token-end' accordingly."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5474 (setq js2-token-end js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5475 (throw 'return token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5476
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5477 (defsubst js2-x-digit-to-int (c accumulator)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5478 "Build up a hex number.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5479 If C is a hexadecimal digit, return ACCUMULATOR * 16 plus
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5480 corresponding number. Otherwise return -1."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5481 (catch 'return
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5482 (catch 'check
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5483 ;; Use 0..9 < A..Z < a..z
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5484 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5485 ((<= c ?9)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5486 (decf c ?0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5487 (if (<= 0 c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5488 (throw 'check nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5489 ((<= c ?F)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5490 (when (<= ?A c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5491 (decf c (- ?A 10))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5492 (throw 'check nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5493 ((<= c ?f)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5494 (when (<= ?a c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5495 (decf c (- ?a 10))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5496 (throw 'check nil))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5497 (throw 'return -1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5498 (logior c (lsh accumulator 4))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5499
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5500 (defun js2-get-token ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5501 "Return next JavaScript token, an int such as js2-RETURN."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5502 (let (c
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5503 c1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5504 identifier-start
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5505 is-unicode-escape-start
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5506 contains-escape
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5507 escape-val
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5508 escape-start
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5509 str
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5510 result
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5511 base
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5512 is-integer
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5513 quote-char
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5514 val
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5515 look-for-slash
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5516 continue)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5517 (catch 'return
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5518 (while t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5519 ;; Eat whitespace, possibly sensitive to newlines.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5520 (setq continue t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5521 (while continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5522 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5523 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5524 ((eq c js2-EOF_CHAR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5525 (js2-ts-set-char-token-bounds)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5526 (throw 'return js2-EOF))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5527 ((eq c ?\n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5528 (js2-ts-set-char-token-bounds)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5529 (setq js2-ts-dirty-line nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5530 (throw 'return js2-EOL))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5531 ((not (js2-js-space-p c))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5532 (if (/= c ?-) ; in case end of HTML comment
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5533 (setq js2-ts-dirty-line t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5534 (setq continue nil))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5535 ;; Assume the token will be 1 char - fixed up below.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5536 (js2-ts-set-char-token-bounds)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5537 (when (eq c ?@)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5538 (throw 'return js2-XMLATTR))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5539 ;; identifier/keyword/instanceof?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5540 ;; watch out for starting with a <backslash>
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5541 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5542 ((eq c ?\\)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5543 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5544 (if (eq c ?u)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5545 (setq identifier-start t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5546 is-unicode-escape-start t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5547 js2-ts-string-buffer nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5548 (setq identifier-start nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5549 (js2-unget-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5550 (setq c ?\\)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5551 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5552 (when (setq identifier-start (js2-java-identifier-start-p c))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5553 (setq js2-ts-string-buffer nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5554 (js2-add-to-string c))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5555 (when identifier-start
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5556 (setq contains-escape is-unicode-escape-start)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5557 (catch 'break
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5558 (while t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5559 (if is-unicode-escape-start
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5560 ;; strictly speaking we should probably push-back
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5561 ;; all the bad characters if the <backslash>uXXXX
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5562 ;; sequence is malformed. But since there isn't a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5563 ;; correct context(is there?) for a bad Unicode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5564 ;; escape sequence in an identifier, we can report
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5565 ;; an error here.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5566 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5567 (setq escape-val 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5568 (dotimes (i 4)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5569 (setq c (js2-get-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5570 escape-val (js2-x-digit-to-int c escape-val))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5571 ;; Next check takes care of c < 0 and bad escape
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5572 (if (minusp escape-val)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5573 (throw 'break nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5574 (if (minusp escape-val)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5575 (js2-report-scan-error "msg.invalid.escape" t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5576 (js2-add-to-string escape-val)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5577 (setq is-unicode-escape-start nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5578 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5579 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5580 ((eq c ?\\)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5581 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5582 (if (eq c ?u)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5583 (setq is-unicode-escape-start t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5584 contains-escape t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5585 (js2-report-scan-error "msg.illegal.character" t)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5586 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5587 (if (or (eq c js2-EOF_CHAR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5588 (not (js2-java-identifier-part-p c)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5589 (throw 'break nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5590 (js2-add-to-string c))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5591 (js2-unget-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5592 (setq str (js2-get-string-from-buffer))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5593 (unless contains-escape
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5594 ;; OPT we shouldn't have to make a string (object!) to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5595 ;; check if it's a keyword.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5596 ;; Return the corresponding token if it's a keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5597 (when (setq result (js2-string-to-keyword str))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5598 (if (and (< js2-language-version 170)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5599 (memq result '(js2-LET js2-YIELD)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5600 ;; LET and YIELD are tokens only in 1.7 and later
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5601 (setq result 'js2-NAME))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5602 (if (not (eq result js2-RESERVED))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5603 (throw 'return (js2-token-code result)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5604 (js2-report-warning "msg.reserved.keyword" str)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5605 ;; If we want to intern these as Rhino does, just use (intern str)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5606 (setq js2-ts-string str)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5607 (throw 'return js2-NAME)) ; end identifier/kwd check
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5608 ;; is it a number?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5609 (when (or (js2-digit-p c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5610 (and (eq c ?.) (js2-digit-p (js2-peek-char))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5611 (setq js2-ts-string-buffer nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5612 base 10)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5613 (when (eq c ?0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5614 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5615 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5616 ((or (eq c ?x) (eq c ?X))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5617 (setq base 16)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5618 (setq c (js2-get-char)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5619 ((js2-digit-p c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5620 (setq base 8))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5621 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5622 (js2-add-to-string ?0))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5623 (if (eq base 16)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5624 (while (<= 0 (js2-x-digit-to-int c 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5625 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5626 (setq c (js2-get-char)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5627 (while (and (<= ?0 c) (<= c ?9))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5628 ;; We permit 08 and 09 as decimal numbers, which
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5629 ;; makes our behavior a superset of the ECMA
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5630 ;; numeric grammar. We might not always be so
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5631 ;; permissive, so we warn about it.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5632 (when (and (eq base 8) (>= c ?8))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5633 (js2-report-warning "msg.bad.octal.literal"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5634 (if (eq c ?8) "8" "9"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5635 (setq base 10))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5636 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5637 (setq c (js2-get-char))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5638 (setq is-integer t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5639 (when (and (eq base 10) (memq c '(?. ?e ?E)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5640 (setq is-integer nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5641 (when (eq c ?.)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5642 (loop do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5643 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5644 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5645 while (js2-digit-p c)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5646 (when (memq c '(?e ?E))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5647 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5648 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5649 (when (memq c '(?+ ?-))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5650 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5651 (setq c (js2-get-char)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5652 (unless (js2-digit-p c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5653 (js2-report-scan-error "msg.missing.exponent" t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5654 (loop do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5655 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5656 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5657 while (js2-digit-p c))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5658 (js2-unget-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5659 (setq js2-ts-string (js2-get-string-from-buffer)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5660 js2-ts-number
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5661 (if (and (eq base 10) (not is-integer))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5662 (string-to-number js2-ts-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5663 ;; TODO: call runtime number-parser. Some of it is in
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5664 ;; js2-util.el, but I need to port ScriptRuntime.stringToNumber.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5665 (string-to-number js2-ts-string)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5666 (throw 'return js2-NUMBER))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5667 ;; is it a string?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5668 (when (memq c '(?\" ?\'))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5669 ;; We attempt to accumulate a string the fast way, by
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5670 ;; building it directly out of the reader. But if there
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5671 ;; are any escaped characters in the string, we revert to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5672 ;; building it out of a string buffer.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5673 (setq quote-char c
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5674 js2-ts-string-buffer nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5675 c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5676 (catch 'break
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5677 (while (/= c quote-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5678 (catch 'continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5679 (when (or (eq c ?\n) (eq c js2-EOF_CHAR))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5680 (js2-unget-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5681 (setq js2-token-end js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5682 (js2-report-error "msg.unterminated.string.lit")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5683 (throw 'return js2-STRING))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5684 (when (eq c ?\\)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5685 ;; We've hit an escaped character
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5686 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5687 (case c
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5688 (?b (setq c ?\b))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5689 (?f (setq c ?\f))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5690 (?n (setq c ?\n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5691 (?r (setq c ?\r))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5692 (?t (setq c ?\t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5693 (?v (setq c ?\v))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5694 (?u
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5695 (setq c1 (js2-read-unicode-escape))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5696 (if js2-parse-ide-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5697 (if c1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5698 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5699 ;; just copy the string in IDE-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5700 (js2-add-to-string ?\\)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5701 (js2-add-to-string ?u)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5702 (dotimes (i 3)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5703 (js2-add-to-string (js2-get-char)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5704 (setq c (js2-get-char))) ; added at end of loop
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5705 ;; flag it as an invalid escape
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5706 (js2-report-warning "msg.invalid.escape"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5707 nil (- js2-ts-cursor 2) 6))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5708 ;; Get 4 hex digits; if the u escape is not
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5709 ;; followed by 4 hex digits, use 'u' + the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5710 ;; literal character sequence that follows.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5711 (js2-add-to-string ?u)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5712 (setq escape-val 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5713 (dotimes (i 4)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5714 (setq c (js2-get-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5715 escape-val (js2-x-digit-to-int c escape-val))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5716 (if (minusp escape-val)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5717 (throw 'continue nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5718 (js2-add-to-string c))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5719 ;; prepare for replace of stored 'u' sequence by escape value
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5720 (setq js2-ts-string-buffer (nthcdr 5 js2-ts-string-buffer)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5721 c escape-val)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5722 (?x
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5723 ;; Get 2 hex digits, defaulting to 'x'+literal
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5724 ;; sequence, as above.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5725 (setq c (js2-get-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5726 escape-val (js2-x-digit-to-int c 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5727 (if (minusp escape-val)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5728 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5729 (js2-add-to-string ?x)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5730 (throw 'continue nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5731 (setq c1 c
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5732 c (js2-get-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5733 escape-val (js2-x-digit-to-int c escape-val))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5734 (if (minusp escape-val)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5735 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5736 (js2-add-to-string ?x)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5737 (js2-add-to-string c1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5738 (throw 'continue nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5739 ;; got 2 hex digits
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5740 (setq c escape-val))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5741 (?\n
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5742 ;; Remove line terminator after escape to follow
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5743 ;; SpiderMonkey and C/C++
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5744 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5745 (throw 'continue nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5746 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5747 (when (and (<= ?0 c) (< c ?8))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5748 (setq val (- c ?0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5749 c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5750 (when (and (<= ?0 c) (< c ?8))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5751 (setq val (- (+ (* 8 val) c) ?0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5752 c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5753 (when (and (<= ?0 c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5754 (< c ?8)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5755 (< val #o37))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5756 ;; c is 3rd char of octal sequence only
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5757 ;; if the resulting val <= 0377
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5758 (setq val (- (+ (* 8 val) c) ?0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5759 c (js2-get-char))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5760 (js2-unget-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5761 (setq c val)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5762 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5763 (setq c (js2-get-char)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5764 (setq js2-ts-string (js2-get-string-from-buffer))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5765 (throw 'return js2-STRING))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5766 (case c
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5767 (?\;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5768 (throw 'return js2-SEMI))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5769 (?\[
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5770 (throw 'return js2-LB))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5771 (?\]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5772 (throw 'return js2-RB))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5773 (?{
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5774 (throw 'return js2-LC))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5775 (?}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5776 (throw 'return js2-RC))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5777 (?\(
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5778 (throw 'return js2-LP))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5779 (?\)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5780 (throw 'return js2-RP))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5781 (?,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5782 (throw 'return js2-COMMA))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5783 (??
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5784 (throw 'return js2-HOOK))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5785 (?:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5786 (if (js2-match-char ?:)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5787 (js2-ts-return js2-COLONCOLON)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5788 (throw 'return js2-COLON)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5789 (?.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5790 (if (js2-match-char ?.)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5791 (js2-ts-return js2-DOTDOT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5792 (if (js2-match-char ?\()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5793 (js2-ts-return js2-DOTQUERY)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5794 (throw 'return js2-DOT))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5795 (?|
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5796 (if (js2-match-char ?|)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5797 (throw 'return js2-OR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5798 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5799 (js2-ts-return js2-ASSIGN_BITOR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5800 (throw 'return js2-BITOR))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5801 (?^
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5802 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5803 (js2-ts-return js2-ASSIGN_BITOR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5804 (throw 'return js2-BITXOR)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5805 (?&
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5806 (if (js2-match-char ?&)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5807 (throw 'return js2-AND)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5808 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5809 (js2-ts-return js2-ASSIGN_BITAND)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5810 (throw 'return js2-BITAND))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5811 (?=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5812 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5813 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5814 (js2-ts-return js2-SHEQ)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5815 (throw 'return js2-EQ))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5816 (throw 'return js2-ASSIGN)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5817 (?!
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5818 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5819 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5820 (js2-ts-return js2-SHNE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5821 (js2-ts-return js2-NE))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5822 (throw 'return js2-NOT)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5823 (?<
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5824 ;; NB:treat HTML begin-comment as comment-till-eol
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5825 (when (js2-match-char ?!)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5826 (when (js2-match-char ?-)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5827 (when (js2-match-char ?-)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5828 (js2-skip-line)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5829 (setq js2-ts-comment-type 'html)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5830 (throw 'return js2-COMMENT)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5831 (js2-unget-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5832 (if (js2-match-char ?<)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5833 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5834 (js2-ts-return js2-ASSIGN_LSH)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5835 (js2-ts-return js2-LSH))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5836 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5837 (js2-ts-return js2-LE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5838 (throw 'return js2-LT))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5839 (?>
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5840 (if (js2-match-char ?>)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5841 (if (js2-match-char ?>)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5842 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5843 (js2-ts-return js2-ASSIGN_URSH)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5844 (js2-ts-return js2-URSH))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5845 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5846 (js2-ts-return js2-ASSIGN_RSH)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5847 (js2-ts-return js2-RSH)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5848 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5849 (js2-ts-return js2-GE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5850 (throw 'return js2-GT))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5851 (?*
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5852 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5853 (js2-ts-return js2-ASSIGN_MUL)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5854 (throw 'return js2-MUL)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5855 (?/
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5856 ;; is it a // comment?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5857 (when (js2-match-char ?/)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5858 (setq js2-token-beg (- js2-ts-cursor 2))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5859 (js2-skip-line)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5860 (setq js2-ts-comment-type 'line)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5861 ;; include newline so highlighting goes to end of window
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5862 (incf js2-token-end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5863 (throw 'return js2-COMMENT))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5864 ;; is it a /* comment?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5865 (when (js2-match-char ?*)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5866 (setq look-for-slash nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5867 js2-token-beg (- js2-ts-cursor 2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5868 js2-ts-comment-type
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5869 (if (js2-match-char ?*)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5870 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5871 (setq look-for-slash t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5872 'jsdoc)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5873 'block))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5874 (while t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5875 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5876 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5877 ((eq c js2-EOF_CHAR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5878 (setq js2-token-end (1- js2-ts-cursor))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5879 (js2-report-error "msg.unterminated.comment")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5880 (throw 'return js2-COMMENT))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5881 ((eq c ?*)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5882 (setq look-for-slash t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5883 ((eq c ?/)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5884 (if look-for-slash
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5885 (js2-ts-return js2-COMMENT)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5886 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5887 (setq look-for-slash nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5888 js2-token-end js2-ts-cursor)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5889 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5890 (js2-ts-return js2-ASSIGN_DIV)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5891 (throw 'return js2-DIV)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5892 (?#
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5893 (when js2-skip-preprocessor-directives
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5894 (js2-skip-line)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5895 (setq js2-ts-comment-type 'preprocessor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5896 js2-token-end js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5897 (throw 'return js2-COMMENT))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5898 (throw 'return js2-ERROR))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5899 (?%
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5900 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5901 (js2-ts-return js2-ASSIGN_MOD)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5902 (throw 'return js2-MOD)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5903 (?~
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5904 (throw 'return js2-BITNOT))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5905 (?+
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5906 (if (js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5907 (js2-ts-return js2-ASSIGN_ADD)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5908 (if (js2-match-char ?+)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5909 (js2-ts-return js2-INC)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5910 (throw 'return js2-ADD))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5911 (?-
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5912 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5913 ((js2-match-char ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5914 (setq c js2-ASSIGN_SUB))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5915 ((js2-match-char ?-)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5916 (unless js2-ts-dirty-line
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5917 ;; treat HTML end-comment after possible whitespace
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5918 ;; after line start as comment-until-eol
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5919 (when (js2-match-char ?>)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5920 (js2-skip-line)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5921 (setq js2-ts-comment-type 'html)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5922 (throw 'return js2-COMMENT)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5923 (setq c js2-DEC))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5924 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5925 (setq c js2-SUB)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5926 (setq js2-ts-dirty-line t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5927 (js2-ts-return c))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5928 (otherwise
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5929 (js2-report-scan-error "msg.illegal.character")))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5930
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5931 (defun js2-read-regexp (start-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5932 "Called by parser when it gets / or /= in literal context."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5933 (let (c
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5934 err
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5935 in-class ; inside a '[' .. ']' character-class
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5936 flags
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5937 (continue t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5938 (setq js2-token-beg js2-ts-cursor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5939 js2-ts-string-buffer nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5940 js2-ts-regexp-flags nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5941 (if (eq start-token js2-ASSIGN_DIV)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5942 ;; mis-scanned /=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5943 (js2-add-to-string ?=)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5944 (if (not (eq start-token js2-DIV))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5945 (error "failed assertion")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5946 (while (and (not err)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5947 (or (/= (setq c (js2-get-char)) ?/)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5948 in-class))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5949 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5950 ((or (= c ?\n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5951 (= c js2-EOF_CHAR))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5952 (setq js2-token-end (1- js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5953 err t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5954 js2-ts-string (js2-collect-string js2-ts-string-buffer))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5955 (js2-report-error "msg.unterminated.re.lit"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5956 (t (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5957 ((= c ?\\)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5958 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5959 (setq c (js2-get-char)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5960 ((= c ?\[)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5961 (setq in-class t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5962 ((= c ?\])
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5963 (setq in-class nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5964 (js2-add-to-string c))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5965 (unless err
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5966 (while continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5967 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5968 ((js2-match-char ?g)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5969 (push ?g flags))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5970 ((js2-match-char ?i)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5971 (push ?i flags))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5972 ((js2-match-char ?m)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5973 (push ?m flags))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5974 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5975 (setq continue nil))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5976 (if (js2-alpha-p (js2-peek-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5977 (js2-report-scan-error "msg.invalid.re.flag" t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5978 js2-ts-cursor 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5979 (setq js2-ts-string (js2-collect-string js2-ts-string-buffer)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5980 js2-ts-regexp-flags (js2-collect-string flags)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5981 js2-token-end js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5982 ;; tell `parse-partial-sexp' to ignore this range of chars
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5983 (put-text-property js2-token-beg js2-token-end 'syntax-class '(2)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5984
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5985 (defun js2-get-first-xml-token ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5986 (setq js2-ts-xml-open-tags-count 0
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5987 js2-ts-is-xml-attribute nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5988 js2-ts-xml-is-tag-content nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5989 (js2-unget-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5990 (js2-get-next-xml-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5991
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5992 (defsubst js2-xml-discard-string ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5993 "Throw away the string in progress and flag an XML parse error."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5994 (setq js2-ts-string-buffer nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5995 js2-ts-string nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5996 (js2-report-scan-error "msg.XML.bad.form" t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5997
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5998 (defun js2-get-next-xml-token ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
5999 (setq js2-ts-string-buffer nil ; for recording the XML
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6000 js2-token-beg js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6001 (let (c result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6002 (setq result
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6003 (catch 'return
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6004 (while t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6005 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6006 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6007 ((= c js2-EOF_CHAR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6008 (throw 'return js2-ERROR))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6009 (js2-ts-xml-is-tag-content
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6010 (case c
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6011 (?>
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6012 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6013 (setq js2-ts-xml-is-tag-content nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6014 js2-ts-is-xml-attribute nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6015 (?/
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6016 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6017 (when (eq ?> (js2-peek-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6018 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6019 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6020 (setq js2-ts-xml-is-tag-content nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6021 (decf js2-ts-xml-open-tags-count)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6022 (?{
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6023 (js2-unget-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6024 (setq js2-ts-string (js2-get-string-from-buffer))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6025 (throw 'return js2-XML))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6026 ((?\' ?\")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6027 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6028 (unless (js2-read-quoted-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6029 (throw 'return js2-ERROR)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6030 (?=
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6031 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6032 (setq js2-ts-is-xml-attribute t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6033 ((? ?\t ?\r ?\n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6034 (js2-add-to-string c))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6035 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6036 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6037 (setq js2-ts-is-xml-attribute nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6038 (when (and (not js2-ts-xml-is-tag-content)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6039 (zerop js2-ts-xml-open-tags-count))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6040 (setq js2-ts-string (js2-get-string-from-buffer))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6041 (throw 'return js2-XMLEND)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6042 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6043 ;; else not tag content
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6044 (case c
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6045 (?<
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6046 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6047 (setq c (js2-peek-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6048 (case c
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6049 (?!
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6050 (setq c (js2-get-char)) ;; skip !
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6051 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6052 (setq c (js2-peek-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6053 (case c
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6054 (?-
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6055 (setq c (js2-get-char)) ;; skip -
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6056 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6057 (if (eq c ?-)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6058 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6059 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6060 (unless (js2-read-xml-comment)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6061 (throw 'return js2-ERROR)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6062 (js2-xml-discard-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6063 (throw 'return js2-ERROR)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6064 (?\[
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6065 (setq c (js2-get-char)) ;; skip [
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6066 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6067 (if (and (= (js2-get-char) ?C)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6068 (= (js2-get-char) ?D)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6069 (= (js2-get-char) ?A)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6070 (= (js2-get-char) ?T)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6071 (= (js2-get-char) ?A)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6072 (= (js2-get-char) ?\[))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6073 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6074 (js2-add-to-string ?C)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6075 (js2-add-to-string ?D)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6076 (js2-add-to-string ?A)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6077 (js2-add-to-string ?T)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6078 (js2-add-to-string ?A)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6079 (js2-add-to-string ?\[)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6080 (unless (js2-read-cdata)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6081 (throw 'return js2-ERROR)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6082 (js2-xml-discard-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6083 (throw 'return js2-ERROR)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6084 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6085 (unless (js2-read-entity)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6086 (throw 'return js2-ERROR)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6087 (??
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6088 (setq c (js2-get-char)) ;; skip ?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6089 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6090 (unless (js2-read-PI)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6091 (throw 'return js2-ERROR)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6092 (?/
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6093 ;; end tag
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6094 (setq c (js2-get-char)) ;; skip /
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6095 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6096 (when (zerop js2-ts-xml-open-tags-count)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6097 (js2-xml-discard-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6098 (throw 'return js2-ERROR))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6099 (setq js2-ts-xml-is-tag-content t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6100 (decf js2-ts-xml-open-tags-count))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6101 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6102 ;; start tag
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6103 (setq js2-ts-xml-is-tag-content t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6104 (incf js2-ts-xml-open-tags-count))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6105 (?{
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6106 (js2-unget-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6107 (setq js2-ts-string (js2-get-string-from-buffer))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6108 (throw 'return js2-XML))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6109 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6110 (js2-add-to-string c))))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6111 (setq js2-token-end js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6112 result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6113
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6114 (defun js2-read-quoted-string (quote)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6115 (let (c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6116 (catch 'return
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6117 (while (/= (setq c (js2-get-char)) js2-EOF_CHAR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6118 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6119 (if (eq c quote)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6120 (throw 'return t)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6121 (js2-xml-discard-string) ;; throw away string in progress
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6122 nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6123
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6124 (defun js2-read-xml-comment ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6125 (let ((c (js2-get-char)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6126 (catch 'return
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6127 (while (/= c js2-EOF_CHAR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6128 (catch 'continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6129 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6130 (when (and (eq c ?-) (eq ?- (js2-peek-char)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6131 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6132 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6133 (if (eq (js2-peek-char) ?>)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6134 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6135 (setq c (js2-get-char)) ;; skip >
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6136 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6137 (throw 'return t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6138 (throw 'continue nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6139 (setq c (js2-get-char))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6140 (js2-xml-discard-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6141 nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6142
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6143 (defun js2-read-cdata ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6144 (let ((c (js2-get-char)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6145 (catch 'return
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6146 (while (/= c js2-EOF_CHAR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6147 (catch 'continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6148 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6149 (when (and (eq c ?\]) (eq (js2-peek-char) ?\]))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6150 (setq c (js2-get-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6151 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6152 (if (eq (js2-peek-char) ?>)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6153 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6154 (setq c (js2-get-char)) ;; Skip >
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6155 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6156 (throw 'return t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6157 (throw 'continue nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6158 (setq c (js2-get-char))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6159 (js2-xml-discard-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6160 nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6161
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6162 (defun js2-read-entity ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6163 (let ((decl-tags 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6164 c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6165 (catch 'return
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6166 (while (/= js2-EOF_CHAR (setq c (js2-get-char)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6167 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6168 (case c
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6169 (?<
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6170 (incf decl-tags))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6171 (?>
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6172 (decf decl-tags)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6173 (if (zerop decl-tags)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6174 (throw 'return t)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6175 (js2-xml-discard-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6176 nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6177
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6178 (defun js2-read-PI ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6179 "Scan an XML processing instruction."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6180 (let (c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6181 (catch 'return
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6182 (while (/= js2-EOF_CHAR (setq c (js2-get-char)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6183 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6184 (when (and (eq c ??) (eq (js2-peek-char) ?>))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6185 (setq c (js2-get-char)) ;; Skip >
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6186 (js2-add-to-string c)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6187 (throw 'return t)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6188 (js2-xml-discard-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6189 nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6190
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6191 (defun js2-scanner-get-line ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6192 "Return the text of the current scan line."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6193 (buffer-substring (point-at-bol) (point-at-eol)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6194
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6195 ;;; Highlighting
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6196
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6197 (defsubst js2-set-face (beg end face &optional record)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6198 "Fontify a region. If RECORD is non-nil, record for later."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6199 (when (plusp js2-highlight-level)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6200 (setq beg (min (point-max) beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6201 beg (max (point-min) beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6202 end (min (point-max) end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6203 end (max (point-min) end))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6204 (if record
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6205 (push (list beg end face) js2-mode-fontifications)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6206 (put-text-property beg end 'face face))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6207
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6208 (defsubst js2-set-kid-face (pos kid len face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6209 "Set-face on a child node.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6210 POS is absolute buffer position of parent.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6211 KID is the child node.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6212 LEN is the length to fontify.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6213 FACE is the face to fontify with."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6214 (js2-set-face (+ pos (js2-node-pos kid))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6215 (+ pos (js2-node-pos kid) (js2-node-len kid))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6216 face))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6217
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6218 (defsubst js2-fontify-kwd (start length)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6219 (js2-set-face start (+ start length) 'font-lock-keyword-face))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6220
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6221 (defsubst js2-clear-face (beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6222 (remove-text-properties beg end '(face nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6223 help-echo nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6224 point-entered nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6225 c-in-sws nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6226
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6227 (defsubst js2-record-text-property (beg end prop value)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6228 "Record a text property to set when parsing finishes."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6229 (push (list beg end prop value) js2-mode-deferred-properties))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6230
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6231 (defconst js2-ecma-global-props
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6232 (concat "^"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6233 (regexp-opt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6234 '("Infinity" "NaN" "undefined" "arguments") t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6235 "$")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6236 "Value properties of the Ecma-262 Global Object.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6237 Shown at or above `js2-highlight-level' 2.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6238
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6239 ;; might want to add the name "arguments" to this list?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6240 (defconst js2-ecma-object-props
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6241 (concat "^"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6242 (regexp-opt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6243 '("prototype" "__proto__" "__parent__") t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6244 "$")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6245 "Value properties of the Ecma-262 Object constructor.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6246 Shown at or above `js2-highlight-level' 2.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6247
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6248 (defconst js2-ecma-global-funcs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6249 (concat
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6250 "^"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6251 (regexp-opt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6252 '("decodeURI" "decodeURIComponent" "encodeURI" "encodeURIComponent"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6253 "eval" "isFinite" "isNaN" "parseFloat" "parseInt") t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6254 "$")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6255 "Function properties of the Ecma-262 Global object.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6256 Shown at or above `js2-highlight-level' 2.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6257
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6258 (defconst js2-ecma-number-props
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6259 (concat "^"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6260 (regexp-opt '("MAX_VALUE" "MIN_VALUE" "NaN"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6261 "NEGATIVE_INFINITY"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6262 "POSITIVE_INFINITY") t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6263 "$")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6264 "Properties of the Ecma-262 Number constructor.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6265 Shown at or above `js2-highlight-level' 2.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6266
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6267 (defconst js2-ecma-date-props "^\\(parse\\|UTC\\)$"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6268 "Properties of the Ecma-262 Date constructor.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6269 Shown at or above `js2-highlight-level' 2.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6270
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6271 (defconst js2-ecma-math-props
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6272 (concat "^"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6273 (regexp-opt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6274 '("E" "LN10" "LN2" "LOG2E" "LOG10E" "PI" "SQRT1_2" "SQRT2")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6275 t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6276 "$")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6277 "Properties of the Ecma-262 Math object.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6278 Shown at or above `js2-highlight-level' 2.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6279
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6280 (defconst js2-ecma-math-funcs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6281 (concat "^"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6282 (regexp-opt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6283 '("abs" "acos" "asin" "atan" "atan2" "ceil" "cos" "exp" "floor"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6284 "log" "max" "min" "pow" "random" "round" "sin" "sqrt" "tan") t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6285 "$")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6286 "Function properties of the Ecma-262 Math object.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6287 Shown at or above `js2-highlight-level' 2.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6288
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6289 (defconst js2-ecma-function-props
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6290 (concat
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6291 "^"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6292 (regexp-opt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6293 '(;; properties of the Object prototype object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6294 "hasOwnProperty" "isPrototypeOf" "propertyIsEnumerable"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6295 "toLocaleString" "toString" "valueOf"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6296 ;; properties of the Function prototype object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6297 "apply" "call"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6298 ;; properties of the Array prototype object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6299 "concat" "join" "pop" "push" "reverse" "shift" "slice" "sort"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6300 "splice" "unshift"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6301 ;; properties of the String prototype object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6302 "charAt" "charCodeAt" "fromCharCode" "indexOf" "lastIndexOf"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6303 "localeCompare" "match" "replace" "search" "split" "substring"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6304 "toLocaleLowerCase" "toLocaleUpperCase" "toLowerCase"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6305 "toUpperCase"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6306 ;; properties of the Number prototype object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6307 "toExponential" "toFixed" "toPrecision"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6308 ;; properties of the Date prototype object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6309 "getDate" "getDay" "getFullYear" "getHours" "getMilliseconds"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6310 "getMinutes" "getMonth" "getSeconds" "getTime"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6311 "getTimezoneOffset" "getUTCDate" "getUTCDay" "getUTCFullYear"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6312 "getUTCHours" "getUTCMilliseconds" "getUTCMinutes" "getUTCMonth"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6313 "getUTCSeconds" "setDate" "setFullYear" "setHours"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6314 "setMilliseconds" "setMinutes" "setMonth" "setSeconds" "setTime"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6315 "setUTCDate" "setUTCFullYear" "setUTCHours" "setUTCMilliseconds"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6316 "setUTCMinutes" "setUTCMonth" "setUTCSeconds" "toDateString"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6317 "toLocaleDateString" "toLocaleString" "toLocaleTimeString"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6318 "toTimeString" "toUTCString"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6319 ;; properties of the RegExp prototype object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6320 "exec" "test"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6321 ;; SpiderMonkey/Rhino extensions, versions 1.5+
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6322 "toSource" "__defineGetter__" "__defineSetter__"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6323 "__lookupGetter__" "__lookupSetter__" "__noSuchMethod__"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6324 "every" "filter" "forEach" "lastIndexOf" "map" "some")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6325 t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6326 "$")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6327 "Built-in functions defined by Ecma-262 and SpiderMonkey extensions.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6328 Shown at or above `js2-highlight-level' 3.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6329
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6330 (defsubst js2-parse-highlight-prop-get (parent target prop call-p)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6331 (let ((target-name (and target
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6332 (js2-name-node-p target)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6333 (js2-name-node-name target)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6334 (prop-name (if prop (js2-name-node-name prop)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6335 (level1 (>= js2-highlight-level 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6336 (level2 (>= js2-highlight-level 2))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6337 (level3 (>= js2-highlight-level 3))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6338 pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6339 face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6340 (when level2
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6341 (if call-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6342 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6343 ((and target prop)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6344 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6345 ((and level3 (string-match js2-ecma-function-props prop-name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6346 (setq face 'font-lock-builtin-face))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6347 ((and target-name prop)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6348 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6349 ((string= target-name "Date")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6350 (if (string-match js2-ecma-date-props prop-name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6351 (setq face 'font-lock-builtin-face)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6352 ((string= target-name "Math")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6353 (if (string-match js2-ecma-math-funcs prop-name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6354 (setq face 'font-lock-builtin-face)))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6355 (prop
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6356 (if (string-match js2-ecma-global-funcs prop-name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6357 (setq face 'font-lock-builtin-face))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6358 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6359 ((and target prop)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6360 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6361 ((string= target-name "Number")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6362 (if (string-match js2-ecma-number-props prop-name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6363 (setq face 'font-lock-constant-face)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6364 ((string= target-name "Math")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6365 (if (string-match js2-ecma-math-props prop-name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6366 (setq face 'font-lock-constant-face)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6367 (prop
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6368 (if (string-match js2-ecma-object-props prop-name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6369 (setq face 'font-lock-constant-face)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6370 (when face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6371 (js2-set-face (setq pos (+ (js2-node-pos parent) ; absolute
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6372 (js2-node-pos prop))) ; relative
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6373 (+ pos (js2-node-len prop))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6374 face)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6375
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6376 (defun js2-parse-highlight-member-expr-node (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6377 "Perform syntax highlighting of EcmaScript built-in properties.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6378 The variable `js2-highlight-level' governs this highighting."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6379 (let (face target prop name pos end parent call-p callee)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6380 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6381 ;; case 1: simple name, e.g. foo
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6382 ((js2-name-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6383 (setq name (js2-name-node-name node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6384 ;; possible for name to be nil in rare cases - saw it when
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6385 ;; running js2-mode on an elisp buffer. Might as well try to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6386 ;; make it so js2-mode never barfs.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6387 (when name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6388 (setq face (if (string-match js2-ecma-global-props name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6389 'font-lock-constant-face))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6390 (when face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6391 (setq pos (js2-node-pos node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6392 end (+ pos (js2-node-len node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6393 (js2-set-face pos end face))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6394 ;; case 2: property access or function call
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6395 ((or (js2-prop-get-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6396 ;; highlight function call if expr is a prop-get node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6397 ;; or a plain name (i.e. unqualified function call)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6398 (and (setq call-p (js2-call-node-p node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6399 (setq callee (js2-call-node-target node)) ; separate setq!
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6400 (or (js2-prop-get-node-p callee)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6401 (js2-name-node-p callee))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6402 (setq parent node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6403 node (if call-p callee node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6404 (if (and call-p (js2-name-node-p callee))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6405 (setq prop callee)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6406 (setq target (js2-prop-get-node-left node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6407 prop (js2-prop-get-node-right node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6408 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6409 ((js2-name-node-p target)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6410 (if (js2-name-node-p prop)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6411 ;; case 2a: simple target, simple prop name, e.g. foo.bar
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6412 (js2-parse-highlight-prop-get parent target prop call-p)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6413 ;; case 2b: simple target, complex name, e.g. foo.x[y]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6414 (js2-parse-highlight-prop-get parent target nil call-p)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6415 ((js2-name-node-p prop)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6416 ;; case 2c: complex target, simple name, e.g. x[y].bar
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6417 (js2-parse-highlight-prop-get parent target prop call-p)))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6418
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6419 (defun js2-parse-highlight-member-expr-fn-name (expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6420 "Highlight the `baz' in function foo.bar.baz(args) {...}.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6421 This is experimental Rhino syntax. EXPR is the foo.bar.baz member expr.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6422 We currently only handle the case where the last component is a prop-get
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6423 of a simple name. Called before EXPR has a parent node."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6424 (let (pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6425 (name (and (js2-prop-get-node-p expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6426 (js2-prop-get-node-right expr))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6427 (when (js2-name-node-p name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6428 (js2-set-face (setq pos (+ (js2-node-pos expr) ; parent is absolute
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6429 (js2-node-pos name)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6430 (+ pos (js2-node-len name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6431 'font-lock-function-name-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6432 'record))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6433
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6434 ;; source: http://jsdoc.sourceforge.net/
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6435 ;; Note - this syntax is for Google's enhanced jsdoc parser that
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6436 ;; allows type specifications, and needs work before entering the wild.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6437
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6438 (defconst js2-jsdoc-param-tag-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6439 (concat "^\\s-*\\*+\\s-*\\(@"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6440 "\\(?:param\\|argument\\)"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6441 "\\)"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6442 "\\s-*\\({[^}]+}\\)?" ; optional type
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6443 "\\s-*\\([a-zA-Z0-9_$]+\\)?" ; name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6444 "\\>")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6445 "Matches jsdoc tags with optional type and optional param name.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6446
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6447 (defconst js2-jsdoc-typed-tag-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6448 (concat "^\\s-*\\*+\\s-*\\(@\\(?:"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6449 (regexp-opt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6450 '("enum"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6451 "extends"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6452 "field"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6453 "id"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6454 "implements"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6455 "lends"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6456 "mods"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6457 "requires"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6458 "return"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6459 "returns"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6460 "throw"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6461 "throws"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6462 "\\)\\)\\s-*\\({[^}]+}\\)?")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6463 "Matches jsdoc tags with optional type.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6464
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6465 (defconst js2-jsdoc-arg-tag-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6466 (concat "^\\s-*\\*+\\s-*\\(@\\(?:"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6467 (regexp-opt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6468 '("alias"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6469 "augments"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6470 "borrows"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6471 "bug"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6472 "base"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6473 "config"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6474 "default"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6475 "define"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6476 "exception"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6477 "function"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6478 "member"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6479 "memberOf"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6480 "name"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6481 "namespace"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6482 "property"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6483 "since"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6484 "suppress"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6485 "this"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6486 "throws"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6487 "type"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6488 "version"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6489 "\\)\\)\\s-+\\([^ \t]+\\)")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6490 "Matches jsdoc tags with a single argument.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6491
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6492 (defconst js2-jsdoc-empty-tag-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6493 (concat "^\\s-*\\*+\\s-*\\(@\\(?:"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6494 (regexp-opt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6495 '("addon"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6496 "author"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6497 "class"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6498 "const"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6499 "constant"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6500 "constructor"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6501 "constructs"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6502 "deprecated"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6503 "desc"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6504 "description"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6505 "event"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6506 "example"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6507 "exec"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6508 "export"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6509 "fileoverview"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6510 "final"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6511 "function"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6512 "hidden"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6513 "ignore"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6514 "implicitCast"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6515 "inheritDoc"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6516 "inner"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6517 "interface"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6518 "license"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6519 "noalias"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6520 "noshadow"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6521 "notypecheck"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6522 "override"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6523 "owner"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6524 "preserve"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6525 "preserveTry"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6526 "private"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6527 "protected"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6528 "public"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6529 "static"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6530 "supported"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6531 ))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6532 "\\)\\)\\s-*")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6533 "Matches empty jsdoc tags.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6534
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6535 (defconst js2-jsdoc-link-tag-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6536 "{\\(@\\(?:link\\|code\\)\\)\\s-+\\([^#}\n]+\\)\\(#.+\\)?}"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6537 "Matches a jsdoc link or code tag.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6538
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6539 (defconst js2-jsdoc-see-tag-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6540 "^\\s-*\\*+\\s-*\\(@see\\)\\s-+\\([^#}\n]+\\)\\(#.+\\)?"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6541 "Matches a jsdoc @see tag.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6542
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6543 (defconst js2-jsdoc-html-tag-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6544 "\\(</?\\)\\([a-zA-Z]+\\)\\s-*\\(/?>\\)"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6545 "Matches a simple (no attributes) html start- or end-tag.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6546
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6547 (defsubst js2-jsdoc-highlight-helper ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6548 (js2-set-face (match-beginning 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6549 (match-end 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6550 'js2-jsdoc-tag-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6551 (if (match-beginning 2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6552 (if (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6553 (goto-char (match-beginning 2))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6554 (= (char-after) ?{))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6555 (js2-set-face (1+ (match-beginning 2))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6556 (1- (match-end 2))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6557 'js2-jsdoc-type-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6558 (js2-set-face (match-beginning 2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6559 (match-end 2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6560 'js2-jsdoc-value-face)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6561 (if (match-beginning 3)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6562 (js2-set-face (match-beginning 3)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6563 (match-end 3)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6564 'js2-jsdoc-value-face)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6565
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6566 (defun js2-highlight-jsdoc (ast)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6567 "Highlight doc comment tags."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6568 (let ((comments (js2-ast-root-comments ast))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6569 beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6570 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6571 (dolist (node comments)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6572 (when (eq (js2-comment-node-format node) 'jsdoc)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6573 (setq beg (js2-node-abs-pos node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6574 end (+ beg (js2-node-len node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6575 (save-restriction
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6576 (narrow-to-region beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6577 (dolist (re (list js2-jsdoc-param-tag-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6578 js2-jsdoc-typed-tag-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6579 js2-jsdoc-arg-tag-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6580 js2-jsdoc-link-tag-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6581 js2-jsdoc-see-tag-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6582 js2-jsdoc-empty-tag-regexp))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6583 (goto-char beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6584 (while (re-search-forward re nil t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6585 (js2-jsdoc-highlight-helper)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6586 ;; simple highlighting for html tags
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6587 (goto-char beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6588 (while (re-search-forward js2-jsdoc-html-tag-regexp nil t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6589 (js2-set-face (match-beginning 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6590 (match-end 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6591 'js2-jsdoc-html-tag-delimiter-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6592 (js2-set-face (match-beginning 2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6593 (match-end 2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6594 'js2-jsdoc-html-tag-name-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6595 (js2-set-face (match-beginning 3)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6596 (match-end 3)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6597 'js2-jsdoc-html-tag-delimiter-face))))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6598
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6599 (defun js2-highlight-assign-targets (node left right)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6600 "Highlight function properties and external variables."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6601 (let (leftpos end name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6602 ;; highlight vars and props assigned function values
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6603 (when (js2-function-node-p right)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6604 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6605 ;; var foo = function() {...}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6606 ((js2-name-node-p left)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6607 (setq name left))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6608 ;; foo.bar.baz = function() {...}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6609 ((and (js2-prop-get-node-p left)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6610 (js2-name-node-p (js2-prop-get-node-right left)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6611 (setq name (js2-prop-get-node-right left))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6612 (when name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6613 (js2-set-face (setq leftpos (js2-node-abs-pos name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6614 (+ leftpos (js2-node-len name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6615 'font-lock-function-name-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6616 'record)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6617 ;; save variable assignments so we can check for undeclared later
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6618 ;; (can't do it here since var decls can come at end of script)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6619 (when (and js2-highlight-external-variables
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6620 (setq name (js2-member-expr-leftmost-name left)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6621 (push (list name js2-current-scope
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6622 (setq leftpos (js2-node-abs-pos name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6623 (setq end (+ leftpos (js2-node-len name))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6624 js2-recorded-assignments))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6625
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6626 (defun js2-highlight-undeclared-vars ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6627 "After entire parse is finished, look for undeclared variable assignments.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6628 We have to wait until entire buffer is parsed, since JavaScript permits var
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6629 decls to occur after they're used.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6630
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6631 If any undeclared var name is in `js2-externs' or `js2-additional-externs',
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6632 it is considered declared."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6633 (let (name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6634 (dolist (entry js2-recorded-assignments)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6635 (destructuring-bind (name-node scope pos end) entry
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6636 (setq name (js2-name-node-name name-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6637 (unless (or (member name js2-global-externs)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6638 (member name js2-default-externs)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6639 (member name js2-additional-externs)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6640 (js2-get-defining-scope scope name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6641 (js2-set-face pos end 'js2-external-variable-face 'record)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6642 (js2-record-text-property pos end 'help-echo "Undeclared variable")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6643 (js2-record-text-property pos end 'point-entered #'js2-echo-help))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6644 (setq js2-recorded-assignments nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6645
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6646 ;;; IMenu support
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6647
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6648 ;; We currently only support imenu, but eventually should support speedbar and
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6649 ;; possibly other browsing mechanisms.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6650
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6651 ;; The basic strategy is to identify function assignment targets of the form
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6652 ;; `foo.bar.baz', convert them to (list foo bar baz <position>), and push the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6653 ;; list into `js2-imenu-recorder'. The lists are merged into a trie-like tree
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6654 ;; for imenu after parsing is finished.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6655
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6656 ;; A `foo.bar.baz' assignment target may be expressed in many ways in
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6657 ;; JavaScript, and the general problem is undecidable. However, several forms
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6658 ;; are readily recognizable at parse-time; the forms we attempt to recognize
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6659 ;; include:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6660
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6661 ;; function foo() -- function declaration
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6662 ;; foo = function() -- function expression assigned to variable
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6663 ;; foo.bar.baz = function() -- function expr assigned to nested property-get
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6664 ;; foo = {bar: function()} -- fun prop in object literal assigned to var
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6665 ;; foo = {bar: {baz: function()}} -- inside nested object literal
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6666 ;; foo.bar = {baz: function()}} -- obj lit assigned to nested prop get
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6667 ;; a.b = {c: {d: function()}} -- nested obj lit assigned to nested prop get
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6668 ;; foo = {get bar() {...}} -- getter/setter in obj literal
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6669 ;; function foo() {function bar() {...}} -- nested function
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6670 ;; foo['a'] = function() -- fun expr assigned to deterministic element-get
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6671
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6672 ;; This list boils down to a few forms that can be combined recursively.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6673 ;; Top-level named function declarations include both the left-hand (name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6674 ;; and the right-hand (function value) expressions needed to produce an imenu
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6675 ;; entry. The other "right-hand" forms we need to look for are:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6676 ;; - functions declared as props/getters/setters in object literals
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6677 ;; - nested named function declarations
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6678 ;; The "left-hand" expressions that functions can be assigned to include:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6679 ;; - local/global variables
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6680 ;; - nested property-get expressions like a.b.c.d
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6681 ;; - element gets like foo[10] or foo['bar'] where the index
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6682 ;; expression can be trivially converted to a property name. They
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6683 ;; effectively then become property gets.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6684
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6685 ;; All the different definition types are canonicalized into the form
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6686 ;; foo.bar.baz = position-of-function-keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6687
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6688 ;; We need to build a trie-like structure for imenu. As an example,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6689 ;; consider the following JavaScript code:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6690
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6691 ;; a = function() {...} // function at position 5
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6692 ;; b = function() {...} // function at position 25
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6693 ;; foo = function() {...} // function at position 100
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6694 ;; foo.bar = function() {...} // function at position 200
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6695 ;; foo.bar.baz = function() {...} // function at position 300
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6696 ;; foo.bar.zab = function() {...} // function at position 400
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6697
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6698 ;; During parsing we accumulate an entry for each definition in
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6699 ;; the variable `js2-imenu-recorder', like so:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6700
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6701 ;; '((a 5)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6702 ;; (b 25)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6703 ;; (foo 100)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6704 ;; (foo bar 200)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6705 ;; (foo bar baz 300)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6706 ;; (foo bar zab 400))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6707
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6708 ;; After parsing these entries are merged into this alist-trie:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6709
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6710 ;; '((a . 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6711 ;; (b . 2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6712 ;; (foo (<definition> . 3)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6713 ;; (bar (<definition> . 6)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6714 ;; (baz . 100)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6715 ;; (zab . 200))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6716
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6717 ;; Note the wacky need for a <definition> name. The token can be anything
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6718 ;; that isn't a valid JavaScript identifier, because you might make foo
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6719 ;; a function and then start setting properties on it that are also functions.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6720
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6721 (defsubst js2-prop-node-name (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6722 "Return the name of a node that may be a property-get/property-name.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6723 If NODE is not a valid name-node, string-node or integral number-node,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6724 returns nil. Otherwise returns the string name/value of the node."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6725 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6726 ((js2-name-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6727 (js2-name-node-name node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6728 ((js2-string-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6729 (js2-string-node-value node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6730 ((and (js2-number-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6731 (string-match "^[0-9]+$" (js2-number-node-value node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6732 (js2-number-node-value node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6733 ((js2-this-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6734 "this")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6735
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6736 (defsubst js2-node-qname-component (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6737 "Test function: return the name of this node, if it contributes to a qname.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6738 Returns nil if the node doesn't contribute."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6739 (copy-sequence
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6740 (or (js2-prop-node-name node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6741 (if (and (js2-function-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6742 (js2-function-node-name node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6743 (js2-name-node-name (js2-function-node-name node))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6744
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6745 (defsubst js2-record-function-qname (fn-node qname)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6746 "Associate FN-NODE with its QNAME for later lookup.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6747 This is used in postprocessing the chain list. When we find a chain
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6748 whose first element is a js2-THIS keyword node, we look up the parent
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6749 function and see (using this map) whether it is the tail of a chain.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6750 If so, we replace the this-node with a copy of the parent's qname."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6751 (unless js2-imenu-function-map
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6752 (setq js2-imenu-function-map (make-hash-table :test 'eq)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6753 (puthash fn-node qname js2-imenu-function-map))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6754
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6755 (defun js2-record-imenu-functions (node &optional var)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6756 "Record function definitions for imenu.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6757 NODE is a function node or an object literal.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6758 VAR, if non-nil, is the expression that NODE is being assigned to."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6759 (when js2-parse-ide-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6760 (let ((fun-p (js2-function-node-p node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6761 qname left fname-node pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6762 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6763 ;; non-anonymous function declaration?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6764 ((and fun-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6765 (not var)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6766 (setq fname-node (js2-function-node-name node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6767 (push (setq qname (list fname-node (js2-node-pos node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6768 js2-imenu-recorder)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6769 (js2-record-function-qname node qname))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6770 ;; for remaining forms, compute left-side tree branch first
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6771 ((and var (setq qname (js2-compute-nested-prop-get var)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6772 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6773 ;; foo.bar.baz = function
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6774 (fun-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6775 (push (nconc qname (list (js2-node-pos node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6776 js2-imenu-recorder)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6777 (js2-record-function-qname node qname))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6778 ;; foo.bar.baz = object-literal
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6779 ;; look for nested functions: {a: {b: function() {...} }}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6780 ((js2-object-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6781 (js2-record-object-literal node qname))))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6782
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6783 (defun js2-compute-nested-prop-get (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6784 "If NODE is of form foo.bar.baz, return component nodes as a list.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6785 Otherwise returns nil. Element-gets can be treated as property-gets
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6786 if the index expression is a name, a string, or a positive integer."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6787 (let (left right head)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6788 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6789 ((or (js2-name-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6790 (js2-this-node-p node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6791 (list node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6792 ;; foo.bar.baz is parenthesized as (foo.bar).baz => right operand is a leaf
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6793 ((js2-prop-get-node-p node) ; includes elem-get nodes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6794 (setq left (js2-prop-get-node-left node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6795 right (js2-prop-get-node-right node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6796 (if (and (or (js2-prop-get-node-p left) ; left == foo.bar
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6797 (js2-name-node-p left)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6798 (js2-this-node-p left)) ; or left == foo
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6799 (or (js2-name-node-p right) ; .bar
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6800 (js2-string-node-p right) ; ['bar']
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6801 (and (js2-number-node-p right) ; [10]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6802 (string-match "^[0-9]+$"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6803 (js2-number-node-value right)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6804 (if (setq head (js2-compute-nested-prop-get left))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6805 (nconc head (list right))))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6806
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6807 (defun js2-record-object-literal (node qname)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6808 "Recursively process an object literal looking for functions.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6809 NODE is an object literal that is the right-hand child of an assignment
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6810 expression. QNAME is a list of nodes representing the assignment target,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6811 e.g. for foo.bar.baz = {...}, QNAME is (foo-node bar-node baz-node).
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6812 We do a depth-first traversal of NODE. Any functions we find are prefixed
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6813 with QNAME plus the property name of the function and appended to the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6814 variable `js2-imenu-recorder'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6815 ;; Elements are relative to parent position, which is still absolute,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6816 ;; since the parser passes the assignment target and value expressions
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6817 ;; to us before they are added as children of the assignment node.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6818 (let ((pos (js2-node-pos node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6819 left right)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6820 (dolist (e (js2-object-node-elems node)) ; e is a `js2-object-prop-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6821 (setq left (js2-infix-node-left e))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6822 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6823 ;; foo: function() {...}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6824 ((js2-function-node-p (setq right (js2-infix-node-right e)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6825 (when (js2-prop-node-name left)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6826 ;; As a policy decision, we record the position of the property,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6827 ;; not the position of the `function' keyword, since the property
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6828 ;; is effectively the name of the function.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6829 (push (append qname (list left) (list (+ pos (js2-node-pos e))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6830 js2-imenu-recorder)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6831 (js2-record-function-qname right qname)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6832 ;; foo: {object-literal} -- add foo to qname and recurse
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6833 ((js2-object-node-p right)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6834 (js2-record-object-literal right
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6835 (append qname (list (js2-infix-node-left e)))))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6836
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6837 (defsubst js2-node-top-level-decl-p (node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6838 "Return t if NODE's name is defined in the top-level scope.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6839 Also returns t if NODE's name is not defined in any scope, since it implies
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6840 that it's an external variable, which must also be in the top-level scope."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6841 (let* ((name (js2-prop-node-name node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6842 (this-scope (js2-node-get-enclosing-scope node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6843 defining-scope)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6844 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6845 ((js2-this-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6846 nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6847 ((null this-scope)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6848 t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6849 ((setq defining-scope (js2-get-defining-scope this-scope name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6850 (js2-ast-root-p defining-scope))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6851 (t t))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6852
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6853 (defun js2-browse-postprocess-chains (chains)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6854 "Modify function-declaration name chains after parsing finishes.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6855 Some of the information is only available after the parse tree is complete.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6856 For instance, following a 'this' reference requires a parent function node."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6857 (let (result head fn parent-chain p elem)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6858 (dolist (chain chains)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6859 ;; examine the head of each node to get its defining scope
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6860 (setq head (car chain))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6861 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6862 ;; if top-level/external, keep as-is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6863 ((js2-node-top-level-decl-p head)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6864 (push chain result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6865 ;; check for a this-reference
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6866 ((eq (js2-node-type head) js2-THIS)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6867 (setq fn (js2-node-parent-script-or-fn head))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6868 ;; if there is no parent function, or if the parent function
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6869 ;; is nested, discard the head node and keep the rest of the chain.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6870 (if (or (null fn) (js2-nested-function-p fn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6871 (push (cdr chain) result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6872 ;; else look up parent in function-map. If not found, discard chain.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6873 (when (setq parent-chain (and js2-imenu-function-map
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6874 (gethash fn js2-imenu-function-map)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6875 ;; else discard head node and prefix parent fn qname, which is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6876 ;; the parent-chain sans tail, to this chain.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6877 (push (append (butlast parent-chain) (cdr chain)) result))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6878 ;; finally replace each node in each chain with its name.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6879 (dolist (chain result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6880 (setq p chain)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6881 (while p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6882 (if (js2-node-p (setq elem (car p)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6883 (setcar p (js2-node-qname-component elem)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6884 (setq p (cdr p))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6885 result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6886
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6887 ;; Merge name chains into a trie-like tree structure of nested lists.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6888 ;; To simplify construction of the trie, we first build it out using the rule
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6889 ;; that the trie consists of lists of pairs. Each pair is a 2-element array:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6890 ;; [key, num-or-list]. The second element can be a number; if so, this key
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6891 ;; is a leaf-node with only one value. (I.e. there is only one declaration
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6892 ;; associated with the key at this level.) Otherwise the second element is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6893 ;; a list of pairs, with the rule applied recursively. This symmetry permits
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6894 ;; a simple recursive formulation.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6895 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6896 ;; js2-mode is building the data structure for imenu. The imenu documentation
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6897 ;; claims that it's the structure above, but in practice it wants the children
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6898 ;; at the same list level as the key for that level, which is how I've drawn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6899 ;; the "Expected final result" above. We'll postprocess the trie to remove the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6900 ;; list wrapper around the children at each level.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6901 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6902 ;; A completed nested imenu-alist entry looks like this:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6903 ;; '(("foo"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6904 ;; ("<definition>" . 7)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6905 ;; ("bar"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6906 ;; ("a" . 40)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6907 ;; ("b" . 60))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6908 ;;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6909 ;; In particular, the documentation for `imenu--index-alist' says that
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6910 ;; a nested sub-alist element looks like (INDEX-NAME SUB-ALIST).
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6911 ;; The sub-alist entries immediately follow INDEX-NAME, the head of the list.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6912
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6913 (defsubst js2-treeify (lst)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6914 "Convert (a b c d) to (a ((b ((c d)))))"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6915 (if (null (cddr lst)) ; list length <= 2
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6916 lst
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6917 (list (car lst) (list (js2-treeify (cdr lst))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6918
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6919 (defun js2-build-alist-trie (chains trie)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6920 "Merge declaration name chains into a trie-like alist structure for imenu.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6921 CHAINS is the qname chain list produced during parsing. TRIE is a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6922 list of elements built up so far."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6923 (let (head tail pos branch kids)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6924 (dolist (chain chains)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6925 (setq head (car chain)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6926 tail (cdr chain)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6927 pos (if (numberp (car tail)) (car tail))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6928 branch (js2-find-if (lambda (n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6929 (string= (car n) head))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6930 trie)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6931 kids (second branch))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6932 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6933 ;; case 1: this key isn't in the trie yet
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6934 ((null branch)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6935 (if trie
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6936 (setcdr (last trie) (list (js2-treeify chain)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6937 (setq trie (list (js2-treeify chain)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6938 ;; case 2: key is present with a single number entry: replace w/ list
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6939 ;; ("a1" 10) + ("a1" 20) => ("a1" (("<definition>" 10)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6940 ;; ("<definition>" 20)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6941 ((numberp kids)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6942 (setcar (cdr branch)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6943 (list (list "<definition-1>" kids)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6944 (if pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6945 (list "<definition-2>" pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6946 (js2-treeify tail)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6947 ;; case 3: key is there (with kids), and we're a number entry
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6948 (pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6949 (setcdr (last kids)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6950 (list
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6951 (list (format "<definition-%d>"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6952 (1+ (loop for kid in kids
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6953 count (eq ?< (aref (car kid) 0)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6954 pos))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6955
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6956 ;; case 4: key is there with kids, need to merge in our chain
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6957 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6958 (js2-build-alist-trie (list tail) kids))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6959 trie))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6960
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6961 (defun js2-flatten-trie (trie)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6962 "Convert TRIE to imenu-format.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6963 Recurses through nodes, and for each one whose second element is a list,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6964 appends the list's flattened elements to the current element. Also
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6965 changes the tails into conses. For instance, this pre-flattened trie
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6966
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6967 '(a ((b 20)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6968 (c ((d 30)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6969 (e 40)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6970
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6971 becomes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6972
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6973 '(a (b . 20)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6974 (c (d . 30)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6975 (e . 40)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6976
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6977 Note that the root of the trie has no key, just a list of chains.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6978 This is also true for the value of any key with multiple children,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6979 e.g. key 'c' in the example above."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6980 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6981 ((listp (car trie))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6982 (mapcar #'js2-flatten-trie trie))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6983 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6984 (if (numberp (second trie))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6985 (cons (car trie) (second trie))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6986 ;; else pop list and append its kids
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6987 (apply #'append (list (car trie)) (js2-flatten-trie (cdr trie)))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6988
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6989 (defun js2-build-imenu-index ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6990 "Turn `js2-imenu-recorder' into an imenu data structure."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6991 (unless (eq js2-imenu-recorder 'empty)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6992 (let* ((chains (js2-browse-postprocess-chains js2-imenu-recorder))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6993 (result (js2-build-alist-trie chains nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6994 (js2-flatten-trie result))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6995
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6996 (defun js2-test-print-chains (chains)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6997 "Print a list of qname chains.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6998 Each element of CHAINS is a list of the form (NODE [NODE *] pos);
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
6999 i.e. one or more nodes, and an integer position as the list tail."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7000 (mapconcat (lambda (chain)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7001 (concat "("
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7002 (mapconcat (lambda (elem)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7003 (if (js2-node-p elem)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7004 (or (js2-node-qname-component elem)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7005 "nil")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7006 (number-to-string elem)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7007 chain
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7008 " ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7009 ")"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7010 chains
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7011 "\n"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7012
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7013 ;;; Parser
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7014
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7015 (defconst js2-version "1.8.0"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7016 "Version of JavaScript supported, plus minor js2 version.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7017
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7018 (defmacro js2-record-face (face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7019 "Record a style run of FACE for the current token."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7020 `(js2-set-face js2-token-beg js2-token-end ,face 'record))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7021
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7022 (defsubst js2-node-end (n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7023 "Computes the absolute end of node N.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7024 Use with caution! Assumes `js2-node-pos' is -absolute-, which
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7025 is only true until the node is added to its parent; i.e., while parsing."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7026 (+ (js2-node-pos n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7027 (js2-node-len n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7028
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7029 (defsubst js2-record-comment ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7030 "Record a comment in `js2-scanned-comments'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7031 (push (make-js2-comment-node :len (- js2-token-end js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7032 :format js2-ts-comment-type)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7033 js2-scanned-comments)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7034 (when js2-parse-ide-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7035 (js2-record-face (if (eq js2-ts-comment-type 'jsdoc)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7036 'font-lock-doc-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7037 'font-lock-comment-face))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7038 (when (memq js2-ts-comment-type '(html preprocessor))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7039 ;; Tell cc-engine the bounds of the comment.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7040 (put-text-property js2-token-beg (1- js2-token-end) 'c-in-sws t))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7041
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7042 ;; This function is called depressingly often, so it should be fast.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7043 ;; Most of the time it's looking at the same token it peeked before.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7044 (defsubst js2-peek-token ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7045 "Returns the next token without consuming it.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7046 If previous token was consumed, calls scanner to get new token.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7047 If previous token was -not- consumed, returns it (idempotent).
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7048
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7049 This function will not return a newline (js2-EOL) - instead, it
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7050 gobbles newlines until it finds a non-newline token, and flags
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7051 that token as appearing just after a newline.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7052
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7053 This function will also not return a js2-COMMENT. Instead, it
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7054 records comments found in `js2-scanned-comments'. If the token
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7055 returned by this function immediately follows a jsdoc comment,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7056 the token is flagged as such.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7057
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7058 Note that this function always returned the un-flagged token!
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7059 The flags, if any, are saved in `js2-current-flagged-token'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7060 (if (/= js2-current-flagged-token js2-EOF) ; last token not consumed
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7061 js2-current-token ; most common case - return already-peeked token
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7062 (let ((tt (js2-get-token)) ; call scanner
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7063 saw-eol
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7064 face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7065 ;; process comments and whitespace
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7066 (while (or (= tt js2-EOL)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7067 (= tt js2-COMMENT))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7068 (if (= tt js2-EOL)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7069 (setq saw-eol t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7070 (setq saw-eol nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7071 (if js2-record-comments
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7072 (js2-record-comment)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7073 (setq tt (js2-get-token))) ; call scanner
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7074 (setq js2-current-token tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7075 js2-current-flagged-token (if saw-eol
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7076 (logior tt js2-ti-after-eol)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7077 tt))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7078 ;; perform lexical fontification as soon as token is scanned
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7079 (when js2-parse-ide-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7080 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7081 ((minusp tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7082 (js2-record-face 'js2-error-face))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7083 ((setq face (aref js2-kwd-tokens tt))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7084 (js2-record-face face))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7085 ((and (= tt js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7086 (equal js2-ts-string "undefined"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7087 (js2-record-face 'font-lock-constant-face))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7088 tt))) ; return unflagged token
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7089
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7090 (defsubst js2-peek-flagged-token ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7091 "Returns the current token along with any flags set for it."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7092 (js2-peek-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7093 js2-current-flagged-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7094
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7095 (defsubst js2-consume-token ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7096 (setq js2-current-flagged-token js2-EOF))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7097
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7098 (defsubst js2-next-token ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7099 (prog1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7100 (js2-peek-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7101 (js2-consume-token)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7102
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7103 (defsubst js2-next-flagged-token ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7104 (js2-peek-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7105 (prog1 js2-current-flagged-token
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7106 (js2-consume-token)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7107
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7108 (defsubst js2-match-token (match)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7109 "Consume and return t if next token matches MATCH, a bytecode.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7110 Returns nil and consumes nothing if MATCH is not the next token."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7111 (if (/= (js2-peek-token) match)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7112 nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7113 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7114 t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7115
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7116 (defsubst js2-valid-prop-name-token (tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7117 (or (= tt js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7118 (and js2-allow-keywords-as-property-names
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7119 (plusp tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7120 (aref js2-kwd-tokens tt))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7121
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7122 (defsubst js2-match-prop-name ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7123 "Consume token and return t if next token is a valid property name.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7124 It's valid if it's a js2-NAME, or `js2-allow-keywords-as-property-names'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7125 is non-nil and it's a keyword token."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7126 (if (js2-valid-prop-name-token (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7127 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7128 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7129 t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7130 nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7131
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7132 (defsubst js2-must-match-prop-name (msg-id &optional pos len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7133 (if (js2-match-prop-name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7134 t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7135 (js2-report-error msg-id nil pos len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7136 nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7137
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7138 (defsubst js2-peek-token-or-eol ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7139 "Return js2-EOL if the current token immediately follows a newline.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7140 Else returns the current token. Used in situations where we don't
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7141 consider certain token types valid if they are preceded by a newline.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7142 One example is the postfix ++ or -- operator, which has to be on the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7143 same line as its operand."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7144 (let ((tt (js2-peek-token)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7145 ;; Check for last peeked token flags
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7146 (if (js2-flag-set-p js2-current-flagged-token js2-ti-after-eol)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7147 js2-EOL
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7148 tt)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7149
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7150 (defsubst js2-set-check-for-label ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7151 (assert (= (logand js2-current-flagged-token js2-clear-ti-mask) js2-NAME))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7152 (js2-set-flag js2-current-flagged-token js2-ti-check-label))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7153
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7154 (defsubst js2-must-match (token msg-id &optional pos len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7155 "Match next token to token code TOKEN, or record a syntax error.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7156 MSG-ID is the error message to report if the match fails.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7157 Returns t on match, nil if no match."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7158 (if (js2-match-token token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7159 t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7160 (js2-report-error msg-id nil pos len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7161 nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7162
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7163 (defsubst js2-inside-function ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7164 (plusp js2-nesting-of-function))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7165
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7166 (defsubst js2-set-requires-activation ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7167 (if (js2-function-node-p js2-current-script-or-fn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7168 (setf (js2-function-node-needs-activation js2-current-script-or-fn) t)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7169
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7170 (defsubst js2-check-activation-name (name token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7171 (when (js2-inside-function)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7172 ;; skip language-version 1.2 check from Rhino
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7173 (if (or (string= "arguments" name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7174 (and js2-compiler-activation-names ; only used in codegen
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7175 (gethash name js2-compiler-activation-names)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7176 (js2-set-requires-activation))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7177
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7178 (defsubst js2-set-is-generator ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7179 (if (js2-function-node-p js2-current-script-or-fn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7180 (setf (js2-function-node-is-generator js2-current-script-or-fn) t)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7181
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7182 (defsubst js2-must-have-xml ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7183 (unless js2-compiler-xml-available
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7184 (js2-report-error "msg.XML.not.available")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7185
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7186 (defsubst js2-push-scope (scope)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7187 "Push SCOPE, a `js2-scope', onto the lexical scope chain."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7188 (assert (js2-scope-p scope))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7189 (assert (null (js2-scope-parent-scope scope)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7190 (assert (not (eq js2-current-scope scope)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7191 (setf (js2-scope-parent-scope scope) js2-current-scope
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7192 js2-current-scope scope))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7193
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7194 (defsubst js2-pop-scope ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7195 (setq js2-current-scope
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7196 (js2-scope-parent-scope js2-current-scope)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7197
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7198 (defsubst js2-enter-loop (loop-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7199 (push loop-node js2-loop-set)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7200 (push loop-node js2-loop-and-switch-set)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7201 (js2-push-scope loop-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7202 ;; Tell the current labeled statement (if any) its statement,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7203 ;; and set the jump target of the first label to the loop.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7204 ;; These are used in `js2-parse-continue' to verify that the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7205 ;; continue target is an actual labeled loop. (And for codegen.)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7206 (when js2-labeled-stmt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7207 (setf (js2-labeled-stmt-node-stmt js2-labeled-stmt) loop-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7208 (js2-label-node-loop (car (js2-labeled-stmt-node-labels
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7209 js2-labeled-stmt))) loop-node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7210
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7211 (defsubst js2-exit-loop ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7212 (pop js2-loop-set)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7213 (pop js2-loop-and-switch-set)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7214 (js2-pop-scope))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7215
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7216 (defsubst js2-enter-switch (switch-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7217 (push switch-node js2-loop-and-switch-set))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7218
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7219 (defsubst js2-exit-switch ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7220 (pop js2-loop-and-switch-set))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7221
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7222 (defun js2-parse (&optional buf cb)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7223 "Tells the js2 parser to parse a region of JavaScript.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7224
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7225 BUF is a buffer or buffer name containing the code to parse.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7226 Call `narrow-to-region' first to parse only part of the buffer.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7227
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7228 The returned AST root node is given some additional properties:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7229 `node-count' - total number of nodes in the AST
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7230 `buffer' - BUF. The buffer it refers to may change or be killed,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7231 so the value is not necessarily reliable.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7232
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7233 An optional callback CB can be specified to report parsing
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7234 progress. If `(functionp CB)' returns t, it will be called with
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7235 the current line number once before parsing begins, then again
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7236 each time the lexer reaches a new line number.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7237
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7238 CB can also be a list of the form `(symbol cb ...)' to specify
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7239 multiple callbacks with different criteria. Each symbol is a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7240 criterion keyword, and the following element is the callback to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7241 call
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7242
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7243 :line - called whenever the line number changes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7244 :token - called for each new token consumed
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7245
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7246 The list of criteria could be extended to include entering or
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7247 leaving a statement, an expression, or a function definition."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7248 (if (and cb (not (functionp cb)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7249 (error "criteria callbacks not yet implemented"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7250 (let ((inhibit-point-motion-hooks t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7251 (js2-compiler-xml-available (>= js2-language-version 160))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7252 ;; This is a recursive-descent parser, so give it a big stack.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7253 (max-lisp-eval-depth (max max-lisp-eval-depth 3000))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7254 (max-specpdl-size (max max-specpdl-size 3000))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7255 (case-fold-search nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7256 ast)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7257 (or buf (setq buf (current-buffer)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7258 (message nil) ; clear any error message from previous parse
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7259 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7260 (set-buffer buf)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7261 (setq js2-scanned-comments nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7262 js2-parsed-errors nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7263 js2-parsed-warnings nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7264 js2-imenu-recorder nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7265 js2-imenu-function-map nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7266 js2-label-set nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7267 (js2-init-scanner)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7268 (setq ast (js2-with-unmodifying-text-property-changes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7269 (js2-do-parse)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7270 (unless js2-ts-hit-eof
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7271 (js2-report-error "msg.got.syntax.errors" (length js2-parsed-errors)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7272 (setf (js2-ast-root-errors ast) js2-parsed-errors
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7273 (js2-ast-root-warnings ast) js2-parsed-warnings)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7274 ;; if we didn't find any declarations, put a dummy in this list so we
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7275 ;; don't end up re-parsing the buffer in `js2-mode-create-imenu-index'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7276 (unless js2-imenu-recorder
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7277 (setq js2-imenu-recorder 'empty))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7278 (run-hooks 'js2-parse-finished-hook)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7279 ast)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7280
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7281 ;; Corresponds to Rhino's Parser.parse() method.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7282 (defun js2-do-parse ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7283 "Parse current buffer starting from current point.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7284 Scanner should be initialized."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7285 (let ((pos js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7286 (end js2-ts-cursor) ; in case file is empty
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7287 root n tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7288 ;; initialize buffer-local parsing vars
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7289 (setf root (make-js2-ast-root :buffer (buffer-name) :pos pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7290 js2-current-script-or-fn root
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7291 js2-current-scope root
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7292 js2-current-flagged-token js2-EOF
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7293 js2-nesting-of-function 0
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7294 js2-labeled-stmt nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7295 js2-recorded-assignments nil) ; for js2-highlight
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7296 (while (/= (setq tt (js2-peek-token)) js2-EOF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7297 (if (= tt js2-FUNCTION)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7298 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7299 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7300 (setq n (js2-parse-function (if js2-called-by-compile-function
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7301 'FUNCTION_EXPRESSION
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7302 'FUNCTION_STATEMENT)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7303 (js2-record-imenu-functions n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7304 ;; not a function - parse a statement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7305 (setq n (js2-parse-statement)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7306 ;; add function or statement to script
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7307 (setq end (js2-node-end n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7308 (js2-block-node-push root n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7309 ;; add comments to root in lexical order
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7310 (when js2-scanned-comments
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7311 ;; if we find a comment beyond end of normal kids, use its end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7312 (setq end (max end (js2-node-end (first js2-scanned-comments))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7313 (dolist (comment js2-scanned-comments)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7314 (push comment (js2-ast-root-comments root))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7315 (js2-node-add-children root comment)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7316 (setf (js2-node-len root) (- end pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7317 ;; Give extensions a chance to muck with things before highlighting starts.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7318 (dolist (callback js2-post-parse-callbacks)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7319 (funcall callback))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7320 (js2-highlight-undeclared-vars)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7321 root))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7322
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7323 (defun js2-function-parser ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7324 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7325 (js2-parse-function 'FUNCTION_EXPRESSION_STATEMENT))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7326
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7327 (defun js2-parse-function-closure-body (fn-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7328 "Parse a JavaScript 1.8 function closure body."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7329 (let ((js2-nesting-of-function (1+ js2-nesting-of-function)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7330 (if js2-ts-hit-eof
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7331 (js2-report-error "msg.no.brace.body" nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7332 (js2-node-pos fn-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7333 (- js2-ts-cursor (js2-node-pos fn-node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7334 (js2-node-add-children fn-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7335 (setf (js2-function-node-body fn-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7336 (js2-parse-expr))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7337
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7338 (defun js2-parse-function-body (fn-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7339 (js2-must-match js2-LC "msg.no.brace.body"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7340 (js2-node-pos fn-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7341 (- js2-ts-cursor (js2-node-pos fn-node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7342 (let ((pos js2-token-beg) ; LC position
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7343 (pn (make-js2-block-node)) ; starts at LC position
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7344 tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7345 end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7346 (incf js2-nesting-of-function)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7347 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7348 (while (not (or (= (setq tt (js2-peek-token)) js2-ERROR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7349 (= tt js2-EOF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7350 (= tt js2-RC)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7351 (js2-block-node-push pn (if (/= tt js2-FUNCTION)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7352 (js2-parse-statement)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7353 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7354 (js2-parse-function 'FUNCTION_STATEMENT))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7355 (decf js2-nesting-of-function))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7356 (setq end js2-token-end) ; assume no curly and leave at current token
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7357 (if (js2-must-match js2-RC "msg.no.brace.after.body" pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7358 (setq end js2-token-end))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7359 (setf (js2-node-pos pn) pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7360 (js2-node-len pn) (- end pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7361 (setf (js2-function-node-body fn-node) pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7362 (js2-node-add-children fn-node pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7363 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7364
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7365 (defun js2-parse-function-params (fn-node pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7366 (if (js2-match-token js2-RP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7367 (setf (js2-function-node-rp fn-node) (- js2-token-beg pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7368 (let (params len param)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7369 (loop for tt = (js2-peek-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7370 do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7371 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7372 ;; destructuring param
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7373 ((or (= tt js2-LB) (= tt js2-LC))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7374 (push (js2-parse-primary-expr) params))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7375 ;; simple name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7376 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7377 (js2-must-match js2-NAME "msg.no.parm")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7378 (js2-record-face 'js2-function-param-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7379 (setq param (js2-create-name-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7380 (js2-define-symbol js2-LP js2-ts-string param)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7381 (push param params)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7382 while
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7383 (js2-match-token js2-COMMA))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7384 (if (js2-must-match js2-RP "msg.no.paren.after.parms")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7385 (setf (js2-function-node-rp fn-node) (- js2-token-beg pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7386 (dolist (p params)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7387 (js2-node-add-children fn-node p)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7388 (push p (js2-function-node-params fn-node))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7389
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7390 (defsubst js2-check-inconsistent-return-warning (fn-node name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7391 "Possibly show inconsistent-return warning.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7392 Last token scanned is the close-curly for the function body."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7393 (when (and js2-mode-show-strict-warnings
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7394 js2-strict-inconsistent-return-warning
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7395 (not (js2-has-consistent-return-usage
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7396 (js2-function-node-body fn-node))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7397 ;; Have it extend from close-curly to bol or beginning of block.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7398 (let ((pos (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7399 (goto-char js2-token-end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7400 (max (js2-node-abs-pos (js2-function-node-body fn-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7401 (point-at-bol))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7402 (end js2-token-end))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7403 (if (plusp (js2-name-node-length name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7404 (js2-add-strict-warning "msg.no.return.value"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7405 (js2-name-node-name name) pos end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7406 (js2-add-strict-warning "msg.anon.no.return.value" nil pos end)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7407
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7408 (defun js2-parse-function (function-type)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7409 "Function parser. FUNCTION-TYPE is a symbol."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7410 (let ((pos js2-token-beg) ; start of 'function' keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7411 name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7412 name-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7413 name-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7414 fn-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7415 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7416 (synthetic-type function-type)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7417 member-expr-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7418 ;; parse function name, expression, or non-name (anonymous)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7419 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7420 ;; function foo(...)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7421 ((js2-match-token js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7422 (setq name (js2-create-name-node t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7423 name-beg js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7424 name-end js2-token-end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7425 (unless (js2-match-token js2-LP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7426 (when js2-allow-member-expr-as-function-name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7427 ;; function foo.bar(...)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7428 (setq member-expr-node name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7429 name nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7430 member-expr-node (js2-parse-member-expr-tail
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7431 nil member-expr-node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7432 (js2-must-match js2-LP "msg.no.paren.parms")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7433 ((js2-match-token js2-LP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7434 nil) ; anonymous function: leave name as null
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7435 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7436 ;; function random-member-expr(...)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7437 (when js2-allow-member-expr-as-function-name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7438 ;; Note that memberExpr can not start with '(' like
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7439 ;; in function (1+2).toString(), because 'function (' already
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7440 ;; processed as anonymous function
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7441 (setq member-expr-node (js2-parse-member-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7442 (js2-must-match js2-LP "msg.no.paren.parms")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7443 (if (= js2-current-token js2-LP) ; eventually matched LP?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7444 (setq lp js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7445 (if member-expr-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7446 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7447 (setq synthetic-type 'FUNCTION_EXPRESSION)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7448 (js2-parse-highlight-member-expr-fn-name member-expr-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7449 (if name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7450 (js2-set-face name-beg name-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7451 'font-lock-function-name-face 'record)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7452 (if (and (not (eq synthetic-type 'FUNCTION_EXPRESSION))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7453 (plusp (js2-name-node-length name)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7454 ;; Function statements define a symbol in the enclosing scope
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7455 (js2-define-symbol js2-FUNCTION (js2-name-node-name name) fn-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7456 (setf fn-node (make-js2-function-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7457 :name name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7458 :form function-type
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7459 :lp (if lp (- lp pos))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7460 (if (or (js2-inside-function) (plusp js2-nesting-of-with))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7461 ;; 1. Nested functions are not affected by the dynamic scope flag
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7462 ;; as dynamic scope is already a parent of their scope.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7463 ;; 2. Functions defined under the with statement also immune to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7464 ;; this setup, in which case dynamic scope is ignored in favor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7465 ;; of the with object.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7466 (setf (js2-function-node-ignore-dynamic fn-node) t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7467 ;; dynamically bind all the per-function variables
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7468 (let ((js2-current-script-or-fn fn-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7469 (js2-current-scope fn-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7470 (js2-nesting-of-with 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7471 (js2-end-flags 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7472 js2-label-set
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7473 js2-loop-set
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7474 js2-loop-and-switch-set)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7475 (js2-parse-function-params fn-node pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7476 (if (and (>= js2-language-version 180)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7477 (/= (js2-peek-token) js2-LC))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7478 (js2-parse-function-closure-body fn-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7479 (js2-parse-function-body fn-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7480 (if name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7481 (js2-node-add-children fn-node name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7482 (js2-check-inconsistent-return-warning fn-node name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7483 ;; Function expressions define a name only in the body of the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7484 ;; function, and only if not hidden by a parameter name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7485 (if (and name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7486 (eq synthetic-type 'FUNCTION_EXPRESSION)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7487 (null (js2-scope-get-symbol js2-current-scope
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7488 (js2-name-node-name name))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7489 (js2-define-symbol js2-FUNCTION
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7490 (js2-name-node-name name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7491 fn-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7492 (if (and name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7493 (eq function-type 'FUNCTION_EXPRESSION_STATEMENT))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7494 (js2-record-imenu-functions fn-node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7495 (setf (js2-node-len fn-node) (- js2-ts-cursor pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7496 (js2-function-node-member-expr fn-node) member-expr-node) ; may be nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7497 ;; Rhino doesn't do this, but we need it for finding undeclared vars.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7498 ;; We wait until after parsing the function to set its parent scope,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7499 ;; since `js2-define-symbol' needs the defining-scope check to stop
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7500 ;; at the function boundary when checking for redeclarations.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7501 (setf (js2-scope-parent-scope fn-node) js2-current-scope)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7502 fn-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7503
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7504 (defun js2-parse-statements (&optional parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7505 "Parse a statement list. Last token consumed must be js2-LC.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7506
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7507 PARENT can be a `js2-block-node', in which case the statements are
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7508 appended to PARENT. Otherwise a new `js2-block-node' is created
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7509 and returned.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7510
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7511 This function does not match the closing js2-RC: the caller
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7512 matches the RC so it can provide a suitable error message if not
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7513 matched. This means it's up to the caller to set the length of
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7514 the node to include the closing RC. The node start pos is set to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7515 the absolute buffer start position, and the caller should fix it
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7516 up to be relative to the parent node. All children of this block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7517 node are given relative start positions and correct lengths."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7518 (let ((pn (or parent (make-js2-block-node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7519 tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7520 (setf (js2-node-pos pn) js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7521 (while (and (> (setq tt (js2-peek-token)) js2-EOF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7522 (/= tt js2-RC))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7523 (js2-block-node-push pn (js2-parse-statement)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7524 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7525
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7526 (defun js2-parse-statement ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7527 (let (tt pn beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7528 ;; coarse-grained user-interrupt check - needs work
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7529 (and js2-parse-interruptable-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7530 (zerop (% (incf js2-parse-stmt-count)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7531 js2-statements-per-pause))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7532 (input-pending-p)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7533 (throw 'interrupted t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7534 (setq pn (js2-statement-helper))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7535 ;; no-side-effects warning check
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7536 (unless (js2-node-has-side-effects pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7537 (setq end (js2-node-end pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7538 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7539 (goto-char end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7540 (setq beg (max (js2-node-pos pn) (point-at-bol))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7541 (js2-add-strict-warning "msg.no.side.effects" nil beg end))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7542 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7543
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7544 ;; These correspond to the switch cases in Parser.statementHelper
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7545 (defconst js2-parsers
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7546 (let ((parsers (make-vector js2-num-tokens
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7547 #'js2-parse-expr-stmt)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7548 (aset parsers js2-BREAK #'js2-parse-break)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7549 (aset parsers js2-CONST #'js2-parse-const-var)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7550 (aset parsers js2-CONTINUE #'js2-parse-continue)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7551 (aset parsers js2-DEBUGGER #'js2-parse-debugger)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7552 (aset parsers js2-DEFAULT #'js2-parse-default-xml-namespace)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7553 (aset parsers js2-DO #'js2-parse-do)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7554 (aset parsers js2-FOR #'js2-parse-for)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7555 (aset parsers js2-FUNCTION #'js2-function-parser)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7556 (aset parsers js2-IF #'js2-parse-if)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7557 (aset parsers js2-LC #'js2-parse-block)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7558 (aset parsers js2-LET #'js2-parse-let-stmt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7559 (aset parsers js2-NAME #'js2-parse-name-or-label)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7560 (aset parsers js2-RETURN #'js2-parse-ret-yield)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7561 (aset parsers js2-SEMI #'js2-parse-semi)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7562 (aset parsers js2-SWITCH #'js2-parse-switch)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7563 (aset parsers js2-THROW #'js2-parse-throw)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7564 (aset parsers js2-TRY #'js2-parse-try)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7565 (aset parsers js2-VAR #'js2-parse-const-var)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7566 (aset parsers js2-WHILE #'js2-parse-while)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7567 (aset parsers js2-WITH #'js2-parse-with)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7568 (aset parsers js2-YIELD #'js2-parse-ret-yield)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7569 parsers)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7570 "A vector mapping token types to parser functions.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7571
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7572 (defsubst js2-parse-warn-missing-semi (beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7573 (and js2-mode-show-strict-warnings
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7574 js2-strict-missing-semi-warning
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7575 (js2-add-strict-warning
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7576 "msg.missing.semi" nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7577 ;; back up to beginning of statement or line
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7578 (max beg (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7579 (goto-char end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7580 (point-at-bol)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7581 end)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7582
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7583 (defconst js2-no-semi-insertion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7584 (list js2-IF
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7585 js2-SWITCH
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7586 js2-WHILE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7587 js2-DO
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7588 js2-FOR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7589 js2-TRY
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7590 js2-WITH
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7591 js2-LC
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7592 js2-ERROR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7593 js2-SEMI
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7594 js2-FUNCTION)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7595 "List of tokens that don't do automatic semicolon insertion.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7596
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7597 (defconst js2-autoinsert-semi-and-warn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7598 (list js2-ERROR js2-EOF js2-RC))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7599
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7600 (defun js2-statement-helper ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7601 (let* ((tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7602 (first-tt tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7603 (beg js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7604 (parser (if (= tt js2-ERROR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7605 #'js2-parse-semi
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7606 (aref js2-parsers tt)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7607 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7608 tt-flagged)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7609 ;; If the statement is set, then it's been told its label by now.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7610 (and js2-labeled-stmt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7611 (js2-labeled-stmt-node-stmt js2-labeled-stmt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7612 (setq js2-labeled-stmt nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7613 (setq pn (funcall parser))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7614 ;; Don't do auto semi insertion for certain statement types.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7615 (unless (or (memq first-tt js2-no-semi-insertion)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7616 (js2-labeled-stmt-node-p pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7617 (js2-auto-insert-semicolon pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7618 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7619
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7620 (defun js2-auto-insert-semicolon (pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7621 (let* ((tt-flagged (js2-peek-flagged-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7622 (tt (logand tt-flagged js2-clear-ti-mask))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7623 (pos (js2-node-pos pn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7624 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7625 ((= tt js2-SEMI)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7626 ;; Consume ';' as a part of expression
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7627 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7628 ;; extend the node bounds to include the semicolon.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7629 (setf (js2-node-len pn) (- js2-token-end pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7630 ((memq tt js2-autoinsert-semi-and-warn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7631 ;; Autoinsert ;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7632 (js2-parse-warn-missing-semi pos (js2-node-end pn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7633 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7634 (if (js2-flag-not-set-p tt-flagged js2-ti-after-eol)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7635 ;; Report error if no EOL or autoinsert ';' otherwise
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7636 (js2-report-error "msg.no.semi.stmt")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7637 (js2-parse-warn-missing-semi pos (js2-node-end pn)))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7638
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7639 (defun js2-parse-condition ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7640 "Parse a parenthesized boolean expression, e.g. in an if- or while-stmt.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7641 The parens are discarded and the expression node is returned.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7642 The `pos' field of the return value is set to an absolute position
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7643 that must be fixed up by the caller.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7644 Return value is a list (EXPR LP RP), with absolute paren positions."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7645 (let (pn lp rp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7646 (if (js2-must-match js2-LP "msg.no.paren.cond")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7647 (setq lp js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7648 (setq pn (js2-parse-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7649 (if (js2-must-match js2-RP "msg.no.paren.after.cond")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7650 (setq rp js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7651 ;; Report strict warning on code like "if (a = 7) ..."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7652 (if (and js2-strict-cond-assign-warning
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7653 (js2-assign-node-p pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7654 (js2-add-strict-warning "msg.equal.as.assign" nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7655 (js2-node-pos pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7656 (+ (js2-node-pos pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7657 (js2-node-len pn))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7658 (list pn lp rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7659
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7660 (defun js2-parse-if ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7661 "Parser for if-statement. Last matched token must be js2-IF."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7662 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7663 cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7664 if-true
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7665 if-false
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7666 else-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7667 end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7668 pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7669 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7670 (setq cond (js2-parse-condition)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7671 if-true (js2-parse-statement)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7672 if-false (if (js2-match-token js2-ELSE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7673 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7674 (setq else-pos (- js2-token-beg pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7675 (js2-parse-statement)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7676 end (js2-node-end (or if-false if-true))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7677 pn (make-js2-if-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7678 :len (- end pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7679 :condition (car cond)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7680 :then-part if-true
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7681 :else-part if-false
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7682 :else-pos else-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7683 :lp (js2-relpos (second cond) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7684 :rp (js2-relpos (third cond) pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7685 (js2-node-add-children pn (car cond) if-true if-false)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7686 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7687
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7688 (defun js2-parse-switch ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7689 "Parser for if-statement. Last matched token must be js2-SWITCH."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7690 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7691 tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7692 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7693 discriminant
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7694 has-default
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7695 case-expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7696 case-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7697 case-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7698 cases
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7699 stmt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7700 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7701 rp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7702 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7703 (if (js2-must-match js2-LP "msg.no.paren.switch")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7704 (setq lp js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7705 (setq discriminant (js2-parse-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7706 pn (make-js2-switch-node :discriminant discriminant
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7707 :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7708 :lp (js2-relpos lp pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7709 (js2-node-add-children pn discriminant)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7710 (js2-enter-switch pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7711 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7712 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7713 (if (js2-must-match js2-RP "msg.no.paren.after.switch")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7714 (setf (js2-switch-node-rp pn) (- js2-token-beg pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7715 (js2-must-match js2-LC "msg.no.brace.switch")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7716 (catch 'break
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7717 (while t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7718 (setq tt (js2-next-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7719 case-pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7720 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7721 ((= tt js2-RC)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7722 (setf (js2-node-len pn) (- js2-token-end pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7723 (throw 'break nil)) ; done
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7724 ((= tt js2-CASE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7725 (setq case-expr (js2-parse-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7726 (js2-must-match js2-COLON "msg.no.colon.case"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7727 ((= tt js2-DEFAULT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7728 (if has-default
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7729 (js2-report-error "msg.double.switch.default"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7730 (setq has-default t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7731 case-expr nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7732 (js2-must-match js2-COLON "msg.no.colon.case"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7733 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7734 (js2-report-error "msg.bad.switch")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7735 (throw 'break nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7736 (setq case-node (make-js2-case-node :pos case-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7737 :len (- js2-token-end case-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7738 :expr case-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7739 (js2-node-add-children case-node case-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7740 (while (and (/= (setq tt (js2-peek-token)) js2-RC)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7741 (/= tt js2-CASE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7742 (/= tt js2-DEFAULT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7743 (/= tt js2-EOF))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7744 (setf stmt (js2-parse-statement)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7745 (js2-node-len case-node) (- (js2-node-end stmt) case-pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7746 (js2-block-node-push case-node stmt))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7747 (push case-node cases)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7748 ;; add cases last, as pushing reverses the order to be correct
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7749 (dolist (kid cases)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7750 (js2-node-add-children pn kid)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7751 (push kid (js2-switch-node-cases pn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7752 pn) ; return value
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7753 (js2-exit-switch))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7754
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7755 (defun js2-parse-while ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7756 "Parser for while-statement. Last matched token must be js2-WHILE."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7757 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7758 (pn (make-js2-while-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7759 cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7760 body)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7761 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7762 (js2-enter-loop pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7763 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7764 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7765 (setf cond (js2-parse-condition)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7766 (js2-while-node-condition pn) (car cond)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7767 body (js2-parse-statement)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7768 (js2-while-node-body pn) body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7769 (js2-node-len pn) (- (js2-node-end body) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7770 (js2-while-node-lp pn) (js2-relpos (second cond) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7771 (js2-while-node-rp pn) (js2-relpos (third cond) pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7772 (js2-node-add-children pn body (car cond)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7773 (js2-exit-loop))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7774 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7775
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7776 (defun js2-parse-do ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7777 "Parser for do-statement. Last matched token must be js2-DO."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7778 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7779 (pn (make-js2-do-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7780 cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7781 body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7782 end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7783 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7784 (js2-enter-loop pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7785 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7786 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7787 (setq body (js2-parse-statement))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7788 (js2-must-match js2-WHILE "msg.no.while.do")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7789 (setf (js2-do-node-while-pos pn) (- js2-token-beg pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7790 cond (js2-parse-condition)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7791 (js2-do-node-condition pn) (car cond)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7792 (js2-do-node-body pn) body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7793 end js2-ts-cursor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7794 (js2-do-node-lp pn) (js2-relpos (second cond) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7795 (js2-do-node-rp pn) (js2-relpos (third cond) pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7796 (js2-node-add-children pn (car cond) body))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7797 (js2-exit-loop))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7798 ;; Always auto-insert semicolon to follow SpiderMonkey:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7799 ;; It is required by ECMAScript but is ignored by the rest of
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7800 ;; world; see bug 238945
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7801 (if (js2-match-token js2-SEMI)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7802 (setq end js2-ts-cursor))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7803 (setf (js2-node-len pn) (- end pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7804 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7805
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7806 (defun js2-parse-for ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7807 "Parser for for-statement. Last matched token must be js2-FOR.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7808 Parses for, for-in, and for each-in statements."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7809 (let ((for-pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7810 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7811 is-for-each
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7812 is-for-in
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7813 in-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7814 each-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7815 tmp-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7816 init ; Node init is also foo in 'foo in object'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7817 cond ; Node cond is also object in 'foo in object'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7818 incr ; 3rd section of for-loop initializer
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7819 body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7820 tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7821 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7822 rp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7823 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7824 ;; See if this is a for each () instead of just a for ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7825 (when (js2-match-token js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7826 (if (string= "each" js2-ts-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7827 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7828 (setq is-for-each t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7829 each-pos (- js2-token-beg for-pos)) ; relative
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7830 (js2-record-face 'font-lock-keyword-face))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7831 (js2-report-error "msg.no.paren.for")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7832 (if (js2-must-match js2-LP "msg.no.paren.for")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7833 (setq lp (- js2-token-beg for-pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7834 (setq tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7835 ;; parse init clause
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7836 (let ((js2-in-for-init t)) ; set as dynamic variable
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7837 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7838 ((= tt js2-SEMI)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7839 (setq init (make-js2-empty-expr-node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7840 ((or (= tt js2-VAR) (= tt js2-LET))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7841 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7842 (setq init (js2-parse-variables tt js2-token-beg)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7843 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7844 (setq init (js2-parse-expr)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7845 (if (js2-match-token js2-IN)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7846 (setq is-for-in t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7847 in-pos (- js2-token-beg for-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7848 cond (js2-parse-expr)) ; object over which we're iterating
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7849 ;; else ordinary for loop - parse cond and incr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7850 (js2-must-match js2-SEMI "msg.no.semi.for")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7851 (setq cond (if (= (js2-peek-token) js2-SEMI)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7852 (make-js2-empty-expr-node) ; no loop condition
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7853 (js2-parse-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7854 (js2-must-match js2-SEMI "msg.no.semi.for.cond")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7855 (setq tmp-pos js2-token-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7856 incr (if (= (js2-peek-token) js2-RP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7857 (make-js2-empty-expr-node :pos tmp-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7858 (js2-parse-expr))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7859 (if (js2-must-match js2-RP "msg.no.paren.for.ctrl")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7860 (setq rp (- js2-token-beg for-pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7861 (if (not is-for-in)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7862 (setq pn (make-js2-for-node :init init
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7863 :condition cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7864 :update incr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7865 :lp lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7866 :rp rp))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7867 ;; cond could be null if 'in obj' got eaten by the init node.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7868 (if (js2-infix-node-p init)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7869 ;; it was (foo in bar) instead of (var foo in bar)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7870 (setq cond (js2-infix-node-right init)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7871 init (js2-infix-node-left init))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7872 (if (and (js2-var-decl-node-p init)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7873 (> (length (js2-var-decl-node-kids init)) 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7874 (js2-report-error "msg.mult.index")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7875 (setq pn (make-js2-for-in-node :iterator init
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7876 :object cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7877 :in-pos in-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7878 :foreach-p is-for-each
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7879 :each-pos each-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7880 :lp lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7881 :rp rp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7882 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7883 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7884 (js2-enter-loop pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7885 ;; We have to parse the body -after- creating the loop node,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7886 ;; so that the loop node appears in the js2-loop-set, allowing
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7887 ;; break/continue statements to find the enclosing loop.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7888 (setf body (js2-parse-statement)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7889 (js2-loop-node-body pn) body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7890 (js2-node-pos pn) for-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7891 (js2-node-len pn) (- (js2-node-end body) for-pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7892 (js2-node-add-children pn init cond incr body))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7893 ;; finally
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7894 (js2-exit-loop))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7895 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7896
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7897 (defun js2-parse-try ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7898 "Parser for try-statement. Last matched token must be js2-TRY."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7899 (let ((try-pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7900 try-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7901 try-block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7902 catch-blocks
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7903 finally-block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7904 saw-default-catch
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7905 peek
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7906 var-name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7907 catch-cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7908 catch-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7909 guard-kwd
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7910 catch-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7911 finally-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7912 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7913 block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7914 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7915 rp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7916 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7917 (if (/= (js2-peek-token) js2-LC)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7918 (js2-report-error "msg.no.brace.try"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7919 (setq try-block (js2-parse-statement)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7920 try-end (js2-node-end try-block)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7921 peek (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7922 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7923 ((= peek js2-CATCH)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7924 (while (js2-match-token js2-CATCH)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7925 (setq catch-pos js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7926 guard-kwd nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7927 catch-cond nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7928 lp nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7929 rp nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7930 (if saw-default-catch
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7931 (js2-report-error "msg.catch.unreachable"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7932 (if (js2-must-match js2-LP "msg.no.paren.catch")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7933 (setq lp (- js2-token-beg catch-pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7934 (js2-must-match js2-NAME "msg.bad.catchcond")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7935 (setq var-name (js2-create-name-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7936 (if (js2-match-token js2-IF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7937 (setq guard-kwd (- js2-token-beg catch-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7938 catch-cond (js2-parse-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7939 (setq saw-default-catch t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7940 (if (js2-must-match js2-RP "msg.bad.catchcond")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7941 (setq rp (- js2-token-beg catch-pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7942 (js2-must-match js2-LC "msg.no.brace.catchblock")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7943 (setq block (js2-parse-statements)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7944 try-end (js2-node-end block)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7945 catch-node (make-js2-catch-node :pos catch-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7946 :var-name var-name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7947 :guard-expr catch-cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7948 :guard-kwd guard-kwd
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7949 :block block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7950 :lp lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7951 :rp rp))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7952 (if (js2-must-match js2-RC "msg.no.brace.after.body")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7953 (setq try-end js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7954 (setf (js2-node-len block) (- try-end (js2-node-pos block))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7955 (js2-node-len catch-node) (- try-end catch-pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7956 (js2-node-add-children catch-node var-name catch-cond block)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7957 (push catch-node catch-blocks)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7958 ((/= peek js2-FINALLY)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7959 (js2-must-match js2-FINALLY "msg.try.no.catchfinally"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7960 (js2-node-pos try-block)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7961 (- (setq try-end (js2-node-end try-block))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7962 (js2-node-pos try-block)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7963 (when (js2-match-token js2-FINALLY)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7964 (setq finally-pos js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7965 block (js2-parse-statement)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7966 try-end (js2-node-end block)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7967 finally-block (make-js2-finally-node :pos finally-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7968 :len (- try-end finally-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7969 :body block))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7970 (js2-node-add-children finally-block block))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7971 (setq pn (make-js2-try-node :pos try-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7972 :len (- try-end try-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7973 :try-block try-block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7974 :finally-block finally-block))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7975 (js2-node-add-children pn try-block finally-block)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7976 ;; push them onto the try-node, which reverses and corrects their order
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7977 (dolist (cb catch-blocks)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7978 (js2-node-add-children pn cb)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7979 (push cb (js2-try-node-catch-clauses pn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7980 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7981
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7982 (defun js2-parse-throw ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7983 "Parser for throw-statement. Last matched token must be js2-THROW."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7984 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7985 expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7986 pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7987 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7988 (if (= (js2-peek-token-or-eol) js2-EOL)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7989 ;; ECMAScript does not allow new lines before throw expression,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7990 ;; see bug 256617
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7991 (js2-report-error "msg.bad.throw.eol"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7992 (setq expr (js2-parse-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7993 pn (make-js2-throw-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7994 :len (- (js2-node-end expr) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7995 :expr expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7996 (js2-node-add-children pn expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7997 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7998
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
7999 (defsubst js2-match-jump-label-name (label-name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8000 "If break/continue specified a label, return that label's labeled stmt.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8001 Returns the corresponding `js2-labeled-stmt-node', or if LABEL-NAME
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8002 does not match an existing label, reports an error and returns nil."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8003 (let ((bundle (cdr (assoc label-name js2-label-set))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8004 (if (null bundle)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8005 (js2-report-error "msg.undef.label"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8006 bundle))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8007
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8008 (defun js2-parse-break ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8009 "Parser for break-statement. Last matched token must be js2-BREAK."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8010 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8011 (end js2-token-end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8012 break-target ; statement to break from
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8013 break-label ; in "break foo", name-node representing the foo
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8014 labels ; matching labeled statement to break to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8015 pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8016 (js2-consume-token) ; `break'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8017 (when (eq (js2-peek-token-or-eol) js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8018 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8019 (setq break-label (js2-create-name-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8020 end (js2-node-end break-label)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8021 ;; matchJumpLabelName only matches if there is one
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8022 labels (js2-match-jump-label-name js2-ts-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8023 break-target (if labels (car (js2-labeled-stmt-node-labels labels)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8024 (unless (or break-target break-label)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8025 ;; no break target specified - try for innermost enclosing loop/switch
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8026 (if (null js2-loop-and-switch-set)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8027 (unless break-label
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8028 (js2-report-error "msg.bad.break" nil pos (length "break")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8029 (setq break-target (car js2-loop-and-switch-set))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8030 (setq pn (make-js2-break-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8031 :len (- end pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8032 :label break-label
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8033 :target break-target))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8034 (js2-node-add-children pn break-label) ; but not break-target
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8035 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8036
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8037 (defun js2-parse-continue ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8038 "Parser for continue-statement. Last matched token must be js2-CONTINUE."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8039 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8040 (end js2-token-end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8041 label ; optional user-specified label, a `js2-name-node'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8042 labels ; current matching labeled stmt, if any
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8043 target ; the `js2-loop-node' target of this continue stmt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8044 pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8045 (js2-consume-token) ; `continue'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8046 (when (= (js2-peek-token-or-eol) js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8047 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8048 (setq label (js2-create-name-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8049 end (js2-node-end label)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8050 ;; matchJumpLabelName only matches if there is one
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8051 labels (js2-match-jump-label-name js2-ts-string)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8052 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8053 ((null labels) ; no current label to go to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8054 (if (null js2-loop-set) ; no loop to continue to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8055 (js2-report-error "msg.continue.outside" nil pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8056 (length "continue"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8057 (setq target (car js2-loop-set)))) ; innermost enclosing loop
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8058 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8059 (if (js2-loop-node-p (js2-labeled-stmt-node-stmt labels))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8060 (setq target (js2-labeled-stmt-node-stmt labels))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8061 (js2-report-error "msg.continue.nonloop" nil pos (- end pos)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8062 (setq pn (make-js2-continue-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8063 :len (- end pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8064 :label label
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8065 :target target))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8066 (js2-node-add-children pn label) ; but not target - it's not our child
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8067 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8068
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8069 (defun js2-parse-with ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8070 "Parser for with-statement. Last matched token must be js2-WITH."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8071 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8072 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8073 obj body pn lp rp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8074 (if (js2-must-match js2-LP "msg.no.paren.with")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8075 (setq lp js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8076 (setq obj (js2-parse-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8077 (if (js2-must-match js2-RP "msg.no.paren.after.with")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8078 (setq rp js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8079 (let ((js2-nesting-of-with (1+ js2-nesting-of-with)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8080 (setq body (js2-parse-statement)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8081 (setq pn (make-js2-with-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8082 :len (- (js2-node-end body) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8083 :object obj
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8084 :body body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8085 :lp (js2-relpos lp pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8086 :rp (js2-relpos rp pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8087 (js2-node-add-children pn obj body)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8088 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8089
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8090 (defun js2-parse-const-var ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8091 "Parser for var- or const-statement.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8092 Last matched token must be js2-CONST or js2-VAR."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8093 (let ((tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8094 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8095 expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8096 pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8097 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8098 (setq expr (js2-parse-variables tt js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8099 pn (make-js2-expr-stmt-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8100 :len (- (js2-node-end expr) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8101 :expr expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8102 (js2-node-add-children pn expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8103 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8104
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8105 (defsubst js2-wrap-with-expr-stmt (pos expr &optional add-child)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8106 (let ((pn (make-js2-expr-stmt-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8107 :len (js2-node-len expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8108 :type (if (js2-inside-function)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8109 js2-EXPR_VOID
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8110 js2-EXPR_RESULT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8111 :expr expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8112 (if add-child
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8113 (js2-node-add-children pn expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8114 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8115
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8116 (defun js2-parse-let-stmt ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8117 "Parser for let-statement. Last matched token must be js2-LET."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8118 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8119 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8120 expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8121 pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8122 (if (= (js2-peek-token) js2-LP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8123 ;; let expression in statement context
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8124 (setq expr (js2-parse-let pos 'statement)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8125 pn (js2-wrap-with-expr-stmt pos expr t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8126 ;; else we're looking at a statement like let x=6, y=7;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8127 (setf expr (js2-parse-variables js2-LET pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8128 pn (js2-wrap-with-expr-stmt pos expr t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8129 (js2-node-type pn) js2-EXPR_RESULT))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8130 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8131
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8132 (defun js2-parse-ret-yield ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8133 (js2-parse-return-or-yield (js2-peek-token) nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8134
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8135 (defconst js2-parse-return-stmt-enders
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8136 (list js2-SEMI js2-RC js2-EOF js2-EOL js2-ERROR js2-RB js2-RP js2-YIELD))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8137
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8138 (defsubst js2-now-all-set (before after mask)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8139 "Return whether or not the bits in the mask have changed to all set.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8140 BEFORE is bits before change, AFTER is bits after change, and MASK is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8141 the mask for bits. Returns t if all the bits in the mask are set in AFTER
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8142 but not BEFORE."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8143 (and (/= (logand before mask) mask)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8144 (= (logand after mask) mask)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8145
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8146 (defun js2-parse-return-or-yield (tt expr-context)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8147 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8148 (end js2-token-end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8149 (before js2-end-flags)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8150 (inside-function (js2-inside-function))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8151 e
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8152 ret
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8153 name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8154 (unless inside-function
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8155 (js2-report-error (if (eq tt js2-RETURN)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8156 "msg.bad.return"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8157 "msg.bad.yield")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8158 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8159 ;; This is ugly, but we don't want to require a semicolon.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8160 (unless (memq (js2-peek-token-or-eol) js2-parse-return-stmt-enders)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8161 (setq e (js2-parse-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8162 end (js2-node-end e)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8163 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8164 ((eq tt js2-RETURN)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8165 (js2-set-flag js2-end-flags (if (null e)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8166 js2-end-returns
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8167 js2-end-returns-value))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8168 (setq ret (make-js2-return-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8169 :len (- end pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8170 :retval e))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8171 (js2-node-add-children ret e)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8172 ;; See if we need a strict mode warning.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8173 ;; TODO: The analysis done by `js2-has-consistent-return-usage' is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8174 ;; more thorough and accurate than this before/after flag check.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8175 ;; E.g. if there's a finally-block that always returns, we shouldn't
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8176 ;; show a warning generated by inconsistent returns in the catch blocks.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8177 ;; Basically `js2-has-consistent-return-usage' needs to keep more state,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8178 ;; so we know which returns/yields to highlight, and we should get rid of
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8179 ;; all the checking in `js2-parse-return-or-yield'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8180 (if (and js2-strict-inconsistent-return-warning
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8181 (js2-now-all-set before js2-end-flags
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8182 (logior js2-end-returns js2-end-returns-value)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8183 (js2-add-strict-warning "msg.return.inconsistent" nil pos end)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8184 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8185 (unless (js2-inside-function)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8186 (js2-report-error "msg.bad.yield"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8187 (js2-set-flag js2-end-flags js2-end-yields)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8188 (setq ret (make-js2-yield-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8189 :len (- end pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8190 :value e))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8191 (js2-node-add-children ret e)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8192 (unless expr-context
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8193 (setq e ret
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8194 ret (js2-wrap-with-expr-stmt pos e t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8195 (js2-set-requires-activation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8196 (js2-set-is-generator))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8197 ;; see if we are mixing yields and value returns.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8198 (when (and inside-function
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8199 (js2-now-all-set before js2-end-flags
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8200 (logior js2-end-yields js2-end-returns-value)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8201 (setq name (js2-function-name js2-current-script-or-fn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8202 (if (zerop (length name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8203 (js2-report-error "msg.anon.generator.returns" nil pos (- end pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8204 (js2-report-error "msg.generator.returns" name pos (- end pos))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8205 ret))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8206
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8207 (defun js2-parse-debugger ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8208 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8209 (make-js2-keyword-node :type js2-DEBUGGER))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8210
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8211 (defun js2-parse-block ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8212 "Parser for a curly-delimited statement block.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8213 Last token matched must be js2-LC."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8214 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8215 (pn (make-js2-scope)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8216 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8217 (js2-push-scope pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8218 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8219 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8220 (js2-parse-statements pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8221 (js2-must-match js2-RC "msg.no.brace.block")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8222 (setf (js2-node-len pn) (- js2-token-end pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8223 (js2-pop-scope))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8224 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8225
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8226 ;; for js2-ERROR too, to have a node for error recovery to work on
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8227 (defun js2-parse-semi ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8228 "Parse a statement or handle an error.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8229 Last matched token is js-SEMI or js-ERROR."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8230 (let ((tt (js2-peek-token)) pos len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8231 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8232 (if (eq tt js2-SEMI)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8233 (make-js2-empty-expr-node :len 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8234 (setq pos js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8235 len (- js2-token-beg pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8236 (js2-report-error "msg.syntax" nil pos len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8237 (make-js2-error-node :pos pos :len len))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8238
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8239 (defun js2-parse-default-xml-namespace ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8240 "Parse a `default xml namespace = <expr>' e4x statement."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8241 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8242 end len expr unary es)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8243 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8244 (js2-must-have-xml)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8245 (js2-set-requires-activation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8246 (setq len (- js2-ts-cursor pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8247 (unless (and (js2-match-token js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8248 (string= js2-ts-string "xml"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8249 (js2-report-error "msg.bad.namespace" nil pos len))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8250 (unless (and (js2-match-token js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8251 (string= js2-ts-string "namespace"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8252 (js2-report-error "msg.bad.namespace" nil pos len))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8253 (unless (js2-match-token js2-ASSIGN)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8254 (js2-report-error "msg.bad.namespace" nil pos len))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8255 (setq expr (js2-parse-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8256 end (js2-node-end expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8257 unary (make-js2-unary-node :type js2-DEFAULTNAMESPACE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8258 :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8259 :len (- end pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8260 :operand expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8261 (js2-node-add-children unary expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8262 (make-js2-expr-stmt-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8263 :len (- end pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8264 :expr unary)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8265
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8266 (defun js2-record-label (label bundle)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8267 ;; current token should be colon that `js2-parse-primary-expr' left untouched
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8268 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8269 (let ((name (js2-label-node-name label))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8270 labeled-stmt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8271 dup)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8272 (when (setq labeled-stmt (cdr (assoc name js2-label-set)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8273 ;; flag both labels if possible when used in editing mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8274 (if (and js2-parse-ide-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8275 (setq dup (js2-get-label-by-name labeled-stmt name)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8276 (js2-report-error "msg.dup.label" nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8277 (js2-node-abs-pos dup) (js2-node-len dup)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8278 (js2-report-error "msg.dup.label" nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8279 (js2-node-pos label) (js2-node-len label)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8280 (js2-labeled-stmt-node-add-label bundle label)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8281 (js2-node-add-children bundle label)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8282 ;; Add one reference to the bundle per label in `js2-label-set'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8283 (push (cons name bundle) js2-label-set)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8284
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8285 (defun js2-parse-name-or-label ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8286 "Parser for identifier or label. Last token matched must be js2-NAME.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8287 Called when we found a name in a statement context. If it's a label, we gather
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8288 up any following labels and the next non-label statement into a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8289 `js2-labeled-stmt-node' bundle and return that. Otherwise we parse an
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8290 expression and return it wrapped in a `js2-expr-stmt-node'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8291 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8292 (end js2-token-end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8293 expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8294 stmt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8295 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8296 bundle
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8297 (continue t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8298 ;; set check for label and call down to `js2-parse-primary-expr'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8299 (js2-set-check-for-label)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8300 (setq expr (js2-parse-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8301 (if (/= (js2-node-type expr) js2-LABEL)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8302 ;; Parsed non-label expression - wrap with expression stmt.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8303 (setq pn (js2-wrap-with-expr-stmt pos expr t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8304 ;; else parsed a label
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8305 (setq bundle (make-js2-labeled-stmt-node :pos pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8306 (js2-record-label expr bundle)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8307 ;; look for more labels
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8308 (while (and continue (= (js2-peek-token) js2-NAME))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8309 (js2-set-check-for-label)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8310 (setq expr (js2-parse-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8311 (if (/= (js2-node-type expr) js2-LABEL)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8312 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8313 (setq stmt (js2-wrap-with-expr-stmt (js2-node-pos expr) expr t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8314 continue nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8315 (js2-auto-insert-semicolon stmt))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8316 (js2-record-label expr bundle)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8317 ;; no more labels; now parse the labeled statement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8318 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8319 (unless stmt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8320 (let ((js2-labeled-stmt bundle)) ; bind dynamically
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8321 (setq stmt (js2-statement-helper))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8322 ;; remove the labels for this statement from the global set
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8323 (dolist (label (js2-labeled-stmt-node-labels bundle))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8324 (setq js2-label-set (remove label js2-label-set))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8325 (setf (js2-labeled-stmt-node-stmt bundle) stmt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8326 (js2-node-len bundle) (- (js2-node-end stmt) pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8327 (js2-node-add-children bundle stmt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8328 bundle)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8329
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8330 (defun js2-parse-expr-stmt ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8331 "Default parser in statement context, if no recognized statement found."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8332 (js2-wrap-with-expr-stmt js2-token-beg (js2-parse-expr) t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8333
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8334 (defun js2-parse-variables (decl-type pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8335 "Parse a comma-separated list of variable declarations.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8336 Could be a 'var', 'const' or 'let' expression, possibly in a for-loop initializer.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8337
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8338 DECL-TYPE is a token value: either VAR, CONST, or LET depending on context.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8339 For 'var' or 'const', the keyword should be the token last scanned.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8340
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8341 POS is the position where the node should start. It's sometimes the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8342 var/const/let keyword, and other times the beginning of the first token
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8343 in the first variable declaration.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8344
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8345 Returns the parsed `js2-var-decl-node' expression node."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8346 (let* ((result (make-js2-var-decl-node :decl-type decl-type
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8347 :pos pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8348 destructuring
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8349 kid-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8350 tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8351 init
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8352 name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8353 end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8354 nbeg nend
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8355 vi
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8356 (continue t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8357 ;; Example:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8358 ;; var foo = {a: 1, b: 2}, bar = [3, 4];
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8359 ;; var {b: s2, a: s1} = foo, x = 6, y, [s3, s4] = bar;
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8360 (while continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8361 (setq destructuring nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8362 name nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8363 tt (js2-peek-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8364 kid-pos js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8365 end js2-token-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8366 init nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8367 (if (or (= tt js2-LB) (= tt js2-LC))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8368 ;; Destructuring assignment, e.g., var [a, b] = ...
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8369 (setq destructuring (js2-parse-primary-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8370 end (js2-node-end destructuring))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8371 ;; Simple variable name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8372 (when (js2-must-match js2-NAME "msg.bad.var")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8373 (setq name (js2-create-name-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8374 nbeg js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8375 nend js2-token-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8376 end nend)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8377 (js2-define-symbol decl-type js2-ts-string name js2-in-for-init)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8378 (when (js2-match-token js2-ASSIGN)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8379 (setq init (js2-parse-assign-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8380 end (js2-node-end init))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8381 (if (and js2-parse-ide-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8382 (or (js2-object-node-p init)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8383 (js2-function-node-p init)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8384 (js2-record-imenu-functions init name)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8385 (when name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8386 (js2-set-face nbeg nend (if (js2-function-node-p init)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8387 'font-lock-function-name-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8388 'font-lock-variable-name-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8389 'record))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8390 (setq vi (make-js2-var-init-node :pos kid-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8391 :len (- end kid-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8392 :type decl-type))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8393 (if destructuring
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8394 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8395 (if (and (null init) (not js2-in-for-init))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8396 (js2-report-error "msg.destruct.assign.no.init"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8397 (setf (js2-var-init-node-target vi) destructuring))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8398 (setf (js2-var-init-node-target vi) name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8399 (setf (js2-var-init-node-initializer vi) init)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8400 (js2-node-add-children vi name destructuring init)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8401 (js2-block-node-push result vi)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8402 (unless (js2-match-token js2-COMMA)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8403 (setq continue nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8404 (setf (js2-node-len result) (- end pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8405 result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8406
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8407 (defun js2-parse-let (pos &optional stmt-p)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8408 "Parse a let expression or statement.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8409 A let-expression is of the form `let (vars) expr'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8410 A let-statment is of the form `let (vars) {statements}'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8411 The third form of let is a variable declaration list, handled
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8412 by `js2-parse-variables'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8413 (let ((pn (make-js2-let-node :pos pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8414 beg vars body)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8415 (if (js2-must-match js2-LP "msg.no.paren.after.let")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8416 (setf (js2-let-node-lp pn) (- js2-token-beg pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8417 (js2-push-scope pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8418 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8419 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8420 (setq vars (js2-parse-variables js2-LET js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8421 (if (js2-must-match js2-RP "msg.no.paren.let")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8422 (setf (js2-let-node-rp pn) (- js2-token-beg pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8423 (if (and stmt-p (eq (js2-peek-token) js2-LC))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8424 ;; let statement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8425 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8426 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8427 (setf beg js2-token-beg ; position stmt at LC
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8428 body (js2-parse-statements))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8429 (js2-must-match js2-RC "msg.no.curly.let")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8430 (setf (js2-node-len body) (- js2-token-end beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8431 (js2-node-len pn) (- js2-token-end pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8432 (js2-let-node-body pn) body
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8433 (js2-node-type pn) js2-LET))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8434 ;; let expression
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8435 (setf body (js2-parse-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8436 (js2-node-len pn) (- (js2-node-end body) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8437 (js2-let-node-body pn) body))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8438 (js2-node-add-children pn vars body))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8439 (js2-pop-scope))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8440 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8441
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8442 (defsubst js2-define-new-symbol (decl-type name node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8443 (js2-scope-put-symbol js2-current-scope
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8444 name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8445 (make-js2-symbol decl-type name node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8446
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8447 (defun js2-define-symbol (decl-type name &optional node ignore-not-in-block)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8448 "Define a symbol in the current scope.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8449 If NODE is non-nil, it is the AST node associated with the symbol."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8450 (let* ((defining-scope (js2-get-defining-scope js2-current-scope name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8451 (symbol (if defining-scope
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8452 (js2-scope-get-symbol defining-scope name)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8453 (sdt (if symbol (js2-symbol-decl-type symbol) -1)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8454 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8455 ((and symbol ; already defined
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8456 (or (= sdt js2-CONST) ; old version is const
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8457 (= decl-type js2-CONST) ; new version is const
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8458 ;; two let-bound vars in this block have same name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8459 (and (= sdt js2-LET)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8460 (eq defining-scope js2-current-scope))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8461 (js2-report-error
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8462 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8463 ((= sdt js2-CONST) "msg.const.redecl")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8464 ((= sdt js2-LET) "msg.let.redecl")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8465 ((= sdt js2-VAR) "msg.var.redecl")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8466 ((= sdt js2-FUNCTION) "msg.function.redecl")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8467 (t "msg.parm.redecl"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8468 name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8469 ((= decl-type js2-LET)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8470 (if (and (not ignore-not-in-block)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8471 (or (= (js2-node-type js2-current-scope) js2-IF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8472 (js2-loop-node-p js2-current-scope)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8473 (js2-report-error "msg.let.decl.not.in.block")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8474 (js2-define-new-symbol decl-type name node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8475 ((or (= decl-type js2-VAR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8476 (= decl-type js2-CONST)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8477 (= decl-type js2-FUNCTION))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8478 (if symbol
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8479 (if (and js2-strict-var-redeclaration-warning (= sdt js2-VAR))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8480 (js2-add-strict-warning "msg.var.redecl" name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8481 (if (and js2-strict-var-hides-function-arg-warning (= sdt js2-LP))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8482 (js2-add-strict-warning "msg.var.hides.arg" name)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8483 (js2-define-new-symbol decl-type name node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8484 ((= decl-type js2-LP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8485 (if symbol
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8486 ;; must be duplicate parameter. Second parameter hides the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8487 ;; first, so go ahead and add the second pararameter
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8488 (js2-report-warning "msg.dup.parms" name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8489 (js2-define-new-symbol decl-type name node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8490 (t (js2-code-bug)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8491
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8492 (defun js2-parse-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8493 (let* ((pn (js2-parse-assign-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8494 (pos (js2-node-pos pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8495 left
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8496 right
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8497 op-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8498 (while (js2-match-token js2-COMMA)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8499 (setq op-pos (- js2-token-beg pos)) ; relative
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8500 (if (= (js2-peek-token) js2-YIELD)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8501 (js2-report-error "msg.yield.parenthesized"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8502 (setq right (js2-parse-assign-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8503 left pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8504 pn (make-js2-infix-node :type js2-COMMA
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8505 :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8506 :len (- js2-ts-cursor pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8507 :op-pos op-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8508 :left left
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8509 :right right))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8510 (js2-node-add-children pn left right))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8511 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8512
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8513 (defun js2-parse-assign-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8514 (let ((tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8515 (pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8516 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8517 left
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8518 right
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8519 op-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8520 (if (= tt js2-YIELD)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8521 (js2-parse-return-or-yield tt t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8522 ;; not yield - parse assignment expression
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8523 (setq pn (js2-parse-cond-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8524 tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8525 (when (and (<= js2-first-assign tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8526 (<= tt js2-last-assign))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8527 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8528 (setq op-pos (- js2-token-beg pos) ; relative
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8529 left pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8530 right (js2-parse-assign-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8531 pn (make-js2-assign-node :type tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8532 :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8533 :len (- (js2-node-end right) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8534 :op-pos op-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8535 :left left
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8536 :right right))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8537 (when js2-parse-ide-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8538 (js2-highlight-assign-targets pn left right)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8539 (if (or (js2-function-node-p right)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8540 (js2-object-node-p right))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8541 (js2-record-imenu-functions right left)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8542 ;; do this last so ide checks above can use absolute positions
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8543 (js2-node-add-children pn left right))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8544 pn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8545
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8546 (defun js2-parse-cond-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8547 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8548 (pn (js2-parse-or-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8549 test-expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8550 if-true
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8551 if-false
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8552 q-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8553 c-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8554 (when (js2-match-token js2-HOOK)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8555 (setq q-pos (- js2-token-beg pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8556 if-true (js2-parse-assign-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8557 (js2-must-match js2-COLON "msg.no.colon.cond")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8558 (setq c-pos (- js2-token-beg pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8559 if-false (js2-parse-assign-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8560 test-expr pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8561 pn (make-js2-cond-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8562 :len (- (js2-node-end if-false) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8563 :test-expr test-expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8564 :true-expr if-true
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8565 :false-expr if-false
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8566 :q-pos q-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8567 :c-pos c-pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8568 (js2-node-add-children pn test-expr if-true if-false))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8569 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8570
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8571 (defun js2-make-binary (type left parser)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8572 "Helper for constructing a binary-operator AST node.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8573 LEFT is the left-side-expression, already parsed, and the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8574 binary operator should have just been matched.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8575 PARSER is a function to call to parse the right operand,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8576 or a `js2-node' struct if it has already been parsed."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8577 (let* ((pos (js2-node-pos left))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8578 (op-pos (- js2-token-beg pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8579 (right (if (js2-node-p parser)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8580 parser
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8581 (funcall parser)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8582 (pn (make-js2-infix-node :type type
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8583 :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8584 :len (- (js2-node-end right) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8585 :op-pos op-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8586 :left left
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8587 :right right)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8588 (js2-node-add-children pn left right)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8589 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8590
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8591 (defun js2-parse-or-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8592 (let ((pn (js2-parse-and-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8593 (when (js2-match-token js2-OR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8594 (setq pn (js2-make-binary js2-OR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8595 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8596 'js2-parse-or-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8597 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8598
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8599 (defun js2-parse-and-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8600 (let ((pn (js2-parse-bit-or-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8601 (when (js2-match-token js2-AND)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8602 (setq pn (js2-make-binary js2-AND
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8603 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8604 'js2-parse-and-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8605 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8606
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8607 (defun js2-parse-bit-or-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8608 (let ((pn (js2-parse-bit-xor-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8609 (while (js2-match-token js2-BITOR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8610 (setq pn (js2-make-binary js2-BITOR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8611 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8612 'js2-parse-bit-xor-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8613 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8614
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8615 (defun js2-parse-bit-xor-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8616 (let ((pn (js2-parse-bit-and-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8617 (while (js2-match-token js2-BITXOR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8618 (setq pn (js2-make-binary js2-BITXOR
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8619 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8620 'js2-parse-bit-and-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8621 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8622
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8623 (defun js2-parse-bit-and-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8624 (let ((pn (js2-parse-eq-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8625 (while (js2-match-token js2-BITAND)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8626 (setq pn (js2-make-binary js2-BITAND
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8627 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8628 'js2-parse-eq-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8629 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8630
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8631 (defconst js2-parse-eq-ops
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8632 (list js2-EQ js2-NE js2-SHEQ js2-SHNE))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8633
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8634 (defun js2-parse-eq-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8635 (let ((pn (js2-parse-rel-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8636 tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8637 (while (memq (setq tt (js2-peek-token)) js2-parse-eq-ops)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8638 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8639 (setq pn (js2-make-binary tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8640 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8641 'js2-parse-rel-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8642 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8643
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8644 (defconst js2-parse-rel-ops
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8645 (list js2-IN js2-INSTANCEOF js2-LE js2-LT js2-GE js2-GT))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8646
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8647 (defun js2-parse-rel-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8648 (let ((pn (js2-parse-shift-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8649 (continue t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8650 tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8651 (while continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8652 (setq tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8653 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8654 ((and js2-in-for-init (= tt js2-IN))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8655 (setq continue nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8656 ((memq tt js2-parse-rel-ops)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8657 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8658 (setq pn (js2-make-binary tt pn 'js2-parse-shift-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8659 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8660 (setq continue nil))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8661 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8662
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8663 (defconst js2-parse-shift-ops
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8664 (list js2-LSH js2-URSH js2-RSH))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8665
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8666 (defun js2-parse-shift-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8667 (let ((pn (js2-parse-add-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8668 tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8669 (continue t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8670 (while continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8671 (setq tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8672 (if (memq tt js2-parse-shift-ops)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8673 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8674 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8675 (setq pn (js2-make-binary tt pn 'js2-parse-add-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8676 (setq continue nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8677 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8678
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8679 (defun js2-parse-add-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8680 (let ((pn (js2-parse-mul-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8681 tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8682 (continue t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8683 (while continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8684 (setq tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8685 (if (or (= tt js2-ADD) (= tt js2-SUB))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8686 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8687 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8688 (setq pn (js2-make-binary tt pn 'js2-parse-mul-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8689 (setq continue nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8690 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8691
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8692 (defconst js2-parse-mul-ops
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8693 (list js2-MUL js2-DIV js2-MOD))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8694
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8695 (defun js2-parse-mul-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8696 (let ((pn (js2-parse-unary-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8697 tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8698 (continue t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8699 (while continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8700 (setq tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8701 (if (memq tt js2-parse-mul-ops)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8702 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8703 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8704 (setq pn (js2-make-binary tt pn 'js2-parse-unary-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8705 (setq continue nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8706 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8707
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8708 (defsubst js2-make-unary (type parser &rest args)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8709 "Make a unary node of type TYPE.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8710 PARSER is either a node (for postfix operators) or a function to call
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8711 to parse the operand (for prefix operators)."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8712 (let* ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8713 (postfix (js2-node-p parser))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8714 (expr (if postfix
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8715 parser
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8716 (apply parser args)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8717 end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8718 pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8719 (if postfix ; e.g. i++
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8720 (setq pos (js2-node-pos expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8721 end js2-token-end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8722 (setq end (js2-node-end expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8723 (setq pn (make-js2-unary-node :type type
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8724 :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8725 :len (- end pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8726 :operand expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8727 (js2-node-add-children pn expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8728 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8729
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8730 (defconst js2-incrementable-node-types
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8731 (list js2-NAME js2-GETPROP js2-GETELEM js2-GET_REF js2-CALL)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8732 "Node types that can be the operand of a ++ or -- operator.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8733
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8734 (defsubst js2-check-bad-inc-dec (tt beg end unary)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8735 (unless (memq (js2-node-type (js2-unary-node-operand unary))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8736 js2-incrementable-node-types)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8737 (js2-report-error (if (= tt js2-INC)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8738 "msg.bad.incr"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8739 "msg.bad.decr")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8740 nil beg (- end beg))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8741
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8742 (defun js2-parse-unary-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8743 (let ((tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8744 pn expr beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8745 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8746 ((or (= tt js2-VOID)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8747 (= tt js2-NOT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8748 (= tt js2-BITNOT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8749 (= tt js2-TYPEOF))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8750 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8751 (js2-make-unary tt 'js2-parse-unary-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8752 ((= tt js2-ADD)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8753 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8754 ;; Convert to special POS token in decompiler and parse tree
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8755 (js2-make-unary js2-POS 'js2-parse-unary-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8756 ((= tt js2-SUB)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8757 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8758 ;; Convert to special NEG token in decompiler and parse tree
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8759 (js2-make-unary js2-NEG 'js2-parse-unary-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8760 ((or (= tt js2-INC)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8761 (= tt js2-DEC))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8762 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8763 (prog1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8764 (setq beg js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8765 end js2-token-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8766 expr (js2-make-unary tt 'js2-parse-member-expr t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8767 (js2-check-bad-inc-dec tt beg end expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8768 ((= tt js2-DELPROP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8769 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8770 (js2-make-unary js2-DELPROP 'js2-parse-unary-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8771 ((= tt js2-ERROR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8772 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8773 (make-js2-error-node)) ; try to continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8774 ((and (= tt js2-LT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8775 js2-compiler-xml-available)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8776 ;; XML stream encountered in expression.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8777 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8778 (js2-parse-member-expr-tail t (js2-parse-xml-initializer)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8779 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8780 (setq pn (js2-parse-member-expr t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8781 ;; Don't look across a newline boundary for a postfix incop.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8782 tt (js2-peek-token-or-eol))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8783 (when (or (= tt js2-INC) (= tt js2-DEC))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8784 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8785 (setf expr pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8786 pn (js2-make-unary tt expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8787 (js2-node-set-prop pn 'postfix t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8788 (js2-check-bad-inc-dec tt js2-token-beg js2-token-end pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8789 pn))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8790
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8791 (defun js2-parse-xml-initializer ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8792 "Parse an E4X XML initializer.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8793 I'm parsing it the way Rhino parses it, but without the tree-rewriting.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8794 Then I'll postprocess the result, depending on whether we're in IDE
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8795 mode or codegen mode, and generate the appropriate rewritten AST.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8796 IDE mode uses a rich AST that models the XML structure. Codegen mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8797 just concatenates everything and makes a new XML or XMLList out of it."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8798 (let ((tt (js2-get-first-xml-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8799 pn-xml
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8800 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8801 expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8802 kids
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8803 expr-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8804 (continue t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8805 (first-token t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8806 (when (not (or (= tt js2-XML) (= tt js2-XMLEND)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8807 (js2-report-error "msg.syntax"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8808 (setq pn-xml (make-js2-xml-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8809 (while continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8810 (if first-token
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8811 (setq first-token nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8812 (setq tt (js2-get-next-xml-token)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8813 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8814 ;; js2-XML means we found a {expr} in the XML stream.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8815 ;; The js2-ts-string is the XML up to the left-curly.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8816 ((= tt js2-XML)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8817 (push (make-js2-string-node :pos js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8818 :len (- js2-ts-cursor js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8819 kids)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8820 (js2-must-match js2-LC "msg.syntax")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8821 (setq expr-pos js2-ts-cursor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8822 expr (if (eq (js2-peek-token) js2-RC)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8823 (make-js2-empty-expr-node :pos expr-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8824 (js2-parse-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8825 (js2-must-match js2-RC "msg.syntax")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8826 (setq pn (make-js2-xml-js-expr-node :pos (js2-node-pos expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8827 :len (js2-node-len expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8828 :expr expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8829 (js2-node-add-children pn expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8830 (push pn kids))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8831 ;; a js2-XMLEND token means we hit the final close-tag.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8832 ((= tt js2-XMLEND)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8833 (push (make-js2-string-node :pos js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8834 :len (- js2-ts-cursor js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8835 kids)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8836 (dolist (kid (nreverse kids))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8837 (js2-block-node-push pn-xml kid))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8838 (setf (js2-node-len pn-xml) (- js2-ts-cursor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8839 (js2-node-pos pn-xml))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8840 continue nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8841 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8842 (js2-report-error "msg.syntax")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8843 (setq continue nil))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8844 pn-xml))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8845
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8846
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8847 (defun js2-parse-argument-list ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8848 "Parse an argument list and return it as a lisp list of nodes.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8849 Returns the list in reverse order. Consumes the right-paren token."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8850 (let (result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8851 (unless (js2-match-token js2-RP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8852 (loop do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8853 (if (= (js2-peek-token) js2-YIELD)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8854 (js2-report-error "msg.yield.parenthesized"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8855 (push (js2-parse-assign-expr) result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8856 while
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8857 (js2-match-token js2-COMMA))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8858 (js2-must-match js2-RP "msg.no.paren.arg")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8859 result)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8860
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8861 (defun js2-parse-member-expr (&optional allow-call-syntax)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8862 (let ((tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8863 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8864 pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8865 target
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8866 args
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8867 beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8868 end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8869 init
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8870 tail)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8871 (if (/= tt js2-NEW)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8872 (setq pn (js2-parse-primary-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8873 ;; parse a 'new' expression
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8874 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8875 (setq pos js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8876 beg pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8877 target (js2-parse-member-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8878 end (js2-node-end target)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8879 pn (make-js2-new-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8880 :target target
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8881 :len (- end pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8882 (js2-node-add-children pn target)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8883 (when (js2-match-token js2-LP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8884 ;; Add the arguments to pn, if any are supplied.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8885 (setf beg pos ; start of "new" keyword
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8886 pos js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8887 args (nreverse (js2-parse-argument-list))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8888 (js2-new-node-args pn) args
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8889 end js2-token-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8890 (js2-new-node-lp pn) (- pos beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8891 (js2-new-node-rp pn) (- end 1 beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8892 (apply #'js2-node-add-children pn args))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8893 (when (and js2-allow-rhino-new-expr-initializer
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8894 (js2-match-token js2-LC))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8895 (setf init (js2-parse-object-literal)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8896 end (js2-node-end init)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8897 (js2-new-node-initializer pn) init)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8898 (js2-node-add-children pn init))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8899 (setf (js2-node-len pn) (- beg pos))) ; end outer if
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8900 (js2-parse-member-expr-tail allow-call-syntax pn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8901
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8902 (defun js2-parse-member-expr-tail (allow-call-syntax pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8903 "Parse a chain of property/array accesses or function calls.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8904 Includes parsing for E4X operators like `..' and `.@'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8905 If ALLOW-CALL-SYNTAX is nil, stops when we encounter a left-paren.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8906 Returns an expression tree that includes PN, the parent node."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8907 (let ((beg (js2-node-pos pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8908 tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8909 (continue t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8910 (while continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8911 (setq tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8912 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8913 ((or (= tt js2-DOT) (= tt js2-DOTDOT))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8914 (setq pn (js2-parse-property-access tt pn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8915 ((= tt js2-DOTQUERY)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8916 (setq pn (js2-parse-dot-query pn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8917 ((= tt js2-LB)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8918 (setq pn (js2-parse-element-get pn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8919 ((= tt js2-LP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8920 (if allow-call-syntax
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8921 (setq pn (js2-parse-function-call pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8922 (setq continue nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8923 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8924 (setq continue nil))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8925 (if (>= js2-highlight-level 2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8926 (js2-parse-highlight-member-expr-node pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8927 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8928
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8929 (defun js2-parse-dot-query (pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8930 "Parse a dot-query expression, e.g. foo.bar.(@name == 2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8931 Last token parsed must be `js2-DOTQUERY'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8932 (let ((pos (js2-node-pos pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8933 op-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8934 expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8935 end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8936 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8937 (js2-must-have-xml)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8938 (js2-set-requires-activation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8939 (setq op-pos js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8940 expr (js2-parse-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8941 end (js2-node-end expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8942 pn (make-js2-xml-dot-query-node :left pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8943 :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8944 :op-pos op-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8945 :right expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8946 (js2-node-add-children pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8947 (js2-xml-dot-query-node-left pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8948 (js2-xml-dot-query-node-right pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8949 (if (js2-must-match js2-RP "msg.no.paren")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8950 (setf (js2-xml-dot-query-node-rp pn) js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8951 end js2-token-end))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8952 (setf (js2-node-len pn) (- end pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8953 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8954
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8955 (defun js2-parse-element-get (pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8956 "Parse an element-get expression, e.g. foo[bar].
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8957 Last token parsed must be `js2-RB'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8958 (let ((lb js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8959 (pos (js2-node-pos pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8960 rb
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8961 expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8962 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8963 (setq expr (js2-parse-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8964 (if (js2-must-match js2-RB "msg.no.bracket.index")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8965 (setq rb js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8966 (setq pn (make-js2-elem-get-node :target pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8967 :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8968 :element expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8969 :lb (js2-relpos lb pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8970 :rb (js2-relpos rb pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8971 :len (- js2-token-end pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8972 (js2-node-add-children pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8973 (js2-elem-get-node-target pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8974 (js2-elem-get-node-element pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8975 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8976
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8977 (defun js2-parse-function-call (pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8978 (let (args
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8979 (pos (js2-node-pos pn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8980 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8981 (setq pn (make-js2-call-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8982 :target pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8983 :lp (- js2-token-beg pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8984 (js2-node-add-children pn (js2-call-node-target pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8985 ;; Add the arguments to pn, if any are supplied.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8986 (setf args (nreverse (js2-parse-argument-list))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8987 (js2-call-node-rp pn) (- js2-token-beg pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8988 (js2-call-node-args pn) args)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8989 (apply #'js2-node-add-children pn args)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8990 (setf (js2-node-len pn) (- js2-ts-cursor pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8991 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8992
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8993 (defun js2-parse-property-access (tt pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8994 "Parse a property access, XML descendants access, or XML attr access."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8995 (let ((member-type-flags 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8996 (dot-pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8997 (dot-len (if (= tt js2-DOTDOT) 2 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8998 name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
8999 ref ; right side of . or .. operator
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9000 result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9001 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9002 (when (= tt js2-DOTDOT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9003 (js2-must-have-xml)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9004 (setq member-type-flags js2-descendants-flag))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9005 (if (not js2-compiler-xml-available)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9006 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9007 (js2-must-match-prop-name "msg.no.name.after.dot")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9008 (setq name (js2-create-name-node t js2-GETPROP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9009 result (make-js2-prop-get-node :left pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9010 :pos js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9011 :right name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9012 :len (- js2-token-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9013 js2-token-beg)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9014 (js2-node-add-children result pn name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9015 result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9016 ;; otherwise look for XML operators
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9017 (setf result (if (= tt js2-DOT)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9018 (make-js2-prop-get-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9019 (make-js2-infix-node :type js2-DOTDOT))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9020 (js2-node-pos result) (js2-node-pos pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9021 (js2-infix-node-op-pos result) dot-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9022 (js2-infix-node-left result) pn ; do this after setting position
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9023 tt (js2-next-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9024 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9025 ;; needed for generator.throw()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9026 ((= tt js2-THROW)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9027 (js2-save-name-token-data js2-token-beg "throw")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9028 (setq ref (js2-parse-property-name nil js2-ts-string member-type-flags)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9029 ;; handles: name, ns::name, ns::*, ns::[expr]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9030 ((js2-valid-prop-name-token tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9031 (setq ref (js2-parse-property-name -1 js2-ts-string member-type-flags)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9032 ;; handles: *, *::name, *::*, *::[expr]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9033 ((= tt js2-MUL)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9034 (js2-save-name-token-data js2-token-beg "*")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9035 (setq ref (js2-parse-property-name nil "*" member-type-flags)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9036 ;; handles: '@attr', '@ns::attr', '@ns::*', '@ns::[expr]', etc.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9037 ((= tt js2-XMLATTR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9038 (setq result (js2-parse-attribute-access)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9039 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9040 (js2-report-error "msg.no.name.after.dot" nil dot-pos dot-len)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9041 (if ref
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9042 (setf (js2-node-len result) (- (js2-node-end ref)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9043 (js2-node-pos result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9044 (js2-infix-node-right result) ref))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9045 (if (js2-infix-node-p result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9046 (js2-node-add-children result
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9047 (js2-infix-node-left result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9048 (js2-infix-node-right result)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9049 result)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9050
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9051 (defun js2-parse-attribute-access ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9052 "Parse an E4X XML attribute expression.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9053 This includes expressions of the forms:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9054
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9055 @attr @ns::attr @ns::*
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9056 @* @*::attr @*::*
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9057 @[expr] @*::[expr] @ns::[expr]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9058
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9059 Called if we peeked an '@' token."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9060 (let ((tt (js2-next-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9061 (at-pos js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9062 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9063 ;; handles: @name, @ns::name, @ns::*, @ns::[expr]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9064 ((js2-valid-prop-name-token tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9065 (js2-parse-property-name at-pos js2-ts-string 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9066 ;; handles: @*, @*::name, @*::*, @*::[expr]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9067 ((= tt js2-MUL)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9068 (js2-save-name-token-data js2-token-beg "*")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9069 (js2-parse-property-name js2-token-beg "*" 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9070 ;; handles @[expr]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9071 ((= tt js2-LB)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9072 (js2-parse-xml-elem-ref at-pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9073 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9074 (js2-report-error "msg.no.name.after.xmlAttr")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9075 ;; Avoid cascaded errors that happen if we make an error node here.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9076 (js2-save-name-token-data js2-token-beg "")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9077 (js2-parse-property-name js2-token-beg "" 0)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9078
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9079 (defun js2-parse-property-name (at-pos s member-type-flags)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9080 "Check if :: follows name in which case it becomes qualified name.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9081
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9082 AT-POS is a natural number if we just read an '@' token, else nil.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9083 S is the name or string that was matched: an identifier, 'throw' or '*'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9084 MEMBER-TYPE-FLAGS is a bit set tracking whether we're a '.' or '..' child.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9085
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9086 Returns a `js2-xml-ref-node' if it's an attribute access, a child of a '..'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9087 operator, or the name is followed by ::. For a plain name, returns a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9088 `js2-name-node'. Returns a `js2-error-node' for malformed XML expressions."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9089 (let ((pos (or at-pos js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9090 colon-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9091 (name (js2-create-name-node t js2-current-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9092 ns
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9093 tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9094 ref
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9095 pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9096 (catch 'return
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9097 (when (js2-match-token js2-COLONCOLON)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9098 (setq ns name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9099 colon-pos js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9100 tt (js2-next-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9101 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9102 ;; handles name::name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9103 ((js2-valid-prop-name-token tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9104 (setq name (js2-create-name-node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9105 ;; handles name::*
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9106 ((= tt js2-MUL)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9107 (js2-save-name-token-data js2-token-beg "*")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9108 (setq name (js2-create-name-node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9109 ;; handles name::[expr]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9110 ((= tt js2-LB)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9111 (throw 'return (js2-parse-xml-elem-ref at-pos ns colon-pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9112 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9113 (js2-report-error "msg.no.name.after.coloncolon"))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9114 (if (and (null ns) (zerop member-type-flags))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9115 name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9116 (prog1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9117 (setq pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9118 (make-js2-xml-prop-ref-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9119 :len (- (js2-node-end name) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9120 :at-pos at-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9121 :colon-pos colon-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9122 :propname name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9123 (js2-node-add-children pn name))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9124
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9125 (defun js2-parse-xml-elem-ref (at-pos &optional namespace colon-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9126 "Parse the [expr] portion of an xml element reference.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9127 For instance, @[expr], @*::[expr], or ns::[expr]."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9128 (let* ((lb js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9129 (pos (or at-pos lb))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9130 rb
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9131 (expr (js2-parse-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9132 (end (js2-node-end expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9133 pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9134 (if (js2-must-match js2-RB "msg.no.bracket.index")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9135 (setq rb js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9136 end js2-token-end))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9137 (prog1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9138 (setq pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9139 (make-js2-xml-elem-ref-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9140 :len (- end pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9141 :namespace namespace
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9142 :colon-pos colon-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9143 :at-pos at-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9144 :expr expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9145 :lb (js2-relpos lb pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9146 :rb (js2-relpos rb pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9147 (js2-node-add-children pn namespace expr))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9148
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9149 (defun js2-parse-primary-expr ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9150 "Parses a literal (leaf) expression of some sort.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9151 Includes complex literals such as functions, object-literals,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9152 array-literals, array comprehensions and regular expressions."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9153 (let ((tt-flagged (js2-next-flagged-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9154 pn ; parent node (usually return value)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9155 tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9156 px-pos ; paren-expr pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9157 len
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9158 flags ; regexp flags
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9159 expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9160 (setq tt js2-current-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9161 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9162 ((= tt js2-FUNCTION)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9163 (js2-parse-function 'FUNCTION_EXPRESSION))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9164 ((= tt js2-LB)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9165 (js2-parse-array-literal))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9166 ((= tt js2-LC)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9167 (js2-parse-object-literal))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9168 ((= tt js2-LET)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9169 (js2-parse-let js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9170 ((= tt js2-LP)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9171 (setq px-pos js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9172 expr (js2-parse-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9173 (js2-must-match js2-RP "msg.no.paren")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9174 (setq pn (make-js2-paren-node :pos px-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9175 :expr expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9176 :len (- js2-token-end px-pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9177 (js2-node-add-children pn (js2-paren-node-expr pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9178 pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9179 ((= tt js2-XMLATTR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9180 (js2-must-have-xml)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9181 (js2-parse-attribute-access))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9182 ((= tt js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9183 (js2-parse-name tt-flagged tt))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9184 ((= tt js2-NUMBER)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9185 (make-js2-number-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9186 ((= tt js2-STRING)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9187 (prog1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9188 (make-js2-string-node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9189 (js2-record-face 'font-lock-string-face)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9190 ((or (= tt js2-DIV) (= tt js2-ASSIGN_DIV))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9191 ;; Got / or /= which in this context means a regexp literal
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9192 (setq px-pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9193 (js2-read-regexp tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9194 (setq flags js2-ts-regexp-flags
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9195 js2-ts-regexp-flags nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9196 (prog1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9197 (make-js2-regexp-node :pos px-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9198 :len (- js2-ts-cursor px-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9199 :value js2-ts-string
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9200 :flags flags)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9201 (js2-set-face px-pos js2-ts-cursor 'font-lock-string-face 'record)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9202 (put-text-property px-pos js2-ts-cursor 'syntax-table '(2))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9203 ((or (= tt js2-NULL)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9204 (= tt js2-THIS)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9205 (= tt js2-FALSE)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9206 (= tt js2-TRUE))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9207 (make-js2-keyword-node :type tt))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9208 ((= tt js2-RESERVED)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9209 (js2-report-error "msg.reserved.id")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9210 (make-js2-name-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9211 ((= tt js2-ERROR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9212 ;; the scanner or one of its subroutines reported the error.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9213 (make-js2-error-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9214 ((= tt js2-EOF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9215 (setq px-pos (point-at-bol)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9216 len (- js2-ts-cursor px-pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9217 (js2-report-error "msg.unexpected.eof" nil px-pos len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9218 (make-js2-error-node :pos px-pos :len len))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9219 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9220 (js2-report-error "msg.syntax")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9221 (make-js2-error-node)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9222
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9223 (defun js2-parse-name (tt-flagged tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9224 (let ((name js2-ts-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9225 (name-pos js2-token-beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9226 (if (and (js2-flag-set-p tt-flagged js2-ti-check-label)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9227 (= (js2-peek-token) js2-COLON))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9228 (prog1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9229 ;; Do not consume colon, it is used as unwind indicator
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9230 ;; to return to statementHelper.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9231 (make-js2-label-node :pos name-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9232 :len (- js2-token-end name-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9233 :name name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9234 (js2-set-face name-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9235 js2-token-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9236 'font-lock-variable-name-face 'record))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9237 ;; Otherwise not a label, just a name. Unfortunately peeking
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9238 ;; the next token to check for a colon has biffed js2-token-beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9239 ;; and js2-token-end. We store the name's bounds in buffer vars
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9240 ;; and `js2-create-name-node' uses them.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9241 (js2-save-name-token-data name-pos name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9242 (if js2-compiler-xml-available
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9243 (js2-parse-property-name nil name 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9244 (js2-create-name-node 'check-activation)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9245
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9246 (defsubst js2-parse-warn-trailing-comma (msg pos elems comma-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9247 (js2-add-strict-warning
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9248 msg nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9249 ;; back up from comma to beginning of line or array/objlit
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9250 (max (if elems
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9251 (js2-node-pos (car elems))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9252 pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9253 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9254 (goto-char comma-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9255 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9256 (point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9257 comma-pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9258
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9259 (defun js2-parse-array-literal ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9260 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9261 (end js2-token-end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9262 (after-lb-or-comma t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9263 after-comma
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9264 tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9265 elems
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9266 pn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9267 (continue t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9268 (while continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9269 (setq tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9270 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9271 ;; comma
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9272 ((= tt js2-COMMA)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9273 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9274 (setq after-comma js2-token-end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9275 (if (not after-lb-or-comma)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9276 (setq after-lb-or-comma t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9277 (push nil elems)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9278 ;; end of array
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9279 ((or (= tt js2-RB)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9280 (= tt js2-EOF)) ; prevent infinite loop
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9281 (if (= tt js2-EOF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9282 (js2-report-error "msg.no.bracket.arg" nil pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9283 (js2-consume-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9284 (setq continue nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9285 end js2-token-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9286 pn (make-js2-array-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9287 :len (- js2-ts-cursor pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9288 :elems (nreverse elems)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9289 (apply #'js2-node-add-children pn (js2-array-node-elems pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9290 (when after-comma
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9291 (js2-parse-warn-trailing-comma "msg.array.trailing.comma"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9292 pos elems after-comma)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9293 ;; array comp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9294 ((and (>= js2-language-version 170)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9295 (= tt js2-FOR) ; check for array comprehension
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9296 (not after-lb-or-comma) ; "for" can't follow a comma
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9297 elems ; must have at least 1 element
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9298 (not (cdr elems))) ; but no 2nd element
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9299 (setf continue nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9300 pn (js2-parse-array-comprehension (car elems) pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9301 ;; another element
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9302 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9303 (unless after-lb-or-comma
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9304 (js2-report-error "msg.no.bracket.arg"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9305 (push (js2-parse-assign-expr) elems)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9306 (setq after-lb-or-comma nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9307 after-comma nil))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9308 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9309
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9310 (defun js2-parse-array-comprehension (expr pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9311 "Parse a JavaScript 1.7 Array Comprehension.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9312 EXPR is the first expression after the opening left-bracket.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9313 POS is the beginning of the LB token preceding EXPR.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9314 We should have just parsed the 'for' keyword before calling this function."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9315 (let (loops
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9316 filter
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9317 if-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9318 result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9319 (while (= (js2-peek-token) js2-FOR)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9320 (push (js2-parse-array-comp-loop) loops))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9321 (when (= (js2-peek-token) js2-IF)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9322 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9323 (setq if-pos (- js2-token-beg pos) ; relative
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9324 filter (js2-parse-condition)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9325 (js2-must-match js2-RB "msg.no.bracket.arg" pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9326 (setq result (make-js2-array-comp-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9327 :len (- js2-ts-cursor pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9328 :result expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9329 :loops (nreverse loops)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9330 :filter (car filter)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9331 :lp (js2-relpos (second filter) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9332 :rp (js2-relpos (third filter) pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9333 :if-pos if-pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9334 (apply #'js2-node-add-children result expr (car filter)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9335 (js2-array-comp-node-loops result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9336 result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9337
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9338 (defun js2-parse-array-comp-loop ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9339 "Parse a 'for [each] (foo in bar)' expression in an Array comprehension.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9340 Last token peeked should be the initial FOR."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9341 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9342 (pn (make-js2-array-comp-loop-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9343 tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9344 iter
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9345 obj
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9346 foreach-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9347 in-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9348 each-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9349 lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9350 rp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9351 (assert (= (js2-next-token) js2-FOR)) ; consumes token
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9352 (js2-push-scope pn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9353 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9354 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9355 (when (js2-match-token js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9356 (if (string= js2-ts-string "each")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9357 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9358 (setq foreach-p t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9359 each-pos (- js2-token-beg pos)) ; relative
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9360 (js2-record-face 'font-lock-keyword-face))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9361 (js2-report-error "msg.no.paren.for")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9362 (if (js2-must-match js2-LP "msg.no.paren.for")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9363 (setq lp (- js2-token-beg pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9364 (setq tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9365 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9366 ((or (= tt js2-LB)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9367 (= tt js2-LC))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9368 ;; handle destructuring assignment
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9369 (setq iter (js2-parse-primary-expr)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9370 ((js2-valid-prop-name-token tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9371 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9372 (setq iter (js2-create-name-node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9373 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9374 (js2-report-error "msg.bad.var")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9375 ;; Define as a let since we want the scope of the variable to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9376 ;; be restricted to the array comprehension
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9377 (if (js2-name-node-p iter)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9378 (js2-define-symbol js2-LET (js2-name-node-name iter) pn t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9379 (if (js2-must-match js2-IN "msg.in.after.for.name")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9380 (setq in-pos (- js2-token-beg pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9381 (setq obj (js2-parse-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9382 (if (js2-must-match js2-RP "msg.no.paren.for.ctrl")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9383 (setq rp (- js2-token-beg pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9384 (setf (js2-node-pos pn) pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9385 (js2-node-len pn) (- js2-ts-cursor pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9386 (js2-array-comp-loop-node-iterator pn) iter
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9387 (js2-array-comp-loop-node-object pn) obj
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9388 (js2-array-comp-loop-node-in-pos pn) in-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9389 (js2-array-comp-loop-node-each-pos pn) each-pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9390 (js2-array-comp-loop-node-foreach-p pn) foreach-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9391 (js2-array-comp-loop-node-lp pn) lp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9392 (js2-array-comp-loop-node-rp pn) rp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9393 (js2-node-add-children pn iter obj))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9394 (js2-pop-scope))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9395 pn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9396
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9397 (defun js2-parse-object-literal ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9398 (let ((pos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9399 tt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9400 elems
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9401 result
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9402 after-comma
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9403 (continue t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9404 (while continue
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9405 (setq tt (js2-peek-token))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9406 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9407 ;; {foo: ...}, {'foo': ...}, {get foo() {...}}, or {set foo(x) {...}}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9408 ((or (js2-valid-prop-name-token tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9409 (= tt js2-STRING))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9410 (setq after-comma nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9411 result (js2-parse-named-prop tt))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9412 (if (and (null result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9413 (not js2-recover-from-parse-errors))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9414 (setq continue nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9415 (push result elems)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9416 ;; {12: x} or {10.7: x}
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9417 ((= tt js2-NUMBER)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9418 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9419 (setq after-comma nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9420 (push (js2-parse-plain-property (make-js2-number-node)) elems))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9421 ;; trailing comma
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9422 ((= tt js2-RC)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9423 (setq continue nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9424 (if after-comma
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9425 (js2-parse-warn-trailing-comma "msg.extra.trailing.comma"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9426 pos elems after-comma)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9427 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9428 (js2-report-error "msg.bad.prop")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9429 (unless js2-recover-from-parse-errors
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9430 (setq continue nil)))) ; end switch
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9431 (if (js2-match-token js2-COMMA)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9432 (setq after-comma js2-token-end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9433 (setq continue nil))) ; end loop
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9434 (js2-must-match js2-RC "msg.no.brace.prop")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9435 (setq result (make-js2-object-node :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9436 :len (- js2-ts-cursor pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9437 :elems (nreverse elems)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9438 (apply #'js2-node-add-children result (js2-object-node-elems result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9439 result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9440
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9441 (defun js2-parse-named-prop (tt)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9442 "Parse a name, string, or getter/setter object property."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9443 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9444 (let ((string-prop (and (= tt js2-STRING)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9445 (make-js2-string-node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9446 expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9447 (ppos js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9448 (pend js2-token-end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9449 (name (js2-create-name-node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9450 (prop js2-ts-string))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9451 (if (and (= tt js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9452 (= (js2-peek-token) js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9453 (or (string= prop "get")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9454 (string= prop "set")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9455 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9456 ;; getter/setter prop
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9457 (js2-consume-token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9458 (js2-set-face ppos pend 'font-lock-keyword-face 'record) ; get/set
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9459 (js2-record-face 'font-lock-function-name-face) ; for peeked name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9460 (setq name (js2-create-name-node)) ; discard get/set & use peeked name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9461 (js2-parse-getter-setter-prop ppos name (string= prop "get")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9462 ;; regular prop
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9463 (prog1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9464 (setq expr (js2-parse-plain-property (or string-prop name)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9465 (js2-set-face ppos pend
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9466 (if (js2-function-node-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9467 (js2-object-prop-node-right expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9468 'font-lock-function-name-face
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9469 'font-lock-variable-name-face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9470 'record)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9471
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9472 (defun js2-parse-plain-property (prop)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9473 "Parse a non-getter/setter property in an object literal.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9474 PROP is the node representing the property: a number, name or string."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9475 (js2-must-match js2-COLON "msg.no.colon.prop")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9476 (let* ((pos (js2-node-pos prop))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9477 (colon (- js2-token-beg pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9478 (expr (js2-parse-assign-expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9479 (result (make-js2-object-prop-node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9480 :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9481 ;; don't include last consumed token in length
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9482 :len (- (+ (js2-node-pos expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9483 (js2-node-len expr))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9484 pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9485 :left prop
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9486 :right expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9487 :op-pos colon)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9488 (js2-node-add-children result prop expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9489 result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9490
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9491 (defun js2-parse-getter-setter-prop (pos prop get-p)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9492 "Parse getter or setter property in an object literal.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9493 JavaScript syntax is:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9494
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9495 { get foo() {...}, set foo(x) {...} }
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9496
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9497 POS is the start position of the `get' or `set' keyword.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9498 PROP is the `js2-name-node' representing the property name.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9499 GET-P is non-nil if the keyword was `get'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9500 (let ((type (if get-p js2-GET js2-SET))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9501 result
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9502 end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9503 (fn (js2-parse-function 'FUNCTION_EXPRESSION)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9504 ;; it has to be an anonymous function, as we already parsed the name
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9505 (if (/= (js2-node-type fn) js2-FUNCTION)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9506 (js2-report-error "msg.bad.prop")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9507 (if (plusp (length (js2-function-name fn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9508 (js2-report-error "msg.bad.prop")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9509 (js2-node-set-prop fn 'GETTER_SETTER type) ; for codegen
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9510 (setq end (js2-node-end fn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9511 result (make-js2-getter-setter-node :type type
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9512 :pos pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9513 :len (- end pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9514 :left prop
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9515 :right fn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9516 (js2-node-add-children result prop fn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9517 result))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9518
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9519 (defun js2-create-name-node (&optional check-activation-p token)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9520 "Create a name node using the token info from last scanned name.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9521 In some cases we need to either synthesize a name node, or we lost
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9522 the name token information by peeking. If the TOKEN parameter is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9523 not `js2-NAME', then we use the token info saved in instance vars."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9524 (let ((beg js2-token-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9525 (s js2-ts-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9526 name)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9527 (when (/= js2-current-token js2-NAME)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9528 (setq beg (or js2-prev-name-token-start js2-ts-cursor)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9529 s js2-prev-name-token-string
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9530 js2-prev-name-token-start nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9531 js2-prev-name-token-string nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9532 (setq name (make-js2-name-node :pos beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9533 :name s
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9534 :len (length s)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9535 (if check-activation-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9536 (js2-check-activation-name s (or token js2-NAME)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9537 name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9538
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9539 ;;; Indentation support
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9540
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9541 ;; This indenter is based on Karl Landström's "javascript.el" indenter.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9542 ;; Karl cleverly deduces that the desired indentation level is often a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9543 ;; function of paren/bracket/brace nesting depth, which can be determined
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9544 ;; quickly via the built-in `parse-partial-sexp' function. His indenter
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9545 ;; then does some equally clever checks to see if we're in the context of a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9546 ;; substatement of a possibly braceless statement keyword such as if, while,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9547 ;; or finally. This approach yields pretty good results.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9548
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9549 ;; The indenter is often "wrong", however, and needs to be overridden.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9550 ;; The right long-term solution is probably to emulate (or integrate
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9551 ;; with) cc-engine, but it's a nontrivial amount of coding. Even when a
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9552 ;; parse tree from `js2-parse' is present, which is not true at the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9553 ;; moment the user is typing, computing indentation is still thousands
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9554 ;; of lines of code to handle every possible syntactic edge case.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9555
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9556 ;; In the meantime, the compromise solution is that we offer a "bounce
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9557 ;; indenter", configured with `js2-bounce-indent-p', which cycles the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9558 ;; current line indent among various likely guess points. This approach
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9559 ;; is far from perfect, but should at least make it slightly easier to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9560 ;; move the line towards its desired indentation when manually
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9561 ;; overriding Karl's heuristic nesting guesser.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9562
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9563 ;; I've made miscellaneous tweaks to Karl's code to handle some Ecma
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9564 ;; extensions such as `let' and Array comprehensions. Major kudos to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9565 ;; Karl for coming up with the initial approach, which packs a lot of
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9566 ;; punch for so little code.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9567
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9568 (defconst js-possibly-braceless-keyword-re
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9569 (regexp-opt
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9570 '("catch" "do" "else" "finally" "for" "if" "try" "while" "with" "let")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9571 'words)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9572 "Regular expression matching keywords that are optionally
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9573 followed by an opening brace.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9574
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9575 (defconst js-indent-operator-re
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9576 (concat "[-+*/%<>=&^|?:.]\\([^-+*/]\\|$\\)\\|"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9577 (regexp-opt '("in" "instanceof") 'words))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9578 "Regular expression matching operators that affect indentation
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9579 of continued expressions.")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9580
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9581 ;; This function has horrible results if you're typing an array
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9582 ;; such as [[1, 2], [3, 4], [5, 6]]. Bounce indenting -really- sucks
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9583 ;; in conjunction with electric-indent, so just disabling it.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9584 (defsubst js2-code-at-bol-p ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9585 "Return t if the first character on line is non-whitespace."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9586 nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9587
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9588 (defun js2-insert-and-indent (key)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9589 "Run command bound to key and indent current line. Runs the command
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9590 bound to KEY in the global keymap and indents the current line."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9591 (interactive (list (this-command-keys)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9592 (let ((cmd (lookup-key (current-global-map) key)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9593 (if (commandp cmd)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9594 (call-interactively cmd)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9595 ;; don't do the electric keys inside comments or strings,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9596 ;; and don't do bounce-indent with them.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9597 (let ((parse-state (parse-partial-sexp (point-min) (point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9598 (js2-bounce-indent-p (js2-code-at-bol-p)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9599 (unless (or (nth 3 parse-state)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9600 (nth 4 parse-state))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9601 (indent-according-to-mode))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9602
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9603 (defun js-re-search-forward-inner (regexp &optional bound count)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9604 "Auxiliary function for `js-re-search-forward'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9605 (let ((parse)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9606 (saved-point (point-min)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9607 (while (> count 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9608 (re-search-forward regexp bound)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9609 (setq parse (parse-partial-sexp saved-point (point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9610 (cond ((nth 3 parse)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9611 (re-search-forward
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9612 (concat "\\([^\\]\\|^\\)" (string (nth 3 parse)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9613 (save-excursion (end-of-line) (point)) t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9614 ((nth 7 parse)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9615 (forward-line))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9616 ((or (nth 4 parse)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9617 (and (eq (char-before) ?\/) (eq (char-after) ?\*)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9618 (re-search-forward "\\*/"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9619 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9620 (setq count (1- count))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9621 (setq saved-point (point))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9622 (point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9623
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9624 (defun js-re-search-forward (regexp &optional bound noerror count)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9625 "Search forward but ignore strings and comments. Invokes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9626 `re-search-forward' but treats the buffer as if strings and
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9627 comments have been removed."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9628 (let ((saved-point (point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9629 (search-expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9630 (cond ((null count)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9631 '(js-re-search-forward-inner regexp bound 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9632 ((< count 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9633 '(js-re-search-backward-inner regexp bound (- count)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9634 ((> count 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9635 '(js-re-search-forward-inner regexp bound count)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9636 (condition-case err
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9637 (eval search-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9638 (search-failed
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9639 (goto-char saved-point)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9640 (unless noerror
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9641 (error (error-message-string err)))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9642
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9643 (defun js-re-search-backward-inner (regexp &optional bound count)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9644 "Auxiliary function for `js-re-search-backward'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9645 (let ((parse)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9646 (saved-point (point-min)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9647 (while (> count 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9648 (re-search-backward regexp bound)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9649 (setq parse (parse-partial-sexp saved-point (point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9650 (cond ((nth 3 parse)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9651 (re-search-backward
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9652 (concat "\\([^\\]\\|^\\)" (string (nth 3 parse)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9653 (save-excursion (beginning-of-line) (point)) t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9654 ((nth 7 parse)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9655 (goto-char (nth 8 parse)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9656 ((or (nth 4 parse)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9657 (and (eq (char-before) ?/) (eq (char-after) ?*)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9658 (re-search-backward "/\\*"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9659 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9660 (setq count (1- count))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9661 (point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9662
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9663 (defun js-re-search-backward (regexp &optional bound noerror count)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9664 "Search backward but ignore strings and comments. Invokes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9665 `re-search-backward' but treats the buffer as if strings and
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9666 comments have been removed."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9667 (let ((saved-point (point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9668 (search-expr
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9669 (cond ((null count)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9670 '(js-re-search-backward-inner regexp bound 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9671 ((< count 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9672 '(js-re-search-forward-inner regexp bound (- count)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9673 ((> count 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9674 '(js-re-search-backward-inner regexp bound count)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9675 (condition-case err
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9676 (eval search-expr)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9677 (search-failed
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9678 (goto-char saved-point)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9679 (unless noerror
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9680 (error (error-message-string err)))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9681
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9682 (defun js-looking-at-operator-p ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9683 "Return non-nil if text after point is an operator (that is not
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9684 a comma)."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9685 (save-match-data
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9686 (and (looking-at js-indent-operator-re)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9687 (or (not (looking-at ":"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9688 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9689 (and (js-re-search-backward "[?:{]\\|\\<case\\>" nil t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9690 (looking-at "?")))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9691
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9692 (defun js-continued-expression-p ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9693 "Returns non-nil if the current line continues an expression."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9694 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9695 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9696 (or (js-looking-at-operator-p)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9697 (and (js-re-search-backward "\n" nil t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9698 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9699 (skip-chars-backward " \t")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9700 (backward-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9701 (and (js-looking-at-operator-p)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9702 (and (progn (backward-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9703 (not (looking-at "\\*\\|++\\|--\\|/[/*]"))))))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9704
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9705 (defun js-end-of-do-while-loop-p ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9706 "Returns non-nil if word after point is `while' of a do-while
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9707 statement, else returns nil. A braceless do-while statement
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9708 spanning several lines requires that the start of the loop is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9709 indented to the same column as the current line."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9710 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9711 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9712 (save-match-data
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9713 (when (looking-at "\\s-*\\<while\\>")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9714 (if (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9715 (skip-chars-backward "[ \t\n]*}")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9716 (looking-at "[ \t\n]*}"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9717 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9718 (backward-list) (backward-word 1) (looking-at "\\<do\\>"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9719 (js-re-search-backward "\\<do\\>" (point-at-bol) t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9720 (or (looking-at "\\<do\\>")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9721 (let ((saved-indent (current-indentation)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9722 (while (and (js-re-search-backward "^[ \t]*\\<" nil t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9723 (/= (current-indentation) saved-indent)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9724 (and (looking-at "[ \t]*\\<do\\>")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9725 (not (js-re-search-forward
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9726 "\\<while\\>" (point-at-eol) t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9727 (= (current-indentation) saved-indent)))))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9728
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9729 (defun js-ctrl-statement-indentation ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9730 "Returns the proper indentation of the current line if it
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9731 starts the body of a control statement without braces, else
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9732 returns nil."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9733 (let (forward-sexp-function) ; temporarily unbind it
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9734 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9735 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9736 (when (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9737 (and (not (js2-same-line (point-min)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9738 (not (looking-at "{"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9739 (js-re-search-backward "[[:graph:]]" nil t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9740 (not (looking-at "[{([]"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9741 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9742 (forward-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9743 ;; scan-sexps sometimes throws an error
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9744 (ignore-errors (backward-sexp))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9745 (when (looking-at "(") (backward-word 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9746 (and (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9747 (skip-chars-backward " \t}" (point-at-bol))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9748 (bolp))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9749 (looking-at js-possibly-braceless-keyword-re)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9750 (not (js-end-of-do-while-loop-p))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9751 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9752 (goto-char (match-beginning 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9753 (+ (current-indentation) js2-basic-offset))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9754
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9755 (defun js2-indent-in-array-comp (parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9756 "Return non-nil if we think we're in an array comprehension.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9757 In particular, return the buffer position of the first `for' kwd."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9758 (let ((end (point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9759 (when (nth 1 parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9760 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9761 (goto-char (nth 1 parse-status))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9762 (when (looking-at "\\[")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9763 (forward-char 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9764 (js2-forward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9765 (if (looking-at "[[{]")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9766 (let (forward-sexp-function) ; use lisp version
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9767 (forward-sexp) ; skip destructuring form
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9768 (js2-forward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9769 (if (and (/= (char-after) ?,) ; regular array
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9770 (looking-at "for"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9771 (match-beginning 0)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9772 ;; to skip arbitrary expressions we need the parser,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9773 ;; so we'll just guess at it.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9774 (if (re-search-forward "[^,]* \\(for\\) " end t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9775 (match-beginning 1))))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9776
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9777 (defun js2-array-comp-indentation (parse-status for-kwd)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9778 (if (js2-same-line for-kwd)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9779 ;; first continuation line
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9780 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9781 (goto-char (nth 1 parse-status))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9782 (forward-char 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9783 (skip-chars-forward " \t")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9784 (current-column))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9785 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9786 (goto-char for-kwd)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9787 (current-column))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9788
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9789 (defun js-proper-indentation (parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9790 "Return the proper indentation for the current line."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9791 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9792 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9793 (let ((ctrl-stmt-indent (js-ctrl-statement-indentation))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9794 (same-indent-p (looking-at "[]})]\\|\\<case\\>\\|\\<default\\>"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9795 (continued-expr-p (js-continued-expression-p))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9796 (bracket (nth 1 parse-status))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9797 beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9798 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9799 ;; indent array comprehension continuation lines specially
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9800 ((and bracket
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9801 (not (js2-same-line bracket))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9802 (setq beg (js2-indent-in-array-comp parse-status))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9803 (>= (point) (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9804 (goto-char beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9805 (point-at-bol)))) ; at or after first loop?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9806 (js2-array-comp-indentation parse-status beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9807
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9808 (ctrl-stmt-indent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9809
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9810 (bracket
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9811 (goto-char bracket)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9812 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9813 ((looking-at "[({[][ \t]*\\(/[/*]\\|$\\)")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9814 (let ((p (parse-partial-sexp (point-at-bol) (point))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9815 (when (save-excursion (skip-chars-backward " \t)")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9816 (looking-at ")"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9817 (backward-list))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9818 (if (nth 1 p)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9819 (progn (goto-char (1+ (nth 1 p)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9820 (skip-chars-forward " \t"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9821 (back-to-indentation))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9822 (cond (same-indent-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9823 (current-column))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9824 (continued-expr-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9825 (+ (current-column) (* 2 js2-basic-offset)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9826 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9827 (+ (current-column) js2-basic-offset)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9828 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9829 (unless same-indent-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9830 (forward-char)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9831 (skip-chars-forward " \t"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9832 (current-column))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9833
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9834 (continued-expr-p js2-basic-offset)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9835 (t 0)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9836
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9837 (defun js2-lineup-comment (parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9838 "Indent a multi-line block comment continuation line."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9839 (let* ((beg (nth 8 parse-status))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9840 (first-line (js2-same-line beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9841 (offset (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9842 (goto-char beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9843 (if (looking-at "/\\*")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9844 (+ 1 (current-column))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9845 0))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9846 (unless first-line
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9847 (indent-line-to offset))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9848
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9849 (defun js2-backward-sws ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9850 "Move backward through whitespace and comments."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9851 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9852 (while (forward-comment -1)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9853
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9854 (defun js2-forward-sws ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9855 "Move forward through whitespace and comments."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9856 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9857 (while (forward-comment 1)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9858
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9859 (defsubst js2-current-indent (&optional pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9860 "Return column of indentation on current line.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9861 If POS is non-nil, go to that point and return indentation for that line."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9862 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9863 (if pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9864 (goto-char pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9865 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9866 (current-column)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9867
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9868 (defsubst js2-arglist-close ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9869 "Return non-nil if we're on a line beginning with a close-paren/brace."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9870 (save-match-data
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9871 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9872 (goto-char (point-at-bol))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9873 (js2-forward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9874 (looking-at "[])}]"))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9875
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9876 (defsubst js2-indent-looks-like-label-p ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9877 (goto-char (point-at-bol))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9878 (js2-forward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9879 (looking-at (concat js2-mode-identifier-re ":")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9880
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9881 (defun js2-indent-in-objlit-p (parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9882 "Return non-nil if this looks like an object-literal entry."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9883 (let ((start (nth 1 parse-status)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9884 (and
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9885 start
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9886 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9887 (and (zerop (forward-line -1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9888 (not (< (point) start)) ; crossed a {} boundary
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9889 (js2-indent-looks-like-label-p)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9890 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9891 (js2-indent-looks-like-label-p)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9892
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9893 ;; if prev line looks like foobar({ then we're passing an object
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9894 ;; literal to a function call, and people pretty much always want to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9895 ;; de-dent back to the previous line, so move the 'basic-offset'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9896 ;; position to the front.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9897 (defsubst js2-indent-objlit-arg-p (parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9898 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9899 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9900 (js2-backward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9901 (and (eq (1- (point)) (nth 1 parse-status))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9902 (eq (char-before) ?{)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9903 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9904 (forward-char -1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9905 (skip-chars-backward " \t")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9906 (eq (char-before) ?\()))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9907
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9908 (defsubst js2-indent-case-block-p ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9909 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9910 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9911 (js2-backward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9912 (goto-char (point-at-bol))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9913 (skip-chars-forward " \t")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9914 (save-match-data
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9915 (looking-at "case\\s-.+:"))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9916
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9917 (defsubst js2-syntax-bol ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9918 "Return the point at the first non-whitespace char on the line.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9919 Returns `point-at-bol' if the line is empty."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9920 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9921 (beginning-of-line)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9922 (skip-chars-forward " \t")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9923 (point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9924
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9925 (defun js2-bounce-indent (normal-col parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9926 "Cycle among alternate computed indentation positions.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9927 PARSE-STATUS is the result of `parse-partial-sexp' from the beginning
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9928 of the buffer to the current point. NORMAL-COL is the indentation
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9929 column computed by the heuristic guesser based on current paren,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9930 bracket, brace and statement nesting."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9931 (let ((cur-indent (js2-current-indent))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9932 (old-buffer-undo-list buffer-undo-list)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9933 ;; Emacs 21 only has `count-lines', not `line-number-at-pos'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9934 (current-line (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9935 (forward-line 0) ; move to bol
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9936 (1+ (count-lines (point-min) (point)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9937 positions
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9938 pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9939 anchor
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9940 arglist-cont
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9941 same-indent
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9942 prev-line-col
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9943 basic-offset
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9944 computed-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9945 ;; temporarily don't record undo info, if user requested this
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9946 (if js2-mode-indent-inhibit-undo
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9947 (setq buffer-undo-list t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9948 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9949 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9950 ;; first likely point: indent from beginning of previous code line
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9951 (push (setq basic-offset
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9952 (+ (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9953 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9954 (js2-backward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9955 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9956 (setq prev-line-col (current-column)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9957 js2-basic-offset))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9958 positions)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9959
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9960 ;; (first + epsilon) likely point: indent 2x from beginning of
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9961 ;; previous code line. Some companies like this approach. Ahem.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9962 ;; Seriously, though -- 4-space indent for expression continuation
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9963 ;; lines isn't a bad idea. We should eventually implement it
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9964 ;; that way.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9965 (push (setq basic-offset
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9966 (+ (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9967 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9968 (js2-backward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9969 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9970 (setq prev-line-col (current-column)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9971 (* 2 js2-basic-offset)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9972 positions)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9973
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9974 ;; second likely point: indent from assign-expr RHS. This
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9975 ;; is just a crude guess based on finding " = " on the previous
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9976 ;; line containing actual code.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9977 (setq pos (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9978 (save-match-data
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9979 (forward-line -1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9980 (goto-char (point-at-bol))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9981 (when (re-search-forward "\\s-+\\(=\\)\\s-+"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9982 (point-at-eol) t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9983 (goto-char (match-end 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9984 (skip-chars-forward " \t\r\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9985 (current-column)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9986 (when pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9987 (incf pos js2-basic-offset)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9988 (unless (member pos positions)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9989 (push pos positions)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9990
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9991 ;; third likely point: same indent as previous line of code.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9992 ;; Make it the first likely point if we're not on an
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9993 ;; arglist-close line and previous line ends in a comma, or
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9994 ;; both this line and prev line look like object-literal
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9995 ;; elements.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9996 (setq pos (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9997 (goto-char (point-at-bol))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9998 (js2-backward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
9999 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10000 (prog1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10001 (current-column)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10002 ;; while we're here, look for trailing comma
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10003 (if (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10004 (goto-char (point-at-eol))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10005 (js2-backward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10006 (eq (char-before) ?,))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10007 (setq arglist-cont (1- (point)))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10008 (when pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10009 (if (and (or arglist-cont
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10010 (js2-indent-in-objlit-p parse-status))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10011 (not (js2-arglist-close)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10012 (setq same-indent pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10013 (unless (member pos positions)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10014 (push pos positions)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10015
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10016 ;; fourth likely point: first preceding code with less indentation
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10017 ;; than the immediately preceding code line.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10018 (setq pos (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10019 (js2-backward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10020 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10021 (setq anchor (current-column))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10022 (while (and (zerop (forward-line -1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10023 (>= (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10024 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10025 (current-column))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10026 anchor)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10027 (setq pos (current-column))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10028 (unless (member pos positions)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10029 (push pos positions))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10030
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10031 ;; put nesting-heuristic position first in list, sort rest
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10032 (setq positions (nreverse (sort positions '<)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10033 (setq positions (cons normal-col (delete normal-col positions)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10034
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10035 ;; comma-list continuation lines: prev line indent takes precedence
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10036 (if same-indent
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10037 (setq positions
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10038 (cons same-indent
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10039 (sort (delete same-indent positions) '<))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10040
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10041 ;; common special cases where we want to indent in from previous line
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10042 (if (or (js2-indent-case-block-p)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10043 (js2-indent-objlit-arg-p parse-status))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10044 (setq positions
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10045 (cons basic-offset
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10046 (delete basic-offset positions))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10047
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10048 ;; record whether we're already sitting on one of the alternatives
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10049 (setq pos (member cur-indent positions))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10050 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10051 ;; case 0: we're one one of the alternatives and this is the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10052 ;; first time they've pressed TAB on this line (best-guess).
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10053 ((and js2-mode-indent-ignore-first-tab
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10054 pos
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10055 ;; first time pressing TAB on this line?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10056 (not (eq js2-mode-last-indented-line current-line)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10057 ;; do nothing
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10058 (setq computed-pos nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10059 ;; case 1: only one computed position => use it
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10060 ((null (cdr positions))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10061 (setq computed-pos 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10062 ;; case 2: not on any of the computed spots => use main spot
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10063 ((not pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10064 (setq computed-pos 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10065 ;; case 3: on last position: cycle to first position
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10066 ((null (cdr pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10067 (setq computed-pos 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10068 ;; case 4: on intermediate position: cycle to next position
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10069 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10070 (setq computed-pos (js2-position (second pos) positions))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10071
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10072 ;; see if any hooks want to indent; otherwise we do it
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10073 (loop with result = nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10074 for hook in js2-indent-hook
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10075 while (null result)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10076 do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10077 (setq result (funcall hook positions computed-pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10078 finally do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10079 (unless (or result (null computed-pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10080 (indent-line-to (nth computed-pos positions)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10081
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10082 ;; finally
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10083 (if js2-mode-indent-inhibit-undo
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10084 (setq buffer-undo-list old-buffer-undo-list))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10085 ;; see commentary for `js2-mode-last-indented-line'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10086 (setq js2-mode-last-indented-line current-line))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10087
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10088 (defsubst js2-1-line-comment-continuation-p ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10089 "Return t if we're in a 1-line comment continuation.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10090 If so, we don't ever want to use bounce-indent."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10091 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10092 (save-match-data
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10093 (and (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10094 (forward-line 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10095 (looking-at "\\s-*//"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10096 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10097 (forward-line -1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10098 (forward-line 0)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10099 (when (looking-at "\\s-*$")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10100 (js2-backward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10101 (forward-line 0))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10102 (looking-at "\\s-*//"))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10103
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10104 (defun js2-indent-line ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10105 "Indent the current line as JavaScript source text."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10106 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10107 (let (parse-status
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10108 current-indent
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10109 offset
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10110 indent-col
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10111 moved
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10112 ;; don't whine about errors/warnings when we're indenting.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10113 ;; This has to be set before calling parse-partial-sexp below.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10114 (inhibit-point-motion-hooks t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10115 (setq parse-status (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10116 (parse-partial-sexp (point-min)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10117 (point-at-bol)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10118 offset (- (point) (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10119 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10120 (setq current-indent (current-column))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10121 (point))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10122 (js2-with-underscore-as-word-syntax
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10123 (if (nth 4 parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10124 (js2-lineup-comment parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10125 (setq indent-col (js-proper-indentation parse-status))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10126 ;; see comments below about js2-mode-last-indented-line
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10127 (when
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10128 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10129 ;; bounce-indenting is disabled during electric-key indent.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10130 ;; It doesn't work well on first line of buffer.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10131 ((and js2-bounce-indent-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10132 (not (js2-same-line (point-min)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10133 (not (js2-1-line-comment-continuation-p)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10134 (js2-bounce-indent indent-col parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10135 (setq moved t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10136 ;; just indent to the guesser's likely spot
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10137 ((/= current-indent indent-col)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10138 (indent-line-to indent-col)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10139 (setq moved t)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10140 (when (and moved (plusp offset))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10141 (forward-char offset)))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10142
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10143 (defun js2-indent-region (start end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10144 "Indent the region, but don't use bounce indenting."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10145 (let ((js2-bounce-indent-p nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10146 (indent-region-function nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10147 (indent-region start end nil))) ; nil for byte-compiler
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10148
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10149 ;;;###autoload (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10150
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10151 ;;;###autoload
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10152 (defun js2-mode ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10153 "Major mode for editing JavaScript code."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10154 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10155 (kill-all-local-variables)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10156 (set-syntax-table js2-mode-syntax-table)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10157 (use-local-map js2-mode-map)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10158 (setq major-mode 'js2-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10159 mode-name "JavaScript-IDE"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10160 comment-start "//" ; used by comment-region; don't change it
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10161 comment-end "")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10162 (setq local-abbrev-table js2-mode-abbrev-table)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10163 (set (make-local-variable 'max-lisp-eval-depth)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10164 (max max-lisp-eval-depth 3000))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10165 (set (make-local-variable 'indent-line-function) #'js2-indent-line)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10166 (set (make-local-variable 'indent-region-function) #'js2-indent-region)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10167
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10168 ;; I tried an "improvement" to `c-fill-paragraph' that worked out badly
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10169 ;; on most platforms other than the one I originally wrote it on. So it's
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10170 ;; back to `c-fill-paragraph'. Still not perfect, though -- something to do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10171 ;; with our binding of the RET key inside comments: short lines stay short.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10172 (set (make-local-variable 'fill-paragraph-function) #'c-fill-paragraph)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10173
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10174 (set (make-local-variable 'before-save-hook) #'js2-before-save)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10175 (set (make-local-variable 'next-error-function) #'js2-next-error)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10176 (set (make-local-variable 'beginning-of-defun-function) #'js2-beginning-of-defun)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10177 (set (make-local-variable 'end-of-defun-function) #'js2-end-of-defun)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10178 ;; we un-confuse `parse-partial-sexp' by setting syntax-table properties
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10179 ;; for characters inside regexp literals.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10180 (set (make-local-variable 'parse-sexp-lookup-properties) t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10181 ;; this is necessary to make `show-paren-function' work properly
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10182 (set (make-local-variable 'parse-sexp-ignore-comments) t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10183 ;; needed for M-x rgrep, among other things
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10184 (put 'js2-mode 'find-tag-default-function #'js2-mode-find-tag)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10185
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10186 ;; some variables needed by cc-engine for paragraph-fill, etc.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10187 (setq c-buffer-is-cc-mode t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10188 c-comment-prefix-regexp js2-comment-prefix-regexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10189 c-comment-start-regexp "/[*/]\\|\\s|"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10190 c-paragraph-start js2-paragraph-start
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10191 c-paragraph-separate "$"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10192 comment-start-skip js2-comment-start-skip
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10193 c-syntactic-ws-start js2-syntactic-ws-start
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10194 c-syntactic-ws-end js2-syntactic-ws-end
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10195 c-syntactic-eol js2-syntactic-eol)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10196
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10197 (setq js2-default-externs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10198 (append js2-ecma-262-externs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10199 (if js2-include-browser-externs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10200 js2-browser-externs)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10201 (if js2-include-gears-externs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10202 js2-gears-externs)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10203 (if js2-include-rhino-externs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10204 js2-rhino-externs)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10205
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10206 ;; We do our own syntax highlighting based on the parse tree.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10207 ;; However, we want minor modes that add keywords to highlight properly
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10208 ;; (examples: doxymacs, column-marker). We do this by not letting
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10209 ;; font-lock unfontify anything, and telling it to fontify after we
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10210 ;; re-parse and re-highlight the buffer. (We currently don't do any
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10211 ;; work with regions other than the whole buffer.)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10212 (dolist (var '(font-lock-unfontify-buffer-function
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10213 font-lock-unfontify-region-function))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10214 (set (make-local-variable var) (lambda (&rest args) t)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10215
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10216 ;; Don't let font-lock do syntactic (string/comment) fontification.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10217 (set (make-local-variable #'font-lock-syntactic-face-function)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10218 (lambda (state) nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10219
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10220 ;; Experiment: make reparse-delay longer for longer files.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10221 (if (plusp js2-dynamic-idle-timer-adjust)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10222 (setq js2-idle-timer-delay
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10223 (* js2-idle-timer-delay
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10224 (/ (point-max) js2-dynamic-idle-timer-adjust))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10225
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10226 (add-hook 'change-major-mode-hook #'js2-mode-exit nil t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10227 (add-hook 'after-change-functions #'js2-mode-edit nil t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10228 (setq imenu-create-index-function #'js2-mode-create-imenu-index)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10229 (imenu-add-to-menubar (concat "IM-" mode-name))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10230 (when js2-mirror-mode
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10231 (js2-enter-mirror-mode))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10232 (add-to-invisibility-spec '(js2-outline . t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10233 (set (make-local-variable 'line-move-ignore-invisible) t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10234 (set (make-local-variable 'forward-sexp-function) #'js2-mode-forward-sexp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10235 (setq js2-mode-functions-hidden nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10236 js2-mode-comments-hidden nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10237 js2-mode-buffer-dirty-p t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10238 js2-mode-parsing nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10239 (js2-reparse)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10240 (run-hooks 'js2-mode-hook))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10241
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10242 (defun js2-mode-exit ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10243 "Exit `js2-mode' and clean up."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10244 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10245 (when js2-mode-node-overlay
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10246 (delete-overlay js2-mode-node-overlay)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10247 (setq js2-mode-node-overlay nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10248 (js2-remove-overlays)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10249 (setq js2-mode-ast nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10250 (remove-hook 'change-major-mode-hook #'js2-mode-exit t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10251 (remove-from-invisibility-spec '(js2-outline . t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10252 (js2-mode-show-all)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10253 (js2-with-unmodifying-text-property-changes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10254 (js2-clear-face (point-min) (point-max))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10255
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10256 (defun js2-before-save ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10257 "Clean up whitespace before saving file.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10258 You can disable this by customizing `js2-cleanup-whitespace'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10259 (when js2-cleanup-whitespace
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10260 (let ((col (current-column)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10261 (delete-trailing-whitespace)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10262 ;; don't change trailing whitespace on current line
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10263 (unless (eq (current-column) col)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10264 (indent-to col)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10265
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10266 (defsubst js2-mode-reset-timer ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10267 "Cancel any existing parse timer and schedule a new one."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10268 (if js2-mode-parse-timer
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10269 (cancel-timer js2-mode-parse-timer))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10270 (setq js2-mode-parsing nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10271 (setq js2-mode-parse-timer
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10272 (run-with-idle-timer js2-idle-timer-delay nil #'js2-reparse)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10273
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10274 (defun js2-mode-edit (beg end len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10275 "Schedule a new parse after buffer is edited.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10276 Buffer edit spans from BEG to END and is of length LEN.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10277 Also clears the `js2-magic' bit on autoinserted parens/brackets
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10278 if the edit occurred on a line different from the magic paren."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10279 (let* ((magic-pos (next-single-property-change (point-min) 'js2-magic))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10280 (line (if magic-pos (line-number-at-pos magic-pos))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10281 (and line
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10282 (or (/= (line-number-at-pos beg) line)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10283 (and (> 0 len)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10284 (/= (line-number-at-pos end) line)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10285 (js2-mode-mundanify-parens)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10286 (setq js2-mode-buffer-dirty-p t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10287 (js2-mode-hide-overlay)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10288 (js2-mode-reset-timer))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10289
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10290 (defun js2-mode-run-font-lock ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10291 "Run `font-lock-fontify-buffer' after parsing/highlighting.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10292 This is intended to allow modes that install their own font-lock keywords
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10293 to work with js2-mode. In practice it never seems to work for long.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10294 Hopefully the Emacs maintainers can help figure out a way to make it work."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10295 (when (and (boundp 'font-lock-keywords)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10296 font-lock-keywords
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10297 (boundp 'font-lock-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10298 font-lock-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10299 ;; TODO: font-lock and jit-lock really really REALLY don't want to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10300 ;; play nicely with js2-mode. They go out of their way to fail to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10301 ;; provide any option for saying "look, fontify the farging buffer
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10302 ;; with just the keywords already". Argh.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10303 (setq font-lock-defaults (list font-lock-keywords 'keywords-only))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10304 (let (font-lock-verbose)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10305 (font-lock-default-fontify-buffer))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10306
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10307 (defun js2-reparse (&optional force)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10308 "Re-parse current buffer after user finishes some data entry.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10309 If we get any user input while parsing, including cursor motion,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10310 we discard the parse and reschedule it. If FORCE is nil, then the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10311 buffer will only rebuild its `js2-mode-ast' if the buffer is dirty."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10312 (let (time
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10313 interrupted-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10314 (js2-compiler-strict-mode js2-mode-show-strict-warnings))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10315 (unless js2-mode-parsing
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10316 (setq js2-mode-parsing t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10317 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10318 (when (or js2-mode-buffer-dirty-p force)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10319 (js2-remove-overlays)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10320 (js2-with-unmodifying-text-property-changes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10321 (remove-text-properties (point-min) (point-max) '(syntax-table))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10322 (setq js2-mode-buffer-dirty-p nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10323 js2-mode-fontifications nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10324 js2-mode-deferred-properties nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10325 js2-additional-externs nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10326 (if js2-mode-verbose-parse-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10327 (message "parsing..."))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10328 (setq time
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10329 (js2-time
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10330 (setq interrupted-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10331 (catch 'interrupted
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10332 (setq js2-mode-ast (js2-parse))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10333 (js2-mode-fontify-regions)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10334 (js2-mode-remove-suppressed-warnings)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10335 (js2-mode-show-warnings)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10336 (js2-mode-show-errors)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10337 (js2-mode-run-font-lock) ; note: doesn't work
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10338 (js2-mode-highlight-magic-parens)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10339 (if (>= js2-highlight-level 1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10340 (js2-highlight-jsdoc js2-mode-ast))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10341 nil))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10342 (if interrupted-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10343 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10344 ;; unfinished parse => try again
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10345 (setq js2-mode-buffer-dirty-p t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10346 (js2-mode-reset-timer))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10347 (if js2-mode-verbose-parse-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10348 (message "Parse time: %s" time)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10349 (setq js2-mode-parsing nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10350 (unless interrupted-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10351 (setq js2-mode-parse-timer nil))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10352
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10353 (defun js2-mode-show-node ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10354 "Debugging aid: highlight selected AST node on mouse click."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10355 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10356 (let ((node (js2-node-at-point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10357 beg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10358 end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10359 (when js2-mode-show-overlay
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10360 (if (null node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10361 (message "No node found at location %s" (point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10362 (setq beg (js2-node-abs-pos node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10363 end (+ beg (js2-node-len node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10364 (if js2-mode-node-overlay
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10365 (move-overlay js2-mode-node-overlay beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10366 (setq js2-mode-node-overlay (make-overlay beg end))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10367 (overlay-put js2-mode-node-overlay 'face 'highlight))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10368 (js2-with-unmodifying-text-property-changes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10369 (put-text-property beg end 'point-left #'js2-mode-hide-overlay))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10370 (message "%s, parent: %s"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10371 (js2-node-short-name node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10372 (if (js2-node-parent node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10373 (js2-node-short-name (js2-node-parent node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10374 "nil"))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10375
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10376 (defun js2-mode-hide-overlay (&optional p1 p2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10377 "Remove the debugging overlay when the point moves.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10378 P1 and P2 are the old and new values of point, respectively."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10379 (when js2-mode-node-overlay
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10380 (let ((beg (overlay-start js2-mode-node-overlay))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10381 (end (overlay-end js2-mode-node-overlay)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10382 ;; Sometimes we're called spuriously.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10383 (unless (and p2
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10384 (>= p2 beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10385 (<= p2 end))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10386 (js2-with-unmodifying-text-property-changes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10387 (remove-text-properties beg end '(point-left nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10388 (delete-overlay js2-mode-node-overlay)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10389 (setq js2-mode-node-overlay nil)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10390
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10391 (defun js2-mode-reset ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10392 "Debugging helper: reset everything."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10393 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10394 (js2-mode-exit)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10395 (js2-mode))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10396
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10397 (defsubst js2-mode-show-warn-or-err (e face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10398 "Highlight a warning or error E with FACE.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10399 E is a list of ((MSG-KEY MSG-ARG) BEG END)."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10400 (let* ((key (first e))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10401 (beg (second e))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10402 (end (+ beg (third e)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10403 ;; Don't inadvertently go out of bounds.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10404 (beg (max (point-min) (min beg (point-max))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10405 (end (max (point-min) (min end (point-max))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10406 (js2-highlight-level 3) ; so js2-set-face is sure to fire
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10407 (ovl (make-overlay beg end)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10408 (overlay-put ovl 'face face)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10409 (overlay-put ovl 'js2-error t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10410 (put-text-property beg end 'help-echo (js2-get-msg key))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10411 (put-text-property beg end 'point-entered #'js2-echo-error)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10412
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10413 (defun js2-remove-overlays ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10414 "Remove overlays from buffer that have a `js2-error' property."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10415 (let ((beg (point-min))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10416 (end (point-max)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10417 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10418 (dolist (o (overlays-in beg end))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10419 (when (overlay-get o 'js2-error)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10420 (delete-overlay o))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10421
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10422 (defun js2-error-at-point (&optional pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10423 "Return non-nil if there's an error overlay at POS.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10424 Defaults to point."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10425 (loop with pos = (or pos (point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10426 for o in (overlays-at pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10427 thereis (overlay-get o 'js2-error)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10428
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10429 (defun js2-mode-fontify-regions ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10430 "Apply fontifications recorded during parsing."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10431 ;; We defer clearing faces as long as possible to eliminate flashing.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10432 (js2-clear-face (point-min) (point-max))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10433 ;; have to reverse the recorded fontifications so that errors and
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10434 ;; warnings overwrite the normal fontifications
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10435 (dolist (f (nreverse js2-mode-fontifications))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10436 (put-text-property (first f) (second f) 'face (third f)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10437 (setq js2-mode-fontifications nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10438 (dolist (p js2-mode-deferred-properties)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10439 (apply #'put-text-property p))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10440 (setq js2-mode-deferred-properties nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10441
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10442 (defun js2-mode-show-errors ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10443 "Highlight syntax errors."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10444 (when js2-mode-show-parse-errors
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10445 (dolist (e (js2-ast-root-errors js2-mode-ast))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10446 (js2-mode-show-warn-or-err e 'js2-error-face))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10447
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10448 (defun js2-mode-remove-suppressed-warnings ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10449 "Take suppressed warnings out of the AST warnings list.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10450 This ensures that the counts and `next-error' are correct."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10451 (setf (js2-ast-root-warnings js2-mode-ast)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10452 (js2-delete-if
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10453 (lambda (e)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10454 (let ((key (caar e)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10455 (or
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10456 (and (not js2-strict-trailing-comma-warning)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10457 (string-match "trailing\\.comma" key))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10458 (and (not js2-strict-cond-assign-warning)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10459 (string= key "msg.equal.as.assign"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10460 (and js2-missing-semi-one-line-override
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10461 (string= key "msg.missing.semi")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10462 (let* ((beg (second e))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10463 (node (js2-node-at-point beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10464 (fn (js2-mode-find-parent-fn node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10465 (body (and fn (js2-function-node-body fn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10466 (lc (and body (js2-node-abs-pos body)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10467 (rc (and lc (+ lc (js2-node-len body)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10468 (and fn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10469 (or (null body)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10470 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10471 (goto-char beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10472 (and (js2-same-line lc)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10473 (js2-same-line rc))))))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10474 (js2-ast-root-warnings js2-mode-ast))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10475
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10476 (defun js2-mode-show-warnings ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10477 "Highlight strict-mode warnings."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10478 (when js2-mode-show-strict-warnings
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10479 (dolist (e (js2-ast-root-warnings js2-mode-ast))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10480 (js2-mode-show-warn-or-err e 'js2-warning-face))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10481
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10482 (defun js2-echo-error (old-point new-point)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10483 "Called by point-motion hooks."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10484 (let ((msg (get-text-property new-point 'help-echo)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10485 (if msg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10486 (message msg))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10487
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10488 (defalias #'js2-echo-help #'js2-echo-error)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10489
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10490 (defun js2-enter-key ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10491 "Handle user pressing the Enter key."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10492 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10493 (let ((parse-status (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10494 (parse-partial-sexp (point-min) (point)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10495 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10496 ;; check if we're inside a string
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10497 ((nth 3 parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10498 (js2-mode-split-string parse-status))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10499 ;; check if inside a block comment
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10500 ((nth 4 parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10501 (js2-mode-extend-comment))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10502 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10503 ;; should probably figure out what the mode-map says we should do
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10504 (if js2-indent-on-enter-key
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10505 (let ((js2-bounce-indent-p nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10506 (js2-indent-line)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10507 (insert "\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10508 (if js2-enter-indents-newline
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10509 (let ((js2-bounce-indent-p nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10510 (js2-indent-line)))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10511
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10512 (defun js2-mode-split-string (parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10513 "Turn a newline in mid-string into a string concatenation.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10514 PARSE-STATUS is as documented in `parse-partial-sexp'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10515 (let* ((col (current-column))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10516 (quote-char (nth 3 parse-status))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10517 (quote-string (string quote-char))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10518 (string-beg (nth 8 parse-status))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10519 (indent (save-match-data
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10520 (or
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10521 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10522 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10523 (if (looking-at "\\+")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10524 (current-column)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10525 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10526 (goto-char string-beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10527 (if (looking-back "\\+\\s-+")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10528 (goto-char (match-beginning 0)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10529 (current-column))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10530 (insert quote-char "\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10531 (indent-to indent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10532 (insert "+ " quote-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10533 (when (eolp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10534 (insert quote-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10535 (backward-char 1))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10536
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10537 (defun js2-mode-extend-comment ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10538 "When inside a comment block, add comment prefix."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10539 (let (star single col first-line needs-close)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10540 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10541 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10542 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10543 ((looking-at "\\*[^/]")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10544 (setq star t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10545 col (current-column)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10546 ((looking-at "/\\*")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10547 (setq star t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10548 first-line t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10549 col (1+ (current-column))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10550 ((looking-at "//")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10551 (setq single t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10552 col (current-column)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10553 ;; Heuristic for whether we need to close the comment:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10554 ;; if we've got a parse error here, assume it's an unterminated
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10555 ;; comment.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10556 (setq needs-close
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10557 (or
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10558 (eq (get-text-property (1- (point)) 'point-entered)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10559 'js2-echo-error)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10560 ;; The heuristic above doesn't work well when we're
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10561 ;; creating a comment and there's another one downstream,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10562 ;; as our parser thinks this one ends at the end of the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10563 ;; next one. (You can have a /* inside a js block comment.)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10564 ;; So just close it if the next non-ws char isn't a *.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10565 (and first-line
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10566 (eolp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10567 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10568 (skip-chars-forward " \t\r\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10569 (not (eq (char-after) ?*))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10570 (insert "\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10571 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10572 (star
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10573 (indent-to col)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10574 (insert "* ")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10575 (if (and first-line needs-close)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10576 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10577 (insert "\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10578 (indent-to col)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10579 (insert "*/"))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10580 (single
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10581 (when (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10582 (and (zerop (forward-line 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10583 (looking-at "\\s-*//")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10584 (indent-to col)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10585 (insert "// "))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10586
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10587 (defun js2-beginning-of-line ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10588 "Toggles point between bol and first non-whitespace char in line.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10589 Also moves past comment delimiters when inside comments."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10590 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10591 (let (node beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10592 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10593 ((bolp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10594 (back-to-indentation))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10595 ((looking-at "//")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10596 (skip-chars-forward "/ \t"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10597 ((and (eq (char-after) ?*)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10598 (setq node (js2-comment-at-point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10599 (memq (js2-comment-node-format node) '(jsdoc block))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10600 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10601 (skip-chars-backward " \t")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10602 (bolp)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10603 (skip-chars-forward "\* \t"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10604 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10605 (goto-char (point-at-bol))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10606
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10607 (defun js2-end-of-line ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10608 "Toggles point between eol and last non-whitespace char in line."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10609 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10610 (if (eolp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10611 (skip-chars-backward " \t")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10612 (goto-char (point-at-eol))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10613
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10614 (defun js2-enter-mirror-mode()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10615 "Turns on mirror mode, where quotes, brackets etc are mirrored automatically
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10616 on insertion."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10617 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10618 (define-key js2-mode-map (read-kbd-macro "{") 'js2-mode-match-curly)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10619 (define-key js2-mode-map (read-kbd-macro "}") 'js2-mode-magic-close-paren)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10620 (define-key js2-mode-map (read-kbd-macro "\"") 'js2-mode-match-double-quote)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10621 (define-key js2-mode-map (read-kbd-macro "'") 'js2-mode-match-single-quote)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10622 (define-key js2-mode-map (read-kbd-macro "(") 'js2-mode-match-paren)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10623 (define-key js2-mode-map (read-kbd-macro ")") 'js2-mode-magic-close-paren)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10624 (define-key js2-mode-map (read-kbd-macro "[") 'js2-mode-match-bracket)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10625 (define-key js2-mode-map (read-kbd-macro "]") 'js2-mode-magic-close-paren))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10626
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10627 (defun js2-leave-mirror-mode()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10628 "Turns off mirror mode."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10629 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10630 (dolist (key '("{" "\"" "'" "(" ")" "[" "]"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10631 (define-key js2-mode-map (read-kbd-macro key) 'self-insert-command)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10632
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10633 (defsubst js2-mode-inside-string ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10634 "Return non-nil if inside a string.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10635 Actually returns the quote character that begins the string."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10636 (let ((parse-state (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10637 (parse-partial-sexp (point-min) (point)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10638 (nth 3 parse-state)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10639
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10640 (defsubst js2-mode-inside-comment-or-string ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10641 "Return non-nil if inside a comment or string."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10642 (or
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10643 (let ((comment-start
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10644 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10645 (goto-char (point-at-bol))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10646 (if (re-search-forward "//" (point-at-eol) t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10647 (match-beginning 0)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10648 (and comment-start
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10649 (<= comment-start (point))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10650 (let ((parse-state (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10651 (parse-partial-sexp (point-min) (point)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10652 (or (nth 3 parse-state)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10653 (nth 4 parse-state)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10654
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10655 (defsubst js2-make-magic-delimiter (delim &optional pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10656 "Add `js2-magic' and `js2-magic-paren-face' to DELIM, a string.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10657 Sets value of `js2-magic' text property to line number at POS."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10658 (propertize delim
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10659 'js2-magic (line-number-at-pos pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10660 'face 'js2-magic-paren-face))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10661
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10662 (defun js2-mode-match-delimiter (open close)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10663 "Insert OPEN (a string) and possibly matching delimiter CLOSE.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10664 The rule we use, which as far as we can tell is how Eclipse works,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10665 is that we insert the match if we're not in a comment or string,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10666 and the next non-whitespace character is either punctuation or
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10667 occurs on another line."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10668 (insert open)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10669 (when (and (looking-at "\\s-*\\([[:punct:]]\\|$\\)")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10670 (not (js2-mode-inside-comment-or-string)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10671 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10672 (insert (js2-make-magic-delimiter close)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10673 (when js2-auto-indent-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10674 (let ((js2-bounce-indent-p (js2-code-at-bol-p)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10675 (js2-indent-line)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10676
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10677 (defun js2-mode-match-bracket ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10678 "Insert matching bracket."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10679 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10680 (js2-mode-match-delimiter "[" "]"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10681
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10682 (defun js2-mode-match-paren ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10683 "Insert matching paren unless already inserted."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10684 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10685 (js2-mode-match-delimiter "(" ")"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10686
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10687 (defun js2-mode-match-curly (arg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10688 "Insert matching curly-brace.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10689 With prefix arg, no formatting or indentation will occur -- the close-brace
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10690 is simply inserted directly at the point."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10691 (interactive "p")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10692 (let (try-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10693 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10694 (current-prefix-arg
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10695 (js2-mode-match-delimiter "{" "}"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10696 ((and js2-auto-insert-catch-block
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10697 (setq try-pos (if (looking-back "\\s-*\\(try\\)\\s-*"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10698 (point-at-bol))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10699 (match-beginning 1))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10700 (js2-insert-catch-skel try-pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10701 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10702 ;; Otherwise try to do something smarter.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10703 (insert "{")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10704 (unless (or (not (looking-at "\\s-*$"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10705 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10706 (skip-chars-forward " \t\r\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10707 (and (looking-at "}")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10708 (js2-error-at-point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10709 (js2-mode-inside-comment-or-string))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10710 (undo-boundary)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10711 ;; absolutely mystifying bug: when inserting the next "\n",
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10712 ;; the buffer-undo-list is given two new entries: the inserted range,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10713 ;; and the incorrect position of the point. It's recorded incorrectly
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10714 ;; as being before the opening "{", not after it. But it's recorded
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10715 ;; as the correct value if you're debugging `js2-mode-match-curly'
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10716 ;; in edebug. I have no idea why it's doing this, but incrementing
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10717 ;; the inserted position fixes the problem, so that the undo takes us
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10718 ;; back to just after the user-inserted "{".
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10719 (insert "\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10720 (ignore-errors
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10721 (incf (cadr buffer-undo-list)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10722 (js2-indent-line)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10723 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10724 (insert "\n}")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10725 (let ((js2-bounce-indent-p (js2-code-at-bol-p)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10726 (js2-indent-line))))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10727
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10728 (defun js2-insert-catch-skel (try-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10729 "Complete a try/catch block after inserting a { following a try keyword.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10730 Rationale is that a try always needs a catch or a finally, and the catch is
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10731 the more likely of the two.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10732
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10733 TRY-POS is the buffer position of the try keyword. The open-curly should
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10734 already have been inserted."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10735 (insert "{")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10736 (let ((try-col (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10737 (goto-char try-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10738 (current-column))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10739 (insert "\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10740 (undo-boundary)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10741 (js2-indent-line) ;; indent the blank line where cursor will end up
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10742 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10743 (insert "\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10744 (indent-to try-col)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10745 (insert "} catch (x) {\n\n")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10746 (indent-to try-col)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10747 (insert "}"))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10748
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10749 (defun js2-mode-highlight-magic-parens ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10750 "Re-highlight magic parens after parsing nukes the 'face prop."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10751 (let ((beg (point-min))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10752 end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10753 (while (setq beg (next-single-property-change beg 'js2-magic))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10754 (setq end (next-single-property-change (1+ beg) 'js2-magic))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10755 (if (get-text-property beg 'js2-magic)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10756 (js2-with-unmodifying-text-property-changes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10757 (put-text-property beg (or end (1+ beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10758 'face 'js2-magic-paren-face))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10759
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10760 (defun js2-mode-mundanify-parens ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10761 "Clear all magic parens and brackets."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10762 (let ((beg (point-min))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10763 end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10764 (while (setq beg (next-single-property-change beg 'js2-magic))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10765 (setq end (next-single-property-change (1+ beg) 'js2-magic))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10766 (remove-text-properties beg (or end (1+ beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10767 '(js2-magic face)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10768
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10769 (defsubst js2-match-quote (quote-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10770 (let ((start-quote (js2-mode-inside-string)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10771 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10772 ;; inside a comment - don't do quote-matching, since we can't
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10773 ;; reliably figure out if we're in a string inside the comment
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10774 ((js2-comment-at-point)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10775 (insert quote-string))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10776 ((not start-quote)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10777 ;; not in string => insert matched quotes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10778 (insert quote-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10779 ;; exception: if we're just before a word, don't double it.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10780 (unless (looking-at "[^ \t\r\n]")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10781 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10782 (insert quote-string))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10783 ((looking-at quote-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10784 (if (looking-back "[^\\]\\\\")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10785 (insert quote-string)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10786 (forward-char 1)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10787 ((and js2-mode-escape-quotes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10788 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10789 (save-match-data
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10790 (re-search-forward quote-string (point-at-eol) t))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10791 ;; inside terminated string, escape quote (unless already escaped)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10792 (insert (if (looking-back "[^\\]\\\\")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10793 quote-string
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10794 (concat "\\" quote-string))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10795 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10796 (insert quote-string))))) ; else terminate the string
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10797
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10798 (defun js2-mode-match-single-quote ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10799 "Insert matching single-quote."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10800 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10801 (let ((parse-status (parse-partial-sexp (point-min) (point))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10802 ;; don't match inside comments, since apostrophe is more common
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10803 (if (nth 4 parse-status)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10804 (insert "'")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10805 (js2-match-quote "'"))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10806
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10807 (defun js2-mode-match-double-quote ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10808 "Insert matching double-quote."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10809 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10810 (js2-match-quote "\""))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10811
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10812 ;; Eclipse works as follows:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10813 ;; * type an open-paren and it auto-inserts close-paren
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10814 ;; - auto-inserted paren gets a green bracket
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10815 ;; - green bracket means typing close-paren there will skip it
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10816 ;; * if you insert any text on a different line, it turns off
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10817 (defun js2-mode-magic-close-paren ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10818 "Skip over close-paren rather than inserting, where appropriate."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10819 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10820 (let* ((here (point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10821 (parse-status (parse-partial-sexp (point-min) here))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10822 (open-pos (nth 1 parse-status))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10823 (close last-input-event)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10824 (open (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10825 ((eq close ?\))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10826 ?\()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10827 ((eq close ?\])
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10828 ?\[)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10829 ((eq close ?})
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10830 ?{)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10831 (t nil))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10832 (if (and (eq (char-after) close)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10833 (eq open (char-after open-pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10834 (js2-same-line open-pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10835 (get-text-property here 'js2-magic))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10836 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10837 (remove-text-properties here (1+ here) '(js2-magic face))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10838 (forward-char 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10839 (insert-char close 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10840 (blink-matching-open)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10841
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10842 (defun js2-mode-wait-for-parse (callback)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10843 "Invoke CALLBACK when parsing is finished.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10844 If parsing is already finished, calls CALLBACK immediately."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10845 (if (not js2-mode-buffer-dirty-p)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10846 (funcall callback)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10847 (push callback js2-mode-pending-parse-callbacks)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10848 (add-hook 'js2-parse-finished-hook #'js2-mode-parse-finished)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10849
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10850 (defun js2-mode-parse-finished ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10851 "Invoke callbacks in `js2-mode-pending-parse-callbacks'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10852 ;; We can't let errors propagate up, since it prevents the
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10853 ;; `js2-parse' method from completing normally and returning
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10854 ;; the ast, which makes things mysteriously not work right.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10855 (unwind-protect
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10856 (dolist (cb js2-mode-pending-parse-callbacks)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10857 (condition-case err
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10858 (funcall cb)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10859 (error (message "%s" err))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10860 (setq js2-mode-pending-parse-callbacks nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10861
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10862 (defun js2-mode-flag-region (from to flag)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10863 "Hide or show text from FROM to TO, according to FLAG.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10864 If FLAG is nil then text is shown, while if FLAG is t the text is hidden.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10865 Returns the created overlay if FLAG is non-nil."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10866 (remove-overlays from to 'invisible 'js2-outline)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10867 (when flag
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10868 (let ((o (make-overlay from to)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10869 (overlay-put o 'invisible 'js2-outline)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10870 (overlay-put o 'isearch-open-invisible
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10871 'js2-isearch-open-invisible)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10872 o)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10873
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10874 ;; Function to be set as an outline-isearch-open-invisible' property
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10875 ;; to the overlay that makes the outline invisible (see
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10876 ;; `js2-mode-flag-region').
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10877 (defun js2-isearch-open-invisible (overlay)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10878 ;; We rely on the fact that isearch places point on the matched text.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10879 (js2-mode-show-element))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10880
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10881 (defun js2-mode-invisible-overlay-bounds (&optional pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10882 "Return cons cell of bounds of folding overlay at POS.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10883 Returns nil if not found."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10884 (let ((overlays (overlays-at (or pos (point))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10885 o)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10886 (while (and overlays
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10887 (not o))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10888 (if (overlay-get (car overlays) 'invisible)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10889 (setq o (car overlays))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10890 (setq overlays (cdr overlays))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10891 (if o
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10892 (cons (overlay-start o) (overlay-end o)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10893
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10894 (defun js2-mode-function-at-point (&optional pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10895 "Return the innermost function node enclosing current point.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10896 Returns nil if point is not in a function."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10897 (let ((node (js2-node-at-point pos)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10898 (while (and node (not (js2-function-node-p node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10899 (setq node (js2-node-parent node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10900 (if (js2-function-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10901 node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10902
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10903 (defun js2-mode-toggle-element ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10904 "Hide or show the foldable element at the point."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10905 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10906 (let (comment fn pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10907 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10908 (save-match-data
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10909 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10910 ;; /* ... */ comment?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10911 ((js2-block-comment-p (setq comment (js2-comment-at-point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10912 (if (js2-mode-invisible-overlay-bounds
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10913 (setq pos (+ 3 (js2-node-abs-pos comment))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10914 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10915 (goto-char pos)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10916 (js2-mode-show-element))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10917 (js2-mode-hide-element)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10918 ;; //-comment?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10919 ((save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10920 (back-to-indentation)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10921 (looking-at js2-mode-//-comment-re))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10922 (js2-mode-toggle-//-comment))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10923 ;; function?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10924 ((setq fn (js2-mode-function-at-point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10925 (setq pos (and (js2-function-node-body fn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10926 (js2-node-abs-pos (js2-function-node-body fn))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10927 (goto-char (1+ pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10928 (if (js2-mode-invisible-overlay-bounds)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10929 (js2-mode-show-element)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10930 (js2-mode-hide-element)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10931 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10932 (message "Nothing at point to hide or show")))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10933
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10934 (defun js2-mode-hide-element ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10935 "Fold/hide contents of a block, showing ellipses.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10936 Show the hidden text with \\[js2-mode-show-element]."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10937 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10938 (if js2-mode-buffer-dirty-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10939 (js2-mode-wait-for-parse #'js2-mode-hide-element))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10940 (let (node body beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10941 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10942 ((js2-mode-invisible-overlay-bounds)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10943 (message "already hidden"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10944 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10945 (setq node (js2-node-at-point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10946 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10947 ((js2-block-comment-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10948 (js2-mode-hide-comment node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10949 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10950 (while (and node (not (js2-function-node-p node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10951 (setq node (js2-node-parent node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10952 (if (and node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10953 (setq body (js2-function-node-body node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10954 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10955 (setq beg (js2-node-abs-pos body)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10956 end (+ beg (js2-node-len body)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10957 (js2-mode-flag-region (1+ beg) (1- end) 'hide))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10958 (message "No collapsable element found at point"))))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10959
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10960 (defun js2-mode-show-element ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10961 "Show the hidden element at current point."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10962 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10963 (let ((bounds (js2-mode-invisible-overlay-bounds)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10964 (if bounds
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10965 (js2-mode-flag-region (car bounds) (cdr bounds) nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10966 (message "Nothing to un-hide"))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10967
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10968 (defun js2-mode-show-all ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10969 "Show all of the text in the buffer."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10970 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10971 (js2-mode-flag-region (point-min) (point-max) nil))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10972
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10973 (defun js2-mode-toggle-hide-functions ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10974 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10975 (if js2-mode-functions-hidden
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10976 (js2-mode-show-functions)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10977 (js2-mode-hide-functions)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10978
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10979 (defun js2-mode-hide-functions ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10980 "Hides all non-nested function bodies in the buffer.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10981 Use \\[js2-mode-show-all] to reveal them, or \\[js2-mode-show-element]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10982 to open an individual entry."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10983 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10984 (if js2-mode-buffer-dirty-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10985 (js2-mode-wait-for-parse #'js2-mode-hide-functions))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10986 (if (null js2-mode-ast)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10987 (message "Oops - parsing failed")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10988 (setq js2-mode-functions-hidden t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10989 (js2-visit-ast js2-mode-ast #'js2-mode-function-hider)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10990
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10991 (defun js2-mode-function-hider (n endp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10992 (when (not endp)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10993 (let ((tt (js2-node-type n))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10994 body beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10995 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10996 ((and (= tt js2-FUNCTION)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10997 (setq body (js2-function-node-body n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10998 (setq beg (js2-node-abs-pos body)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
10999 end (+ beg (js2-node-len body)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11000 (js2-mode-flag-region (1+ beg) (1- end) 'hide)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11001 nil) ; don't process children of function
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11002 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11003 t))))) ; keep processing other AST nodes
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11004
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11005 (defun js2-mode-show-functions ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11006 "Un-hide any folded function bodies in the buffer."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11007 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11008 (setq js2-mode-functions-hidden nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11009 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11010 (goto-char (point-min))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11011 (while (/= (goto-char (next-overlay-change (point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11012 (point-max))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11013 (dolist (o (overlays-at (point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11014 (when (and (overlay-get o 'invisible)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11015 (not (overlay-get o 'comment)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11016 (js2-mode-flag-region (overlay-start o) (overlay-end o) nil))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11017
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11018 (defun js2-mode-hide-comment (n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11019 (let* ((head (if (eq (js2-comment-node-format n) 'jsdoc)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11020 3 ; /**
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11021 2)) ; /*
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11022 (beg (+ (js2-node-abs-pos n) head))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11023 (end (- (+ beg (js2-node-len n)) head 2))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11024 (o (js2-mode-flag-region beg end 'hide)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11025 (overlay-put o 'comment t)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11026
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11027 (defun js2-mode-toggle-hide-comments ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11028 "Folds all block comments in the buffer.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11029 Use \\[js2-mode-show-all] to reveal them, or \\[js2-mode-show-element]
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11030 to open an individual entry."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11031 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11032 (if js2-mode-comments-hidden
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11033 (js2-mode-show-comments)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11034 (js2-mode-hide-comments)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11035
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11036 (defun js2-mode-hide-comments ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11037 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11038 (if js2-mode-buffer-dirty-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11039 (js2-mode-wait-for-parse #'js2-mode-hide-comments))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11040 (if (null js2-mode-ast)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11041 (message "Oops - parsing failed")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11042 (setq js2-mode-comments-hidden t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11043 (dolist (n (js2-ast-root-comments js2-mode-ast))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11044 (let ((format (js2-comment-node-format n)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11045 (when (js2-block-comment-p n)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11046 (js2-mode-hide-comment n))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11047 (js2-mode-hide-//-comments)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11048
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11049 (defsubst js2-mode-extend-//-comment (direction)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11050 "Find start or end of a block of similar //-comment lines.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11051 DIRECTION is -1 to look back, 1 to look forward.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11052 INDENT is the indentation level to match.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11053 Returns the end-of-line position of the furthest adjacent
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11054 //-comment line with the same indentation as the current line.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11055 If there is no such matching line, returns current end of line."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11056 (let ((pos (point-at-eol))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11057 (indent (current-indentation)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11058 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11059 (save-match-data
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11060 (while (and (zerop (forward-line direction))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11061 (looking-at js2-mode-//-comment-re)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11062 (eq indent (length (match-string 1))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11063 (setq pos (point-at-eol)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11064 pos))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11065
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11066 (defun js2-mode-hide-//-comments ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11067 "Fold adjacent 1-line comments, showing only snippet of first one."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11068 (let (beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11069 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11070 (save-match-data
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11071 (goto-char (point-min))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11072 (while (re-search-forward js2-mode-//-comment-re nil t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11073 (setq beg (point)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11074 end (js2-mode-extend-//-comment 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11075 (unless (eq beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11076 (overlay-put (js2-mode-flag-region beg end 'hide)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11077 'comment t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11078 (goto-char end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11079 (forward-char 1))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11080
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11081 (defun js2-mode-toggle-//-comment ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11082 "Fold or un-fold any multi-line //-comment at point.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11083 Caller should have determined that this line starts with a //-comment."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11084 (let* ((beg (point-at-eol))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11085 (end beg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11086 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11087 (goto-char end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11088 (if (js2-mode-invisible-overlay-bounds)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11089 (js2-mode-show-element)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11090 ;; else hide the comment
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11091 (setq beg (js2-mode-extend-//-comment -1)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11092 end (js2-mode-extend-//-comment 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11093 (unless (eq beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11094 (overlay-put (js2-mode-flag-region beg end 'hide)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11095 'comment t))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11096
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11097 (defun js2-mode-show-comments ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11098 "Un-hide any hidden comments, leaving other hidden elements alone."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11099 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11100 (setq js2-mode-comments-hidden nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11101 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11102 (goto-char (point-min))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11103 (while (/= (goto-char (next-overlay-change (point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11104 (point-max))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11105 (dolist (o (overlays-at (point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11106 (when (overlay-get o 'comment)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11107 (js2-mode-flag-region (overlay-start o) (overlay-end o) nil))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11108
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11109 (defun js2-mode-display-warnings-and-errors ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11110 "Turn on display of warnings and errors."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11111 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11112 (setq js2-mode-show-parse-errors t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11113 js2-mode-show-strict-warnings t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11114 (js2-reparse 'force))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11115
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11116 (defun js2-mode-hide-warnings-and-errors ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11117 "Turn off display of warnings and errors."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11118 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11119 (setq js2-mode-show-parse-errors nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11120 js2-mode-show-strict-warnings nil)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11121 (js2-reparse 'force))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11122
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11123 (defun js2-mode-toggle-warnings-and-errors ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11124 "Toggle the display of warnings and errors.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11125 Some users don't like having warnings/errors reported while they type."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11126 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11127 (setq js2-mode-show-parse-errors (not js2-mode-show-parse-errors)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11128 js2-mode-show-strict-warnings (not js2-mode-show-strict-warnings))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11129 (if (interactive-p)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11130 (message "warnings and errors %s"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11131 (if js2-mode-show-parse-errors
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11132 "enabled"
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11133 "disabled")))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11134 (js2-reparse 'force))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11135
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11136 (defun js2-mode-customize ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11137 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11138 (customize-group 'js2-mode))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11139
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11140 (defun js2-mode-forward-sexp (&optional arg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11141 "Move forward across one statement or balanced expression.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11142 With ARG, do it that many times. Negative arg -N means
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11143 move backward across N balanced expressions."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11144 (interactive "p")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11145 (setq arg (or arg 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11146 (if js2-mode-buffer-dirty-p
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11147 (js2-mode-wait-for-parse #'js2-mode-forward-sexp))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11148 (let (node end (start (point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11149 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11150 ;; backward-sexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11151 ;; could probably make this better for some cases:
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11152 ;; - if in statement block (e.g. function body), go to parent
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11153 ;; - infix exprs like (foo in bar) - maybe go to beginning
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11154 ;; of infix expr if in the right-side expression?
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11155 ((and arg (minusp arg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11156 (dotimes (i (- arg))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11157 (js2-backward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11158 (forward-char -1) ; enter the node we backed up to
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11159 (setq node (js2-node-at-point (point) t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11160 (goto-char (if node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11161 (js2-node-abs-pos node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11162 (point-min)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11163 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11164 ;; forward-sexp
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11165 (js2-forward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11166 (dotimes (i arg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11167 (js2-forward-sws)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11168 (setq node (js2-node-at-point (point) t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11169 end (if node (+ (js2-node-abs-pos node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11170 (js2-node-len node))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11171 (goto-char (or end (point-max))))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11172
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11173 (defun js2-next-error (&optional arg reset)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11174 "Move to next parse error.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11175 Typically invoked via \\[next-error].
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11176 ARG is the number of errors, forward or backward, to move.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11177 RESET means start over from the beginning."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11178 (interactive "p")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11179 (if (or (null js2-mode-ast)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11180 (and (null (js2-ast-root-errors js2-mode-ast))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11181 (null (js2-ast-root-warnings js2-mode-ast))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11182 (message "No errors")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11183 (when reset
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11184 (goto-char (point-min)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11185 (let* ((errs (copy-sequence
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11186 (append (js2-ast-root-errors js2-mode-ast)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11187 (js2-ast-root-warnings js2-mode-ast))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11188 (continue t)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11189 (start (point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11190 (count (or arg 1))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11191 (backward (minusp count))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11192 (sorter (if backward '> '<))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11193 (stopper (if backward '< '>))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11194 (count (abs count))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11195 all-errs
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11196 err)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11197 ;; sort by start position
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11198 (setq errs (sort errs (lambda (e1 e2)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11199 (funcall sorter (second e1) (second e2))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11200 all-errs errs)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11201 ;; find nth error with pos > start
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11202 (while (and errs continue)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11203 (when (funcall stopper (cadar errs) start)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11204 (setq err (car errs))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11205 (if (zerop (decf count))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11206 (setq continue nil)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11207 (setq errs (cdr errs)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11208 (if err
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11209 (goto-char (second err))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11210 ;; wrap around to first error
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11211 (goto-char (second (car all-errs)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11212 ;; if we were already on it, echo msg again
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11213 (if (= (point) start)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11214 (js2-echo-error (point) (point)))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11215
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11216 (defun js2-down-mouse-3 ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11217 "Make right-click move the point to the click location.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11218 This makes right-click context menu operations a bit more intuitive.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11219 The point will not move if the region is active, however, to avoid
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11220 destroying the region selection."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11221 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11222 (when (and js2-move-point-on-right-click
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11223 (not mark-active))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11224 (let ((e last-input-event))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11225 (ignore-errors
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11226 (goto-char (cadadr e))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11227
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11228 (defun js2-mode-create-imenu-index ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11229 "Return an alist for `imenu--index-alist'."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11230 ;; This is built up in `js2-parse-record-imenu' during parsing.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11231 (when js2-mode-ast
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11232 ;; if we have an ast but no recorder, they're requesting a rescan
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11233 (unless js2-imenu-recorder
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11234 (js2-reparse 'force))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11235 (prog1
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11236 (js2-build-imenu-index)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11237 (setq js2-imenu-recorder nil
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11238 js2-imenu-function-map nil))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11239
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11240 (defun js2-mode-find-tag ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11241 "Replacement for `find-tag-default'.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11242 `find-tag-default' returns a ridiculous answer inside comments."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11243 (let (beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11244 (js2-with-underscore-as-word-syntax
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11245 (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11246 (if (and (not (looking-at "[A-Za-z0-9_$]"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11247 (looking-back "[A-Za-z0-9_$]"))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11248 (setq beg (progn (forward-word -1) (point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11249 end (progn (forward-word 1) (point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11250 (setq beg (progn (forward-word 1) (point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11251 end (progn (forward-word -1) (point))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11252 (replace-regexp-in-string
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11253 "[\"']" ""
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11254 (buffer-substring-no-properties beg end))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11255
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11256 (defun js2-mode-forward-sibling ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11257 "Move to the end of the sibling following point in parent.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11258 Returns non-nil if successful, or nil if there was no following sibling."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11259 (let* ((node (js2-node-at-point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11260 (parent (js2-mode-find-enclosing-fn node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11261 sib)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11262 (when (setq sib (js2-node-find-child-after (point) parent))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11263 (goto-char (+ (js2-node-abs-pos sib)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11264 (js2-node-len sib))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11265
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11266 (defun js2-mode-backward-sibling ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11267 "Move to the beginning of the sibling node preceding point in parent.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11268 Parent is defined as the enclosing script or function."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11269 (let* ((node (js2-node-at-point))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11270 (parent (js2-mode-find-enclosing-fn node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11271 sib)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11272 (when (setq sib (js2-node-find-child-before (point) parent))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11273 (goto-char (js2-node-abs-pos sib)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11274
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11275 (defun js2-beginning-of-defun ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11276 "Go to line on which current function starts, and return non-nil.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11277 If we're not in a function, go to beginning of previous script-level element."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11278 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11279 (let ((parent (js2-node-parent-script-or-fn (js2-node-at-point)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11280 pos sib)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11281 (cond
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11282 ((and (js2-function-node-p parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11283 (not (eq (point) (setq pos (js2-node-abs-pos parent)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11284 (goto-char pos))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11285 (t
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11286 (js2-mode-backward-sibling)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11287
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11288 (defun js2-end-of-defun ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11289 "Go to the char after the last position of the current function.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11290 If we're not in a function, skips over the next script-level element."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11291 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11292 (let ((parent (js2-node-parent-script-or-fn (js2-node-at-point))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11293 (if (not (js2-function-node-p parent))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11294 ;; punt: skip over next script-level element beyond point
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11295 (js2-mode-forward-sibling)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11296 (goto-char (+ 1 (+ (js2-node-abs-pos parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11297 (js2-node-len parent)))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11298
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11299 (defun js2-mark-defun (&optional allow-extend)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11300 "Put mark at end of this function, point at beginning.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11301 The function marked is the one that contains point.
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11302
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11303 Interactively, if this command is repeated,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11304 or (in Transient Mark mode) if the mark is active,
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11305 it marks the next defun after the ones already marked."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11306 (interactive "p")
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11307 (let (extended)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11308 (when (and allow-extend
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11309 (or (and (eq last-command this-command) (mark t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11310 (and transient-mark-mode mark-active)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11311 (let ((sib (save-excursion
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11312 (goto-char (mark))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11313 (if (js2-mode-forward-sibling)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11314 (point))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11315 node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11316 (if sib
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11317 (progn
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11318 (set-mark sib)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11319 (setq extended t))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11320 ;; no more siblings - try extending to enclosing node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11321 (goto-char (mark t)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11322 (when (not extended)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11323 (let ((node (js2-node-at-point (point) t)) ; skip comments
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11324 ast fn stmt parent beg end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11325 (when (js2-ast-root-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11326 (setq ast node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11327 node (or (js2-node-find-child-after (point) node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11328 (js2-node-find-child-before (point) node))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11329 ;; only mark whole buffer if we can't find any children
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11330 (if (null node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11331 (setq node ast))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11332 (if (js2-function-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11333 (setq parent node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11334 (setq fn (js2-mode-find-enclosing-fn node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11335 stmt (if (or (null fn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11336 (js2-ast-root-p fn))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11337 (js2-mode-find-first-stmt node))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11338 parent (or stmt fn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11339 (setq beg (js2-node-abs-pos parent)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11340 end (+ beg (js2-node-len parent)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11341 (push-mark beg)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11342 (goto-char end)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11343 (exchange-point-and-mark)))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11344
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11345 (defun js2-narrow-to-defun ()
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11346 "Narrow to the function enclosing point."
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11347 (interactive)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11348 (let* ((node (js2-node-at-point (point) t)) ; skip comments
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11349 (fn (if (js2-script-node-p node)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11350 node
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11351 (js2-mode-find-enclosing-fn node)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11352 (beg (js2-node-abs-pos fn)))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11353 (unless (js2-ast-root-p fn)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11354 (narrow-to-region beg (+ beg (js2-node-len fn))))))
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11355
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11356 (provide 'js2-mode)
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11357
104118
be3e01fa532e Add arch tagline
Miles Bader <miles@gnu.org>
parents: 104093
diff changeset
11358 ;; arch-tag: 1dd56864-a3ef-4682-a63f-6341f6a42738
104093
d4d230a6489c added js2-mode.el
Steve Yegge <steve.yegge@gmail.com>
parents:
diff changeset
11359 ;;; js2-mode.el ends here