annotate lisp/progmodes/js.el @ 104272:ea67ac46d172

* progmodes/js2-mode.el: File removed. * Makefile.in (ELCFILES): Add js.el, and remove js2-mode.el. * speedbar.el (speedbar-supported-extension-expressions): Add .js. * progmodes/hideshow.el (hs-special-modes-alist): Add js-mode entry. * progmodes/js.el: New file.
author Chong Yidong <cyd@stupidchicken.com>
date Fri, 14 Aug 2009 23:02:38 +0000
parents
children 3bf815184a6c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
104272
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1 ;;; js.el --- Major mode for editing JavaScript source text
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3 ;; Copyright (C) 2008, 2009 Free Software Foundation, Inc.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
4
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
5 ;; Author: Karl Landstrom <karl.landstrom@brgeight.se>
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
6 ;; Daniel Colascione <dan.colascione@gmail.com>
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
7 ;; Maintainer: Daniel Colascione <dan.colascione@gmail.com>
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
8 ;; Version: 9
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
9 ;; Date: 2009-07-25
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
10 ;; Keywords: languages, oop, javascript
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
11
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
12 ;; This file is part of GNU Emacs.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
13
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
14 ;; GNU Emacs is free software: you can redistribute it and/or modify
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
15 ;; it under the terms of the GNU General Public License as published by
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
16 ;; the Free Software Foundation, either version 3 of the License, or
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
17 ;; (at your option) any later version.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
18
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
19 ;; GNU Emacs is distributed in the hope that it will be useful,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
22 ;; GNU General Public License for more details.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
23
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
24 ;; You should have received a copy of the GNU General Public License
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
25 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
26
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
27 ;;; Commentary
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
28
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
29 ;; This is based on Karl Landstrom's barebones javascript-mode. This
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
30 ;; is much more robust and works with cc-mode's comment filling
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
31 ;; (mostly).
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
32 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
33 ;; The main features of this JavaScript mode are syntactic
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
34 ;; highlighting (enabled with `font-lock-mode' or
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
35 ;; `global-font-lock-mode'), automatic indentation and filling of
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
36 ;; comments, C preprocessor fontification, and MozRepl integration.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
37 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
38 ;; General Remarks:
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
39 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
40 ;; XXX: This mode assumes that block comments are not nested inside block
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
41 ;; XXX: comments
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
42 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
43 ;; Exported names start with "js-"; private names start with
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
44 ;; "js--".
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
45
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
46 ;;; Code:
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
47
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
48 (eval-and-compile
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
49 (require 'cc-mode)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
50 (require 'font-lock)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
51 (require 'newcomment)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
52 (require 'imenu)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
53 (require 'etags)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
54 (require 'thingatpt)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
55 (require 'easymenu)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
56 (require 'moz nil t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
57 (require 'json nil t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
58
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
59 (eval-when-compile
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
60 (require 'cl)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
61 (require 'comint)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
62 (require 'ido)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
63 ;; Swap the speed and safety values for debugging
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
64 (proclaim '(optimize (speed 3) (safety 0))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
65
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
66 (defvar inferior-moz-buffer)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
67 (defvar moz-repl-name)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
68 (defvar ido-cur-list)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
69 (declare-function ido-mode "ido")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
70 (declare-function inferior-moz-process "mozrepl")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
71
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
72 ;;; Constants
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
73
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
74 (defconst js--name-start-re "[a-zA-Z_$]"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
75 "Matches the first character of a Javascript identifier. No grouping")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
76
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
77 (defconst js--stmt-delim-chars "^;{}?:")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
78
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
79 (defconst js--name-re (concat js--name-start-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
80 "\\(?:\\s_\\|\\sw\\)*")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
81 "Matches a Javascript identifier. No grouping.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
82
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
83 (defconst js--objfield-re (concat js--name-re ":")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
84 "Matches a Javascript object field start")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
85
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
86 (defconst js--dotted-name-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
87 (concat js--name-re "\\(?:\\." js--name-re "\\)*")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
88 "Matches a dot-separated sequence of Javascript names")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
89
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
90 (defconst js--cpp-name-re js--name-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
91 "Matches a C preprocessor name")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
92
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
93 (defconst js--opt-cpp-start "^\\s-*#\\s-*\\([[:alnum:]]+\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
94 "Regexp matching the prefix of a cpp directive including the directive
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
95 name, or nil in languages without preprocessor support. The first
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
96 submatch surrounds the directive name.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
97
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
98 (defconst js--plain-method-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
99 (concat "^\\s-*?\\(" js--dotted-name-re "\\)\\.prototype"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
100 "\\.\\(" js--name-re "\\)\\s-*?=\\s-*?\\(function\\)\\_>")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
101 "Regexp matching an old-fashioned explicit prototype \"method\"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
102 declaration. Group 1 is a (possibly-dotted) class name, group 2
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
103 is a method name, and group 3 is the 'function' keyword." )
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
104
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
105 (defconst js--plain-class-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
106 (concat "^\\s-*\\(" js--dotted-name-re "\\)\\.prototype"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
107 "\\s-*=\\s-*{")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
108 "Regexp matching an old-fashioned explicit prototype \"class\"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
109 declaration, as in Class.prototype = { method1: ...} ")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
110
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
111 (defconst js--mp-class-decl-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
112 (concat "^\\s-*var\\s-+"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
113 "\\(" js--name-re "\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
114 "\\s-*=\\s-*"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
115 "\\(" js--dotted-name-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
116 "\\)\\.extend\\(?:Final\\)?\\s-*(\\s-*{?\\s-*$")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
117 "var NewClass = BaseClass.extend(")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
118
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
119 (defconst js--prototype-obsolete-class-decl-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
120 (concat "^\\s-*\\(?:var\\s-+\\)?"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
121 "\\(" js--dotted-name-re "\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
122 "\\s-*=\\s-*Class\\.create()")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
123 "var NewClass = Class.create()")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
124
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
125 (defconst js--prototype-objextend-class-decl-re-1
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
126 (concat "^\\s-*Object\\.extend\\s-*("
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
127 "\\(" js--dotted-name-re "\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
128 "\\s-*,\\s-*{"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
129
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
130 (defconst js--prototype-objextend-class-decl-re-2
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
131 (concat "^\\s-*\\(?:var\\s-+\\)?"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
132 "\\(" js--dotted-name-re "\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
133 "\\s-*=\\s-*Object\\.extend\\s-*\("))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
134
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
135 (defconst js--prototype-class-decl-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
136 (concat "^\\s-*\\(?:var\\s-+\\)?"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
137 "\\(" js--name-re "\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
138 "\\s-*=\\s-*Class\\.create\\s-*(\\s-*"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
139 "\\(?:\\(" js--dotted-name-re "\\)\\s-*,\\s-*\\)?{?")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
140 "var NewClass = Class.create({")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
141
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
142 ;; Parent class name(s) (yes, multiple inheritance in Javascript) are
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
143 ;; matched with dedicated font-lock matchers
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
144 (defconst js--dojo-class-decl-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
145 (concat "^\\s-*dojo\\.declare\\s-*(\"\\(" js--dotted-name-re "\\)"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
146
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
147 (defconst js--extjs-class-decl-re-1
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
148 (concat "^\\s-*Ext\\.extend\\s-*("
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
149 "\\s-*\\(" js--dotted-name-re "\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
150 "\\s-*,\\s-*\\(" js--dotted-name-re "\\)")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
151 "ExtJS class declaration (style 1)")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
152
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
153 (defconst js--extjs-class-decl-re-2
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
154 (concat "^\\s-*\\(?:var\\s-+\\)?"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
155 "\\(" js--name-re "\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
156 "\\s-*=\\s-*Ext\\.extend\\s-*(\\s-*"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
157 "\\(" js--dotted-name-re "\\)")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
158 "ExtJS class declaration (style 2)")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
159
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
160 (defconst js--mochikit-class-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
161 (concat "^\\s-*MochiKit\\.Base\\.update\\s-*(\\s-*"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
162 "\\(" js--dotted-name-re "\\)")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
163 "MochiKit class declaration?")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
164
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
165 (defconst js--dummy-class-style
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
166 '(:name "[Automatically Generated Class]"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
167
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
168 (defconst js--class-styles
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
169 `((:name "Plain"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
170 :class-decl ,js--plain-class-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
171 :prototype t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
172 :contexts (toplevel)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
173 :framework javascript)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
174
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
175 (:name "MochiKit"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
176 :class-decl ,js--mochikit-class-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
177 :prototype t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
178 :contexts (toplevel)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
179 :framework mochikit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
180
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
181 (:name "Prototype (Obsolete)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
182 :class-decl ,js--prototype-obsolete-class-decl-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
183 :contexts (toplevel)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
184 :framework prototype)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
185
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
186 (:name "Prototype (Modern)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
187 :class-decl ,js--prototype-class-decl-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
188 :contexts (toplevel)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
189 :framework prototype)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
190
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
191 (:name "Prototype (Object.extend)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
192 :class-decl ,js--prototype-objextend-class-decl-re-1
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
193 :prototype t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
194 :contexts (toplevel)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
195 :framework prototype)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
196
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
197 (:name "Prototype (Object.extend) 2"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
198 :class-decl ,js--prototype-objextend-class-decl-re-2
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
199 :prototype t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
200 :contexts (toplevel)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
201 :framework prototype)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
202
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
203 (:name "Dojo"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
204 :class-decl ,js--dojo-class-decl-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
205 :contexts (toplevel)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
206 :framework dojo)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
207
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
208 (:name "ExtJS (style 1)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
209 :class-decl ,js--extjs-class-decl-re-1
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
210 :prototype t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
211 :contexts (toplevel)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
212 :framework extjs)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
213
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
214 (:name "ExtJS (style 2)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
215 :class-decl ,js--extjs-class-decl-re-2
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
216 :contexts (toplevel)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
217 :framework extjs)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
218
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
219 (:name "Merrill Press"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
220 :class-decl ,js--mp-class-decl-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
221 :contexts (toplevel)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
222 :framework merrillpress))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
223
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
224 "A list of class definition styles.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
225
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
226 A class definition style is a plist with the following keys:
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
227
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
228 :name is a human-readable name of the class type
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
229
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
230 :class-decl is a regular expression giving the start of the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
231 class. Its first group must match the name of its class. If there
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
232 is a parent class, the second group should match, and it should
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
233 be the name of the class.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
234
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
235 If :prototype is present and non-nil, the parser will merge
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
236 declarations for this constructs with others at the same lexical
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
237 level that have the same name. Otherwise, multiple definitions
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
238 will create multiple top-level entries. Don't use :prototype
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
239 unnecessarily: it has an associated cost in performance.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
240
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
241 If :strip-prototype is present and non-nil, then if the class
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
242 name as matched contains
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
243 ")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
244
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
245 (defconst js--available-frameworks
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
246 (loop with available-frameworks
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
247 for style in js--class-styles
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
248 for framework = (plist-get style :framework)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
249 unless (memq framework available-frameworks)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
250 collect framework into available-frameworks
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
251 finally return available-frameworks)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
252
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
253 "List of available frameworks symbols")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
254
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
255 (defconst js--function-heading-1-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
256 (concat
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
257 "^\\s-*function\\s-+\\(" js--name-re "\\)")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
258 "Regular expression matching the start of a function header. Match group 1
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
259 is the name of the function.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
260
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
261 (defconst js--function-heading-2-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
262 (concat
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
263 "^\\s-*\\(" js--name-re "\\)\\s-*:\\s-*function\\_>")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
264 "Regular expression matching the start of a function entry in
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
265 an associative array. Match group 1 is the name of the function.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
266
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
267 (defconst js--function-heading-3-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
268 (concat
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
269 "^\\s-*\\(?:var\\s-+\\)?\\(" js--dotted-name-re "\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
270 "\\s-*=\\s-*function\\_>")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
271 "Matches a line in the form var MUMBLE = function. Match group
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
272 1 is MUMBLE.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
273
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
274 (defconst js--macro-decl-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
275 (concat "^\\s-*#\\s-*define\\s-+\\(" js--cpp-name-re "\\)\\s-*(")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
276 "Regular expression matching a CPP macro definition up to the opening
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
277 parenthesis. Match group 1 is the name of the function.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
278
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
279 (defun js--regexp-opt-symbol (list)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
280 "Like regexp-opt, but surround the optimized regular expression
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
281 with `\\\\_<' and `\\\\_>'."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
282 (concat "\\_<" (regexp-opt list t) "\\_>"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
283
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
284 (defconst js--keyword-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
285 (js--regexp-opt-symbol
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
286 '("abstract" "break" "case" "catch" "class" "const"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
287 "continue" "debugger" "default" "delete" "do" "else"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
288 "enum" "export" "extends" "final" "finally" "for"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
289 "function" "goto" "if" "implements" "import" "in"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
290 "instanceof" "interface" "native" "new" "package"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
291 "private" "protected" "public" "return" "static"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
292 "super" "switch" "synchronized" "throw"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
293 "throws" "transient" "try" "typeof" "var" "void" "let"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
294 "yield" "volatile" "while" "with"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
295 "Regular expression matching any JavaScript keyword.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
296
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
297 (defconst js--basic-type-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
298 (js--regexp-opt-symbol
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
299 '("boolean" "byte" "char" "double" "float" "int" "long"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
300 "short" "void"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
301 "Regular expression matching any predefined type in JavaScript.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
302
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
303 (defconst js--constant-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
304 (js--regexp-opt-symbol '("false" "null" "undefined"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
305 "Infinity" "NaN"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
306 "true" "arguments" "this"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
307 "Regular expression matching any future reserved words in JavaScript.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
308
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
309
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
310 (defconst js--font-lock-keywords-1
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
311 (list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
312 "\\_<import\\_>"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
313 (list js--function-heading-1-re 1 font-lock-function-name-face)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
314 (list js--function-heading-2-re 1 font-lock-function-name-face))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
315 "Level one font lock.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
316
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
317 (defconst js--font-lock-keywords-2
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
318 (append js--font-lock-keywords-1
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
319 (list (list js--keyword-re 1 font-lock-keyword-face)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
320 (list "\\_<for\\_>"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
321 "\\s-+\\(each\\)\\_>" nil nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
322 (list 1 'font-lock-keyword-face))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
323 (cons js--basic-type-re font-lock-type-face)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
324 (cons js--constant-re font-lock-constant-face)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
325 "Level two font lock.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
326
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
327 ;; js--pitem is the basic building block of the lexical
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
328 ;; database. When one refers to a real part of the buffer, the region
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
329 ;; of text to which it refers is split into a conceptual header and
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
330 ;; body. Consider the (very short) block described by a hypothetical
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
331 ;; js--pitem:
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
332 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
333 ;; function foo(a,b,c) { return 42; }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
334 ;; ^ ^ ^
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
335 ;; | | |
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
336 ;; +- h-begin +- h-end +- b-end
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
337 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
338 ;; (Remember that these are buffer positions, and therefore point
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
339 ;; between characters, not at them. An arrow drawn to a character
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
340 ;; indicates the corresponding position is between that character and
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
341 ;; the one immediately preceding it.)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
342 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
343 ;; The header is the region of text [h-begin, h-end], and is
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
344 ;; the text needed to unambiguously recognize the start of the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
345 ;; construct. If the entire header is not present, the construct is
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
346 ;; not recognized at all. No other pitems may be nested inside the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
347 ;; header.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
348 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
349 ;; The body is the region [h-end, b-end]. It may contain nested
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
350 ;; js--pitem instances. The body of a pitem may be empty: in
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
351 ;; that case, b-end is equal to header-end.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
352 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
353 ;; The three points obey the following relationship:
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
354 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
355 ;; h-begin < h-end <= b-end
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
356 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
357 ;; We put a text property in the buffer on the character *before*
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
358 ;; h-end, and if we see it, on the character *before* b-end.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
359 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
360 ;; The text property for h-end, js--pstate, is actually a list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
361 ;; of all js--pitem instances open after the marked character.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
362 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
363 ;; The text property for b-end, js--pend, is simply the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
364 ;; js--pitem that ends after the marked character. (Because
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
365 ;; pitems always end when the paren-depth drops below a critical
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
366 ;; value, and because we can only drop one level per character, only
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
367 ;; one pitem may end at a given character.)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
368 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
369 ;; In the structure below, we only store h-begin and (sometimes)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
370 ;; b-end. We can trivially and quickly find h-end by going to h-begin
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
371 ;; and searching for an js--pstate text property. Since no other
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
372 ;; js--pitem instances can be nested inside the header of a
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
373 ;; pitem, the location after the character with this text property
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
374 ;; must be h-end.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
375 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
376 ;; js--pitem instances are never modified (with the exception
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
377 ;; of the b-end field). Instead, modified copies are added at subseqnce parse points.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
378 ;; (The exception for b-end and its caveats is described below.)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
379 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
380
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
381 (defstruct (js--pitem (:type list))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
382 ;; IMPORTANT: Do not alter the position of fields within the list.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
383 ;; Various bits of code depend on their positions, particularly
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
384 ;; anything that manipulates the list of children.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
385
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
386 ;; List of children inside this pitem's body
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
387 (children nil :read-only t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
388
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
389 ;; When we reach this paren depth after h-end, the pitem ends
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
390 (paren-depth nil :read-only t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
391
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
392 ;; Symbol or class-style plist if this is a class
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
393 (type nil :read-only t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
394
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
395 ;; See above
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
396 (h-begin nil :read-only t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
397
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
398 ;; List of strings giving the parts of the name of this pitem (e.g.,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
399 ;; '("MyClass" "myMethod"), or t if this pitem is anonymous
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
400 (name nil :read-only t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
401
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
402 ;; THIS FIELD IS MUTATED, and its value is shared by all copies of
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
403 ;; this pitem: when we copy-and-modify pitem instances, we share
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
404 ;; their tail structures, so all the copies actually have the same
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
405 ;; terminating cons cell. We modify that shared cons cell directly.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
406 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
407 ;; The field value is either a number (buffer location) or nil if
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
408 ;; unknown.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
409 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
410 ;; If the field's value is greater than `js--cache-end', the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
411 ;; value is stale and must be treated as if it were nil. Conversely,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
412 ;; if this field is nil, it is guaranteed that this pitem is open up
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
413 ;; to at least `js--cache-end'. (This property is handy when
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
414 ;; computing whether we're inside a given pitem.)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
415 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
416 (b-end nil))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
417
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
418 (defconst js--initial-pitem
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
419 (make-js--pitem
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
420 :paren-depth most-negative-fixnum
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
421 :type 'toplevel)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
422
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
423 "The pitem we start parsing with")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
424
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
425 ;;; User Customization
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
426
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
427 (defgroup js nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
428 "Customization variables for `js-mode'."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
429 :tag "JavaScript"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
430 :group 'languages)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
431
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
432 (defcustom js-indent-level 4
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
433 "Number of spaces for each indentation step."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
434 :type 'integer
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
435 :group 'js)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
436
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
437 (defcustom js-expr-indent-offset 0
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
438 "Number of additional spaces used for indentation of continued
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
439 expressions. The value must be no less than minus
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
440 `js-indent-level'."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
441 :type 'integer
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
442 :group 'js)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
443
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
444 (defcustom js-auto-indent-flag t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
445 "Automatic indentation with punctuation characters. If non-nil, the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
446 current line is indented when certain punctuations are inserted."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
447 :type 'boolean
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
448 :group 'js)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
449
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
450 (defcustom js-flat-functions nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
451 "Treat nested functions as if they were top-level functions for
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
452 function movement, marking, and so on."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
453 :type 'boolean
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
454 :group 'js)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
455
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
456 (defcustom js-comment-lineup-func #'c-lineup-C-comments
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
457 "cc-mode-style lineup function for C comments"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
458 :type 'function
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
459 :group 'js)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
460
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
461 (defcustom js-enabled-frameworks js--available-frameworks
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
462 "Select which frameworks js-mode will recognize.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
463
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
464 Turn off some frameworks you seldom use to improve performance.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
465 The set of recognized frameworks can also be overriden on a
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
466 per-buffer basis."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
467 :type (cons 'set (mapcar (lambda (x)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
468 (list 'const x))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
469 js--available-frameworks))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
470 :group 'js)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
471
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
472 (defcustom js-js-switch-tabs
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
473 (and (memq system-type '(darwin)) t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
474 "Non-nil if Emacs should display tabs while selecting them.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
475 Useful only if the windowing system has a good mechanism for
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
476 preventing Firefox from stealing the keyboard focus."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
477 :type 'boolean
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
478 :group 'js)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
479
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
480 (defcustom js-js-tmpdir
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
481 "~/.emacs.d/js/js"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
482 "Temporary directory used for communicating with Mozilla. It
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
483 must be readable and writable by both Mozilla and Emacs."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
484 :type 'directory
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
485 :group 'js)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
486
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
487 (defcustom js-js-timeout 5
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
488 "Wait this many seconds for a reply from Mozilla when executing
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
489 commands. Increase this value if you are getting timeout
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
490 messages."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
491 :type 'integer
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
492 :group 'js)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
493
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
494 ;;; KeyMap
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
495
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
496 (defvar js-mode-map
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
497 (let ((keymap (make-sparse-keymap)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
498 (mapc (lambda (key)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
499 (define-key keymap key #'js-insert-and-indent))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
500 '("+" "-" "*" "{" "}" "(" ")" ":" ";" ","))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
501 (define-key keymap [(control ?c) (meta ?:)] #'js-eval)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
502 (define-key keymap [(control ?c) (control ?j)] #'js-set-js-context)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
503 (define-key keymap [(control meta ?x)] #'js-eval-defun)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
504 (define-key keymap [(meta ?.)] #'js-find-symbol)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
505
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
506 (easy-menu-define nil keymap "Javascript Menu"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
507 '("Javascript"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
508 ["Select new Mozilla context…" js-set-js-context
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
509 (fboundp #'inferior-moz-process)]
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
510 ["Evaluate expression in Mozilla context…" js-eval
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
511 (fboundp #'inferior-moz-process)]
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
512 ["Send current function to Mozilla…" js-eval-defun
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
513 (fboundp #'inferior-moz-process)]
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
514 )
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
515 )
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
516
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
517 keymap)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
518 "Keymap for js-mode")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
519
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
520 (defun js-insert-and-indent (key)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
521 "Runs the command bound to KEY in the global keymap, and if
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
522 we're not in a string or comment, indents the current line."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
523 (interactive (list (this-command-keys)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
524 (call-interactively (lookup-key (current-global-map) key))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
525 (let ((syntax (save-restriction (widen) (syntax-ppss))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
526 (when (or (and (not (nth 8 syntax))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
527 js-auto-indent-flag)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
528 (and (nth 4 syntax)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
529 (eq (current-column)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
530 (1+ (current-indentation)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
531
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
532 (indent-according-to-mode))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
533
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
534 ;;; Syntax table and parsing
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
535
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
536 (defvar js-mode-syntax-table
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
537 (let ((table (make-syntax-table)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
538 (c-populate-syntax-table table)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
539 (modify-syntax-entry ?$ "_" table)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
540 table)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
541 "Syntax table used in JS mode.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
542
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
543 (defvar js--quick-match-re nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
544 "Autogenerated regular expression to match buffer constructs")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
545
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
546 (defvar js--quick-match-re-func nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
547 "Autogenerated regular expression to match buffer constructs
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
548 and functions")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
549
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
550 (make-variable-buffer-local 'js--quick-match-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
551 (make-variable-buffer-local 'js--quick-match-re-func)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
552
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
553 (defvar js--cache-end 1
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
554 "Last place in the buffer the function cache is valid")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
555 (make-variable-buffer-local 'js--cache-end)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
556
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
557 (defvar js--last-parse-pos nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
558 "Last place we parsed up to in js--ensure-cache")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
559 (make-variable-buffer-local 'js--last-parse-pos)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
560
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
561 (defvar js--state-at-last-parse-pos nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
562 "pstate at js--last-parse-pos")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
563 (make-variable-buffer-local 'js--state-at-last-parse-pos)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
564
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
565 (defun js--flatten-list (list)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
566 (loop for item in list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
567 nconc (cond ((consp item)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
568 (js--flatten-list item))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
569
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
570 (item (list item)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
571
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
572 (defun js--maybe-join (prefix separator suffix &rest list)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
573 "If LIST contains any element that is not nil, return its
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
574 non-nil elements, separated by SEPARATOR, prefixed by PREFIX, and
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
575 ended with SUFFIX as with `concat'. Otherwise, if LIST is empty,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
576 return nil. If any element in LIST is itself a list, flatten that
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
577 element."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
578 (setq list (js--flatten-list list))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
579 (when list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
580 (concat prefix (mapconcat #'identity list separator) suffix)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
581
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
582 (defun js--update-quick-match-re ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
583 "Update js--quick-match-re based on the current set of
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
584 enabled frameworks"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
585 (setq js--quick-match-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
586 (js--maybe-join
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
587 "^[ \t]*\\(?:" "\\|" "\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
588
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
589 ;; #define mumble
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
590 "#define[ \t]+[a-zA-Z_]"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
591
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
592 (when (memq 'extjs js-enabled-frameworks)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
593 "Ext\\.extend")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
594
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
595 (when (memq 'prototype js-enabled-frameworks)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
596 "Object\\.extend")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
597
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
598 ;; var mumble = THING (
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
599 (js--maybe-join
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
600 "\\(?:var[ \t]+\\)?[a-zA-Z_$0-9.]+[ \t]*=[ \t]*\\(?:"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
601 "\\|"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
602 "\\)[ \t]*\("
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
603
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
604 (when (memq 'prototype js-enabled-frameworks)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
605 "Class\\.create")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
606
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
607 (when (memq 'extjs js-enabled-frameworks)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
608 "Ext\\.extend")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
609
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
610 (when (memq 'merrillpress js-enabled-frameworks)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
611 "[a-zA-Z_$0-9]+\\.extend\\(?:Final\\)?"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
612
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
613 (when (memq 'dojo js-enabled-frameworks)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
614 "dojo\\.declare[ \t]*\(")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
615
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
616 (when (memq 'mochikit js-enabled-frameworks)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
617 "MochiKit\\.Base\\.update[ \t]*\(")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
618
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
619 ;; mumble.prototypeTHING
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
620 (js--maybe-join
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
621 "[a-zA-Z_$0-9.]+\\.prototype\\(?:" "\\|" "\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
622
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
623 (when (memq 'javascript js-enabled-frameworks)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
624 '( ;; foo.prototype.bar = function(
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
625 "\\.[a-zA-Z_$0-9]+[ \t]*=[ \t]*function[ \t]*\("
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
626
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
627 ;; mumble.prototype = {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
628 "[ \t]*=[ \t]*{")))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
629
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
630 (setq js--quick-match-re-func
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
631 (concat "function\\|" js--quick-match-re)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
632
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
633 (defun js--forward-text-property (propname)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
634 "Move over the next value of PROPNAME in the buffer. If found,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
635 return that value and leave point after the character having that
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
636 value, otherwise return nil and leave point at EOB."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
637 (let ((next-value (get-text-property (point) propname)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
638 (if next-value
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
639 (forward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
640
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
641 (goto-char (next-single-property-change
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
642 (point) propname nil (point-max)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
643 (unless (eobp)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
644 (setq next-value (get-text-property (point) propname))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
645 (forward-char)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
646
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
647 next-value))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
648
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
649 (defun js--backward-text-property (propname)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
650 "Move over the previous value of PROPNAME in the buffer. If found,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
651 return that value and leave point just before the character that
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
652 has that value, otherwise return nil and leave point at BOB."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
653 (unless (bobp)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
654 (let ((prev-value (get-text-property (1- (point)) propname)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
655 (if prev-value
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
656 (backward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
657
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
658 (goto-char (previous-single-property-change
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
659 (point) propname nil (point-min)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
660
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
661 (unless (bobp)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
662 (backward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
663 (setq prev-value (get-text-property (point) propname))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
664
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
665 prev-value)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
666
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
667 (defsubst js--forward-pstate ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
668 (js--forward-text-property 'js--pstate))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
669
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
670 (defsubst js--backward-pstate ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
671 (js--backward-text-property 'js--pstate))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
672
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
673 (defun js--pitem-goto-h-end (pitem)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
674 (goto-char (js--pitem-h-begin pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
675 (js--forward-pstate))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
676
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
677 (defun js--re-search-forward-inner (regexp &optional bound count)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
678 "Auxiliary function for `js--re-search-forward'."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
679 (let ((parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
680 str-terminator
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
681 (orig-macro-end (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
682 (when (js--beginning-of-macro)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
683 (c-end-of-macro)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
684 (point)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
685 (while (> count 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
686 (re-search-forward regexp bound)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
687 (setq parse (syntax-ppss))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
688 (cond ((setq str-terminator (nth 3 parse))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
689 (when (eq str-terminator t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
690 (setq str-terminator ?/))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
691 (re-search-forward
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
692 (concat "\\([^\\]\\|^\\)" (string str-terminator))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
693 (save-excursion (end-of-line) (point)) t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
694 ((nth 7 parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
695 (forward-line))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
696 ((or (nth 4 parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
697 (and (eq (char-before) ?\/) (eq (char-after) ?\*)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
698 (re-search-forward "\\*/"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
699 ((and (not (and orig-macro-end
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
700 (<= (point) orig-macro-end)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
701 (js--beginning-of-macro))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
702 (c-end-of-macro))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
703 (t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
704 (setq count (1- count))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
705 (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
706
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
707
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
708 (defun js--re-search-forward (regexp &optional bound noerror count)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
709 "Search forward but ignore strings, cpp macros, and comments.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
710 Invokes `re-search-forward' but treats the buffer as if strings,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
711 cpp macros, and comments have been removed.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
712
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
713 If invoked while inside a macro, treat the contents of the macro
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
714 as normal text.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
715
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
716 "
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
717 (let ((saved-point (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
718 (search-expr
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
719 (cond ((null count)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
720 '(js--re-search-forward-inner regexp bound 1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
721 ((< count 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
722 '(js--re-search-backward-inner regexp bound (- count)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
723 ((> count 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
724 '(js--re-search-forward-inner regexp bound count)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
725 (condition-case err
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
726 (eval search-expr)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
727 (search-failed
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
728 (goto-char saved-point)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
729 (unless noerror
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
730 (error (error-message-string err)))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
731
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
732
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
733 (defun js--re-search-backward-inner (regexp &optional bound count)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
734 "Auxiliary function for `js--re-search-backward'."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
735 (let ((parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
736 str-terminator
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
737 (orig-macro-start
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
738 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
739 (and (js--beginning-of-macro)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
740 (point)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
741 (while (> count 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
742 (re-search-backward regexp bound)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
743 (when (and (> (point) (point-min))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
744 (save-excursion (backward-char) (looking-at "/[/*]")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
745 (forward-char))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
746 (setq parse (syntax-ppss))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
747 (cond ((setq str-terminator (nth 3 parse))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
748 (when (eq str-terminator t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
749 (setq str-terminator ?/))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
750 (re-search-backward
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
751 (concat "\\([^\\]\\|^\\)" (string str-terminator))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
752 (save-excursion (beginning-of-line) (point)) t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
753 ((nth 7 parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
754 (goto-char (nth 8 parse)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
755 ((or (nth 4 parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
756 (and (eq (char-before) ?/) (eq (char-after) ?*)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
757 (re-search-backward "/\\*"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
758 ((and (not (and orig-macro-start
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
759 (>= (point) orig-macro-start)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
760 (js--beginning-of-macro)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
761 (t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
762 (setq count (1- count))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
763 (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
764
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
765
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
766 (defun js--re-search-backward (regexp &optional bound noerror count)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
767 "Search backward but ignore strings, preprocessor macros, and
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
768 comments. Invokes `re-search-backward' but treats the buffer as
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
769 if strings, preprocessor macros, and comments have been removed.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
770
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
771 If inside a macro when called, treat the macro as normal text.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
772 "
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
773 (let ((saved-point (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
774 (search-expr
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
775 (cond ((null count)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
776 '(js--re-search-backward-inner regexp bound 1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
777 ((< count 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
778 '(js--re-search-forward-inner regexp bound (- count)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
779 ((> count 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
780 '(js--re-search-backward-inner regexp bound count)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
781 (condition-case err
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
782 (eval search-expr)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
783 (search-failed
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
784 (goto-char saved-point)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
785 (unless noerror
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
786 (error (error-message-string err)))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
787
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
788 (defun js--forward-expression ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
789 "Move forward over a whole expression. Doesn't move over
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
790 expressions continued across lines, but we don't actually care"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
791 (loop
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
792 ;; non-continued case; simplistic, but good enough?
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
793 do (loop until (or (eolp)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
794 (progn
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
795 (forward-comment most-positive-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
796 (memq (char-after) '(?\, ?\; ?\] ?\) ?\}))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
797 do (forward-sexp))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
798
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
799 while (and (eq (char-after) ?\n)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
800 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
801 (forward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
802 (js--continued-expression-p)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
803
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
804 (defun js--forward-function-decl ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
805 "Move forward over a function declaration with point at the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
806 'function' keyword. Return non-nil if this is a
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
807 syntactically-correct non-expression function, nil otherwise.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
808 Specifically, return the name of the function, or t if the name
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
809 could not be determined."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
810 (assert (looking-at "\\_<function\\_>"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
811 (let ((name t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
812 (forward-word)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
813 (forward-comment most-positive-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
814 (when (looking-at js--name-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
815 (setq name (match-string-no-properties 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
816 (goto-char (match-end 0)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
817 (forward-comment most-positive-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
818 (and (eq (char-after) ?\( )
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
819 (ignore-errors (forward-list) t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
820 (progn (forward-comment most-positive-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
821 (and (eq (char-after) ?{)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
822 name)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
823
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
824 (defun js--function-prologue-beginning (&optional pos)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
825 "Return the start of the function prologue that contains POS,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
826 or nil if we're not in a function prologue. A function prologue
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
827 is everything from start of the definition up to and including
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
828 the opening brace. POS defaults to point."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
829
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
830 (let (prologue-begin)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
831 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
832 (if pos
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
833 (goto-char pos)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
834 (setq pos (point)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
835
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
836 (when (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
837 (forward-line 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
838 (or (looking-at js--function-heading-2-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
839 (looking-at js--function-heading-3-re)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
840
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
841 (setq prologue-begin (match-beginning 1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
842 (when (<= prologue-begin pos)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
843 (goto-char (match-end 0))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
844
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
845 (skip-syntax-backward "w_")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
846 (and (or (looking-at "\\_<function\\_>")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
847 (js--re-search-backward "\\_<function\\_>" nil t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
848
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
849 (save-match-data (goto-char (match-beginning 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
850 (js--forward-function-decl))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
851
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
852 (<= pos (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
853 (or prologue-begin (match-beginning 0))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
854
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
855 (defun js--beginning-of-defun-raw ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
856 "Internal helper for js--beginning-of-defun. Go to
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
857 previous defun-beginning and return the parse state for it, or
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
858 nil if we went all the way back to bob and don't find anything."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
859 (js--ensure-cache)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
860 (let (pstate)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
861 (while (and (setq pstate (js--backward-pstate))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
862 (not (eq 'function (js--pitem-type (car pstate))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
863 (and (not (bobp)) pstate)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
864
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
865 (defun js--pstate-is-toplevel-defun (pstate)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
866 "If PSTATE represents a non-empty top-level defun, return the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
867 top-most pitem. Otherwise, return nil."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
868 (loop for pitem in pstate
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
869 with func-depth = 0
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
870 with func-pitem
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
871 if (eq 'function (js--pitem-type pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
872 do (incf func-depth)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
873 and do (setq func-pitem pitem)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
874 finally return (if (eq func-depth 1) func-pitem)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
875
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
876 (defun js--beginning-of-defun-nested ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
877 "Internal helper for js--beginning-of-defun. Returns the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
878 pitem of the function we went to the beginning of."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
879
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
880 (or
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
881 ;; Look for the smallest function that encloses point...
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
882 (loop for pitem in (js--parse-state-at-point)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
883 if (and (eq 'function (js--pitem-type pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
884 (js--inside-pitem-p pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
885 do (goto-char (js--pitem-h-begin pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
886 and return pitem)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
887
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
888 ;; ...and if that isn't found, look for the previous top-level
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
889 ;; defun
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
890 (loop for pstate = (js--backward-pstate)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
891 while pstate
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
892 if (js--pstate-is-toplevel-defun pstate)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
893 do (goto-char (js--pitem-h-begin it))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
894 and return it)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
895
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
896 (defun js--beginning-of-defun-flat ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
897 "Internal helper for js--beginning-of-defun"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
898
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
899 (let ((pstate (js--beginning-of-defun-raw)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
900 (when pstate
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
901 (goto-char (js--pitem-h-begin (car pstate))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
902
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
903 (defun js--beginning-of-defun (&optional arg)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
904 "Used as beginning-of-defun-function"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
905
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
906 (setq arg (or arg 1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
907 (while (and (not (eobp)) (< arg 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
908 (incf arg)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
909 (when (and (not js-flat-functions)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
910 (or (eq (js-syntactic-context) 'function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
911 (js--function-prologue-beginning)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
912 (js--end-of-defun))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
913
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
914 (if (js--re-search-forward
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
915 "\\_<function\\_>" nil t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
916 (goto-char (js--function-prologue-beginning))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
917 (goto-char (point-max))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
918
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
919 (while (> arg 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
920 (decf arg)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
921 ;; If we're just past the end of a function, the user probably wants
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
922 ;; to go to the beginning of *that* function
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
923 (when (eq (char-before) ?})
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
924 (backward-char))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
925
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
926 (let ((prologue-begin (js--function-prologue-beginning)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
927 (cond ((and prologue-begin (< prologue-begin (point)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
928 (goto-char prologue-begin))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
929
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
930 (js-flat-functions
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
931 (js--beginning-of-defun-flat))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
932 (t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
933 (js--beginning-of-defun-nested))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
934
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
935 (defun js--flush-caches (&optional beg ignored)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
936 "Flush syntax cache info after position BEG. BEG defaults to
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
937 point-min, flushing the entire cache."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
938 (interactive)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
939 (setq beg (or beg (save-restriction (widen) (point-min))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
940 (setq js--cache-end (min js--cache-end beg)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
941
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
942 (defmacro js--debug (&rest arguments)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
943 ;; `(message ,@arguments)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
944 )
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
945
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
946 (defun js--ensure-cache--pop-if-ended (open-items paren-depth)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
947 (let ((top-item (car open-items)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
948 (when (<= paren-depth (js--pitem-paren-depth top-item))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
949 (assert (not (get-text-property (1- (point)) 'js-pend)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
950 (put-text-property (1- (point)) (point) 'js--pend top-item)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
951 (setf (js--pitem-b-end top-item) (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
952 (setq open-items
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
953 ;; open-items must contain at least two items for this to
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
954 ;; work, but because we push a dummy item to start with,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
955 ;; that assumption holds.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
956 (cons (js--pitem-add-child (second open-items) top-item)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
957 (cddr open-items)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
958
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
959 open-items)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
960
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
961 (defmacro js--ensure-cache--update-parse ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
962 "Helper for use inside js--ensure-cache. Updates parsing
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
963 information up to point. Refers to parse, prev-parse-point,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
964 goal-point, and open-items bound lexically in the body of
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
965 `js--ensure-cache'."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
966 `(progn
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
967 (setq goal-point (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
968 (goto-char prev-parse-point)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
969 (while (progn
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
970 (setq open-items (js--ensure-cache--pop-if-ended
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
971 open-items (car parse)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
972 ;; Make sure parse-partial-sexp doesn't stop because we *entered*
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
973 ;; the given depth -- i.e., make sure we're deeper than the target
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
974 ;; depth.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
975 (assert (> (nth 0 parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
976 (js--pitem-paren-depth (car open-items))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
977 (setq parse (parse-partial-sexp
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
978 prev-parse-point goal-point
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
979 (js--pitem-paren-depth (car open-items))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
980 nil parse))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
981
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
982 ;; (let ((overlay (make-overlay prev-parse-point (point))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
983 ;; (overlay-put overlay 'face '(:background "red"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
984 ;; (unwind-protect
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
985 ;; (progn
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
986 ;; (js--debug "parsed: %S" parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
987 ;; (sit-for 1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
988 ;; (delete-overlay overlay)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
989
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
990 (setq prev-parse-point (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
991 (< (point) goal-point)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
992
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
993 (setq open-items (js--ensure-cache--pop-if-ended
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
994 open-items (car parse)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
995
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
996 (defun js--show-cache-at-point ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
997 (interactive)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
998 (require 'pp)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
999 (let ((prop (get-text-property (point) 'js--pstate)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1000 (with-output-to-temp-buffer "*Help*"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1001 (pp prop))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1002
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1003 (defun js--split-name (string)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1004 "Splits a name into its dot-separated parts. Also removes any
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1005 prototype parts from the split name (unless the name is just
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1006 \"prototype\" to start with, that is)."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1007 (let ((name (save-match-data
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1008 (split-string string "\\." t))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1009 (unless (and (= (length name) 1)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1010 (equal (car name) "prototype"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1011
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1012 (setq name (remove "prototype" name)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1013
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1014 (defvar js--guess-function-name-start nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1015 "Secondary out-variable for js--guess-function-name")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1016
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1017 (defun js--guess-function-name (position)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1018 "Guess the name of the function at POSITION, which should be
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1019 the just after the end of the word 'function'. Return the name of
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1020 the function or nil if the name could not be guessed. Clobbers
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1021 match data. If in guessing the function name we find the preamble
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1022 begins earlier than expected, set `js--guess-function-name-start'
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1023 to that position, otherwise set that variable to nil."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1024
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1025 (setq js--guess-function-name-start nil)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1026 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1027 (goto-char position)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1028 (forward-line 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1029 (cond
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1030 ((looking-at js--function-heading-3-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1031 (and (eq (match-end 0) position)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1032 (setq js--guess-function-name-start (match-beginning 1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1033 (match-string-no-properties 1)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1034
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1035 ((looking-at js--function-heading-2-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1036 (and (eq (match-end 0) position)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1037 (setq js--guess-function-name-start (match-beginning 1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1038 (match-string-no-properties 1))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1039
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1040 (defun js--clear-stale-cache ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1041 ;; Clear any endings that occur after point
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1042 (let (end-prop)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1043 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1044 (while (setq end-prop (js--forward-text-property
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1045 'js--pend))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1046 (setf (js--pitem-b-end end-prop) nil))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1047
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1048 ;; Remove any cache properties after this point
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1049 (remove-text-properties (point) (point-max)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1050 '(js--pstate t js--pend t)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1051
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1052 (defun js--ensure-cache (&optional limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1053 "Ensures brace cache is valid up to the character before LIMIT.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1054 LIMIT defaults to point."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1055 (setq limit (or limit (point)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1056 (when (< js--cache-end limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1057
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1058 (c-save-buffer-state
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1059 (open-items
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1060 orig-match-start
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1061 orig-match-end
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1062 orig-depth
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1063 parse
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1064 prev-parse-point
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1065 name
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1066 case-fold-search
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1067 filtered-class-styles
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1068 new-item
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1069 goal-point
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1070 end-prop)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1071
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1072 ;; Figure out which class styles we need to look for
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1073 (setq filtered-class-styles
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1074 (loop for style in js--class-styles
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1075 if (memq (plist-get style :framework)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1076 js-enabled-frameworks)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1077 collect style))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1078
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1079 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1080 (save-restriction
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1081 (widen)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1082
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1083 ;; Find last known good position
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1084 (goto-char js--cache-end)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1085 (unless (bobp)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1086 (setq open-items (get-text-property
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1087 (1- (point)) 'js--pstate))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1088
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1089 (unless open-items
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1090 (goto-char (previous-single-property-change
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1091 (point) 'js--pstate nil (point-min)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1092
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1093 (unless (bobp)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1094 (setq open-items (get-text-property (1- (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1095 'js--pstate))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1096 (assert open-items))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1097
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1098 (unless open-items
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1099 ;; Make a placeholder for the top-level definition
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1100 (setq open-items (list js--initial-pitem)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1101
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1102 (setq parse (syntax-ppss))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1103 (setq prev-parse-point (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1104
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1105 (js--clear-stale-cache)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1106
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1107 (narrow-to-region (point-min) limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1108
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1109 (loop while (re-search-forward js--quick-match-re-func nil t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1110 for orig-match-start = (goto-char (match-beginning 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1111 for orig-match-end = (match-end 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1112 do (js--ensure-cache--update-parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1113 for orig-depth = (nth 0 parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1114
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1115 ;; Each of these conditions should return non-nil if
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1116 ;; we should add a new item and leave point at the end
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1117 ;; of the new item's header (h-end in the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1118 ;; js--pitem diagram). This point is the one
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1119 ;; after the last character we need to unambiguously
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1120 ;; detect this construct. If one of these evaluates to
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1121 ;; nil, the location of the point is ignored.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1122 if (cond
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1123 ;; In comment or string
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1124 ((nth 8 parse) nil)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1125
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1126 ;; Regular function declaration
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1127 ((and (looking-at "\\_<function\\_>")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1128 (setq name (js--forward-function-decl)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1129
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1130 (when (eq name t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1131 (setq name (js--guess-function-name orig-match-end))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1132 (if name
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1133 (when js--guess-function-name-start
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1134 (setq orig-match-start
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1135 js--guess-function-name-start))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1136
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1137 (setq name t)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1138
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1139 (assert (eq (char-after) ?{))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1140 (forward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1141 (make-js--pitem
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1142 :paren-depth orig-depth
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1143 :h-begin orig-match-start
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1144 :type 'function
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1145 :name (if (eq name t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1146 name
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1147 (js--split-name name))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1148
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1149 ;; Macro
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1150 ((looking-at js--macro-decl-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1151
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1152 ;; Macros often contain unbalanced parentheses.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1153 ;; Make sure that h-end is at the textual end of
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1154 ;; the macro no matter what the parenthesis say.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1155 (c-end-of-macro)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1156 (js--ensure-cache--update-parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1157
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1158 (make-js--pitem
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1159 :paren-depth (nth 0 parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1160 :h-begin orig-match-start
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1161 :type 'macro
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1162 :name (list (match-string-no-properties 1))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1163
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1164 ;; "Prototype function" declaration
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1165 ((looking-at js--plain-method-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1166 (goto-char (match-beginning 3))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1167 (when (save-match-data
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1168 (js--forward-function-decl))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1169 (forward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1170 (make-js--pitem
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1171 :paren-depth orig-depth
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1172 :h-begin orig-match-start
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1173 :type 'function
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1174 :name (nconc (js--split-name
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1175 (match-string-no-properties 1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1176 (list (match-string-no-properties 2))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1177
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1178 ;; Class definition
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1179 ((loop with syntactic-context =
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1180 (js--syntactic-context-from-pstate open-items)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1181 for class-style in filtered-class-styles
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1182 if (and (memq syntactic-context
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1183 (plist-get class-style :contexts))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1184 (looking-at (plist-get class-style
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1185 :class-decl)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1186 do (goto-char (match-end 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1187 and return
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1188 (make-js--pitem
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1189 :paren-depth orig-depth
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1190 :h-begin orig-match-start
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1191 :type class-style
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1192 :name (js--split-name
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1193 (match-string-no-properties 1))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1194
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1195 do (js--ensure-cache--update-parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1196 and do (push it open-items)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1197 and do (put-text-property
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1198 (1- (point)) (point) 'js--pstate open-items)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1199 else do (goto-char orig-match-end))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1200
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1201 (goto-char limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1202 (js--ensure-cache--update-parse)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1203 (setq js--cache-end limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1204 (setq js--last-parse-pos limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1205 (setq js--state-at-last-parse-pos open-items)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1206 )))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1207
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1208 (defun js--end-of-defun-flat ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1209 "Internal helper for js--end-of-defun"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1210 (loop while (js--re-search-forward "}" nil t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1211 do (js--ensure-cache)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1212 if (get-text-property (1- (point)) 'js--pend)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1213 if (eq 'function (js--pitem-type it))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1214 return t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1215 finally do (goto-char (point-max))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1216
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1217 (defun js--end-of-defun-nested ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1218 "Internal helper for js--end-of-defun"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1219 (message "test")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1220 (let* (pitem
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1221 (this-end (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1222 (and (setq pitem (js--beginning-of-defun-nested))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1223 (js--pitem-goto-h-end pitem)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1224 (progn (backward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1225 (forward-list)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1226 (point)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1227 found)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1228
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1229 (if (and this-end (< (point) this-end))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1230 ;; We're already inside a function; just go to its end.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1231 (goto-char this-end)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1232
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1233 ;; Otherwise, go to the end of the next function...
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1234 (while (and (js--re-search-forward "\\_<function\\_>" nil t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1235 (not (setq found (progn
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1236 (goto-char (match-beginning 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1237 (js--forward-function-decl))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1238
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1239 (if found (forward-list)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1240 ;; ... or eob.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1241 (goto-char (point-max))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1242
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1243 (defun js--end-of-defun (&optional arg)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1244 "Used as end-of-defun-function"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1245 (setq arg (or arg 1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1246 (while (and (not (bobp)) (< arg 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1247 (let (orig-pos (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1248 (incf arg)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1249 (js--beginning-of-defun)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1250 (js--beginning-of-defun)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1251 (unless (bobp)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1252 (js--end-of-defun))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1253
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1254 (while (> arg 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1255 (decf arg)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1256 ;; look for function backward. if we're inside it, go to that
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1257 ;; function's end. otherwise, search for the next function's end and
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1258 ;; go there
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1259 (if js-flat-functions
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1260 (js--end-of-defun-flat)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1261
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1262 ;; if we're doing nested functions, see whether we're in the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1263 ;; prologue. If we are, go to the end of the function; otherwise,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1264 ;; call js--end-of-defun-nested to do the real work
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1265 (let ((prologue-begin (js--function-prologue-beginning)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1266 (cond ((and prologue-begin (<= prologue-begin (point)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1267 (goto-char prologue-begin)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1268 (re-search-forward "\\_<function")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1269 (goto-char (match-beginning 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1270 (js--forward-function-decl)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1271 (forward-list))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1272
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1273 (t (js--end-of-defun-nested)))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1274
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1275 (defun js--beginning-of-macro (&optional lim)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1276 (let ((here (point)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1277 (save-restriction
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1278 (if lim (narrow-to-region lim (point-max)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1279 (beginning-of-line)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1280 (while (eq (char-before (1- (point))) ?\\)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1281 (forward-line -1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1282 (back-to-indentation)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1283 (if (and (<= (point) here)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1284 (looking-at js--opt-cpp-start))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1285 t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1286 (goto-char here)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1287 nil))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1288
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1289 (defun js--backward-syntactic-ws (&optional lim)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1290 "Simple implementation of `c-backward-syntactic-ws'"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1291 (save-restriction
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1292 (when lim (narrow-to-region lim (point-max)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1293
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1294 (let ((in-macro (save-excursion (js--beginning-of-macro)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1295 (pos (point)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1296
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1297 (while (progn (unless in-macro (js--beginning-of-macro))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1298 (forward-comment most-negative-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1299 (/= (point)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1300 (prog1
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1301 pos
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1302 (setq pos (point)))))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1303
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1304 (defun js--forward-syntactic-ws (&optional lim)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1305 "Simple implementation of `c-forward-syntactic-ws'"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1306 (save-restriction
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1307 (when lim (narrow-to-region (point-min) lim))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1308 (let ((pos (point)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1309 (while (progn
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1310 (forward-comment most-positive-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1311 (when (eq (char-after) ?#)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1312 (c-end-of-macro))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1313 (/= (point)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1314 (prog1
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1315 pos
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1316 (setq pos (point)))))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1317
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1318 (defun js--up-nearby-list ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1319 "Like (up-list -1), but only considers lists that end nearby"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1320 (save-restriction
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1321 ;; Look at a very small region so our compuation time doesn't
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1322 ;; explode in pathological cases.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1323 (narrow-to-region (max (point-min) (- (point) 500)) (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1324 (up-list -1)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1325
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1326 (defun js--inside-param-list-p ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1327 "Return non-nil iff point is inside a function parameter list."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1328 (ignore-errors
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1329 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1330 (js--up-nearby-list)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1331 (and (looking-at "(")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1332 (progn (forward-symbol -1)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1333 (or (looking-at "function")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1334 (progn (forward-symbol -1)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1335 (looking-at "function"))))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1336
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1337 (defun js--inside-dojo-class-list-p ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1338 "Return non-nil iff point is inside a Dojo multiple-inheritance
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1339 class block."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1340 (ignore-errors
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1341 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1342 (js--up-nearby-list)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1343 (let ((list-begin (point)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1344 (forward-line 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1345 (and (looking-at js--dojo-class-decl-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1346 (goto-char (match-end 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1347 (looking-at "\"\\s-*,\\s-*\\[")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1348 (eq (match-end 0) (1+ list-begin)))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1349
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1350 (defun js--syntax-begin-function ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1351 (when (< js--cache-end (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1352 (goto-char (max (point-min) js--cache-end)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1353
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1354 (let ((pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1355 (while (and (setq pitem (car (js--backward-pstate)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1356 (not (eq 0 (js--pitem-paren-depth pitem)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1357
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1358 (when pitem
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1359 (goto-char (js--pitem-h-begin pitem )))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1360
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1361 ;;; Font Lock
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1362 (defun js--make-framework-matcher (framework &rest regexps)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1363 "Create a byte-compiled function that only matches the given
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1364 regular expressions (that concatenation of REGEXPS) if FRAMEWORK
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1365 is in js-enabled-frameworks"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1366
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1367 (setq regexps (apply #'concat regexps))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1368 (byte-compile
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1369 `(lambda (limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1370 (when (memq (quote ,framework) js-enabled-frameworks)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1371 (re-search-forward ,regexps limit t)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1372
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1373 (defvar js--tmp-location nil)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1374 (make-variable-buffer-local 'js--tmp-location)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1375
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1376 (defun js--forward-destructuring-spec (&optional func)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1377 "Move forward over a destructuring spec. If FUNC is supplied,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1378 call it with no arguments before every variable name in the spec.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1379 Return true iff this was actually a spec. FUNC must preserve the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1380 match data."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1381
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1382 (case (char-after)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1383 (?\[
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1384 (forward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1385 (while
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1386 (progn
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1387 (forward-comment most-positive-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1388 (cond ((memq (char-after) '(?\[ ?\{))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1389 (js--forward-destructuring-spec func))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1390
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1391 ((eq (char-after) ?,)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1392 (forward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1393 t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1394
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1395 ((looking-at js--name-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1396 (and func (funcall func))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1397 (goto-char (match-end 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1398 t))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1399 (when (eq (char-after) ?\])
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1400 (forward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1401 t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1402
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1403 (?\{
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1404 (forward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1405 (forward-comment most-positive-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1406 (while
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1407 (when (looking-at js--objfield-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1408 (goto-char (match-end 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1409 (forward-comment most-positive-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1410 (and (cond ((memq (char-after) '(?\[ ?\{))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1411 (js--forward-destructuring-spec func))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1412 ((looking-at js--name-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1413 (and func (funcall func))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1414 (goto-char (match-end 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1415 t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1416 (progn (forward-comment most-positive-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1417 (when (eq (char-after) ?\,)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1418 (forward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1419 (forward-comment most-positive-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1420 t)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1421 (when (eq (char-after) ?\})
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1422 (forward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1423 t))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1424
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1425 (defun js--variable-decl-matcher (limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1426 "Font-lock matcher for variable names in a variable
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1427 declaration. This is a cc-mode-style matcher that *always* fails,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1428 from the point of view of font-lock. It applies highlighting
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1429 directly with `font-lock-apply-higlight'."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1430
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1431 (condition-case nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1432 (save-restriction
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1433 (narrow-to-region (point-min) limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1434
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1435 (let ((first t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1436 (forward-comment most-positive-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1437 (while
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1438 (and (or first
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1439 (when (eq (char-after) ?,)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1440 (forward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1441 (forward-comment most-positive-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1442 t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1443 (cond ((looking-at js--name-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1444 (font-lock-apply-highlight
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1445 '(0 font-lock-variable-name-face))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1446 (goto-char (match-end 0)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1447
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1448 ((save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1449 (js--forward-destructuring-spec))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1450
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1451 (js--forward-destructuring-spec
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1452 (lambda ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1453 (font-lock-apply-highlight
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1454 '(0 font-lock-variable-name-face)))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1455
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1456 (forward-comment most-positive-fixnum)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1457 (when (eq (char-after) ?=)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1458 (forward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1459 (js--forward-expression)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1460 (forward-comment most-positive-fixnum))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1461
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1462 (setq first nil))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1463
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1464 ;; Conditions to handle
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1465 (scan-error nil)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1466 (end-of-buffer nil))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1467
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1468 ;; Matcher always "fails"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1469 nil)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1470
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1471 (defconst js--font-lock-keywords-3
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1472 `(
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1473 ;; This goes before keywords-2 so it gets used preferentially
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1474 ;; instead of the keywords in keywords-2. Don't use override
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1475 ;; because that will override syntactic fontification too, which
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1476 ;; will fontify commented-out directives as if they weren't
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1477 ;; commented out.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1478 ,@cpp-font-lock-keywords ; from font-lock.el
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1479
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1480 ,@js--font-lock-keywords-2
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1481
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1482 ("\\.\\(prototype\\)\\_>"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1483 (1 font-lock-constant-face))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1484
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1485 ;; Highlights class being declared, in parts
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1486 (js--class-decl-matcher
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1487 ,(concat "\\(" js--name-re "\\)\\(?:\\.\\|.*$\\)")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1488 (goto-char (match-beginning 1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1489 nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1490 (1 font-lock-type-face))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1491
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1492 ;; Highlights parent class, in parts, if available
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1493 (js--class-decl-matcher
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1494 ,(concat "\\(" js--name-re "\\)\\(?:\\.\\|.*$\\)")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1495 (if (match-beginning 2)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1496 (progn
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1497 (setq js--tmp-location (match-end 2))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1498 (goto-char js--tmp-location)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1499 (insert "=")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1500 (goto-char (match-beginning 2)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1501 (setq js--tmp-location nil)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1502 (goto-char (point-at-eol)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1503 (when js--tmp-location
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1504 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1505 (goto-char js--tmp-location)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1506 (delete-char 1)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1507 (1 font-lock-type-face))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1508
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1509 ;; Highlights parent class
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1510 (js--class-decl-matcher
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1511 (2 font-lock-type-face nil t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1512
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1513 ;; Dojo needs its own matcher to override the string highlighting
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1514 (,(js--make-framework-matcher
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1515 'dojo
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1516 "^\\s-*dojo\\.declare\\s-*(\""
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1517 "\\(" js--dotted-name-re "\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1518 "\\(?:\"\\s-*,\\s-*\\(" js--dotted-name-re "\\)\\)?")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1519 (1 font-lock-type-face t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1520 (2 font-lock-type-face nil t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1521
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1522 ;; Match Dojo base classes. Of course Mojo has to be different
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1523 ;; from everything else under the sun...
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1524 (,(js--make-framework-matcher
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1525 'dojo
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1526 "^\\s-*dojo\\.declare\\s-*(\""
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1527 "\\(" js--dotted-name-re "\\)\"\\s-*,\\s-*\\[")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1528 ,(concat "[[,]\\s-*\\(" js--dotted-name-re "\\)\\s-*"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1529 "\\(?:\\].*$\\)?")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1530 (backward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1531 (end-of-line)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1532 (1 font-lock-type-face))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1533
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1534 ;; continued Dojo base-class list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1535 (,(js--make-framework-matcher
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1536 'dojo
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1537 "^\\s-*" js--dotted-name-re "\\s-*[],]")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1538 ,(concat "\\(" js--dotted-name-re "\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1539 "\\s-*\\(?:\\].*$\\)?")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1540 (if (save-excursion (backward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1541 (js--inside-dojo-class-list-p))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1542 (forward-symbol -1)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1543 (end-of-line))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1544 (end-of-line)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1545 (1 font-lock-type-face))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1546
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1547 ;; variable declarations
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1548 ,(list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1549 (concat "\\_<\\(const\\|var\\|let\\)\\_>\\|" js--basic-type-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1550 (list #'js--variable-decl-matcher nil nil nil))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1551
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1552 ;; class instantiation
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1553 ,(list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1554 (concat "\\_<new\\_>\\s-+\\(" js--dotted-name-re "\\)")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1555 (list 1 'font-lock-type-face))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1556
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1557 ;; instanceof
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1558 ,(list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1559 (concat "\\_<instanceof\\_>\\s-+\\(" js--dotted-name-re "\\)")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1560 (list 1 'font-lock-type-face))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1561
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1562 ;; formal parameters
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1563 ,(list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1564 (concat
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1565 "\\_<function\\_>\\(\\s-+" js--name-re "\\)?\\s-*(\\s-*"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1566 js--name-start-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1567 (list (concat "\\(" js--name-re "\\)\\(\\s-*).*\\)?")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1568 '(backward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1569 '(end-of-line)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1570 '(1 font-lock-variable-name-face)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1571
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1572 ;; continued formal parameter list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1573 ,(list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1574 (concat
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1575 "^\\s-*" js--name-re "\\s-*[,)]")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1576 (list js--name-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1577 '(if (save-excursion (backward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1578 (js--inside-param-list-p))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1579 (forward-symbol -1)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1580 (end-of-line))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1581 '(end-of-line)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1582 '(0 font-lock-variable-name-face))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1583
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1584 "Level three font lock.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1585
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1586 (defun js--inside-pitem-p (pitem)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1587 "Return whether point is inside the given pitem's header or body"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1588 (js--ensure-cache)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1589 (assert (js--pitem-h-begin pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1590 (assert (js--pitem-paren-depth pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1591
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1592 (and (> (point) (js--pitem-h-begin pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1593 (or (null (js--pitem-b-end pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1594 (> (js--pitem-b-end pitem) (point)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1595
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1596 (defun js--parse-state-at-point ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1597 "Get a list of js--pitem instances that apply to point,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1598 most specific first. In the worst case, the current toplevel
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1599 instance will be returned."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1600
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1601 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1602 (save-restriction
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1603 (widen)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1604 (js--ensure-cache)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1605 (let* ((bound (if (eobp) (point) (1+ (point))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1606 (pstate (or (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1607 (js--backward-pstate))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1608 (list js--initial-pitem))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1609
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1610 ;; Loop until we either hit a pitem at BOB or pitem ends after
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1611 ;; point (or at point if we're at eob)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1612 (loop for pitem = (car pstate)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1613 until (or (eq (js--pitem-type pitem)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1614 'toplevel)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1615 (js--inside-pitem-p pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1616 do (pop pstate))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1617
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1618 pstate))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1619
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1620 (defun js--syntactic-context-from-pstate (pstate)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1621 "Return the syntactic context corresponding to PSTATE"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1622 (let ((type (js--pitem-type (car pstate))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1623 (cond ((memq type '(function macro))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1624 type)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1625
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1626 ((consp type)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1627 'class)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1628
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1629 (t 'toplevel))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1630
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1631 (defun js-syntactic-context ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1632 "Get the current syntactic context of point. When called
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1633 interatively, also display a message with that context."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1634 (interactive)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1635 (let* ((syntactic-context (js--syntactic-context-from-pstate
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1636 (js--parse-state-at-point))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1637
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1638 (when (interactive-p)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1639 (message "Syntactic context: %s" syntactic-context))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1640
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1641 syntactic-context))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1642
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1643 (defun js--class-decl-matcher (limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1644 "Fontifies according to js--class-styles"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1645 (loop initially (js--ensure-cache limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1646 while (re-search-forward js--quick-match-re limit t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1647 for orig-end = (match-end 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1648 do (goto-char (match-beginning 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1649 if (loop for style in js--class-styles
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1650 for decl-re = (plist-get style :class-decl)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1651 if (and (memq (plist-get style :framework)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1652 js-enabled-frameworks)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1653 (memq (js-syntactic-context)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1654 (plist-get style :contexts))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1655 decl-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1656 (looking-at decl-re))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1657 do (goto-char (match-end 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1658 and return t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1659 return t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1660 else do (goto-char orig-end)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1661
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1662 (defconst js--font-lock-keywords
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1663 '(js--font-lock-keywords-3 js--font-lock-keywords-1
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1664 js--font-lock-keywords-2
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1665 js--font-lock-keywords-3)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1666 "See `font-lock-keywords'.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1667
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1668 ;; XXX: Javascript can continue a regexp literal across lines so long
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1669 ;; as the newline is escaped with \. Account for that in the regexp
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1670 ;; below.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1671 (defconst js--regexp-literal
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1672 "[=(,:]\\(?:\\s-\\|\n\\)*\\(/\\)\\(?:\\\\/\\|[^/*]\\)\\(?:\\\\/\\|[^/]\\)*\\(/\\)"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1673 "Match a regular expression literal. Match groups 1 and 2 are
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1674 the characters forming the beginning and end of the literal")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1675
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1676 ;; we want to match regular expressions only at the beginning of
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1677 ;; expressions
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1678 (defconst js--font-lock-syntactic-keywords
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1679 `((,js--regexp-literal (1 "|") (2 "|")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1680 "Highlighting of regular expressions. See also the variable
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1681 `font-lock-keywords'.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1682
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1683 ;;; Indentation
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1684
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1685 (defconst js--possibly-braceless-keyword-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1686 (js--regexp-opt-symbol
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1687 '("catch" "do" "else" "finally" "for" "if" "try" "while" "with"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1688 "each"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1689 "Regular expression matching keywords that are optionally
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1690 followed by an opening brace.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1691
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1692 (defconst js--indent-operator-re
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1693 (concat "[-+*/%<>=&^|?:.]\\([^-+*/]\\|$\\)\\|"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1694 (js--regexp-opt-symbol '("in" "instanceof")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1695 "Regular expression matching operators that affect indentation
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1696 of continued expressions.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1697
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1698
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1699 (defun js--looking-at-operator-p ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1700 "Return non-nil if text after point is an operator (that is not
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1701 a comma)."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1702 (save-match-data
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1703 (and (looking-at js--indent-operator-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1704 (or (not (looking-at ":"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1705 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1706 (and (js--re-search-backward "[?:{]\\|\\_<case\\_>" nil t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1707 (looking-at "?")))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1708
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1709
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1710 (defun js--continued-expression-p ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1711 "Returns non-nil if the current line continues an expression."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1712 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1713 (back-to-indentation)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1714 (or (js--looking-at-operator-p)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1715 (and (js--re-search-backward "\n" nil t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1716 (progn
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1717 (skip-chars-backward " \t")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1718 (or (bobp) (backward-char))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1719 (and (> (point) (point-min))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1720 (save-excursion (backward-char) (not (looking-at "[/*]/")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1721 (js--looking-at-operator-p)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1722 (and (progn (backward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1723 (not (looking-at "++\\|--\\|/[/*]"))))))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1724
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1725
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1726 (defun js--end-of-do-while-loop-p ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1727 "Returns non-nil if word after point is `while' of a do-while
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1728 statement, else returns nil. A braceless do-while statement
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1729 spanning several lines requires that the start of the loop is
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1730 indented to the same column as the current line."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1731 (interactive)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1732 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1733 (save-match-data
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1734 (when (looking-at "\\s-*\\_<while\\_>")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1735 (if (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1736 (skip-chars-backward "[ \t\n]*}")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1737 (looking-at "[ \t\n]*}"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1738 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1739 (backward-list) (forward-symbol -1) (looking-at "\\_<do\\_>"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1740 (js--re-search-backward "\\_<do\\_>" (point-at-bol) t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1741 (or (looking-at "\\_<do\\_>")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1742 (let ((saved-indent (current-indentation)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1743 (while (and (js--re-search-backward "^\\s-*\\_<" nil t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1744 (/= (current-indentation) saved-indent)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1745 (and (looking-at "\\s-*\\_<do\\_>")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1746 (not (js--re-search-forward
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1747 "\\_<while\\_>" (point-at-eol) t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1748 (= (current-indentation) saved-indent)))))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1749
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1750
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1751 (defun js--ctrl-statement-indentation ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1752 "Returns the proper indentation of the current line if it
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1753 starts the body of a control statement without braces, else
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1754 returns nil."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1755 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1756 (back-to-indentation)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1757 (when (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1758 (and (not (eq (point-at-bol) (point-min)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1759 (not (looking-at "[{]"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1760 (progn
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1761 (js--re-search-backward "[[:graph:]]" nil t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1762 (or (eobp) (forward-char))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1763 (when (= (char-before) ?\)) (backward-list))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1764 (skip-syntax-backward " ")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1765 (skip-syntax-backward "w_")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1766 (looking-at js--possibly-braceless-keyword-re))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1767 (not (js--end-of-do-while-loop-p))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1768 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1769 (goto-char (match-beginning 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1770 (+ (current-indentation) js-indent-level)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1771
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1772 (defun js--get-c-offset (symbol anchor)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1773 (let ((c-offsets-alist
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1774 (list (cons 'c js-comment-lineup-func))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1775 (c-get-syntactic-indentation (list (cons symbol anchor)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1776
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1777 (defun js--proper-indentation (parse-status)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1778 "Return the proper indentation for the current line."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1779 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1780 (back-to-indentation)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1781 (cond ((nth 4 parse-status)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1782 (js--get-c-offset 'c (nth 8 parse-status)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1783 ((nth 8 parse-status) 0) ; inside string
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1784 ((js--ctrl-statement-indentation))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1785 ((eq (char-after) ?#) 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1786 ((save-excursion (js--beginning-of-macro)) 4)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1787 ((nth 1 parse-status)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1788 (let ((same-indent-p (looking-at
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1789 "[]})]\\|\\_<case\\_>\\|\\_<default\\_>"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1790 (continued-expr-p (js--continued-expression-p)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1791 (goto-char (nth 1 parse-status))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1792 (if (looking-at "[({[]\\s-*\\(/[/*]\\|$\\)")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1793 (progn
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1794 (skip-syntax-backward " ")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1795 (when (= (char-before) ?\)) (backward-list))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1796 (back-to-indentation)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1797 (cond (same-indent-p
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1798 (current-column))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1799 (continued-expr-p
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1800 (+ (current-column) (* 2 js-indent-level)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1801 js-expr-indent-offset))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1802 (t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1803 (+ (current-column) js-indent-level))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1804 (unless same-indent-p
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1805 (forward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1806 (skip-chars-forward " \t"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1807 (current-column))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1808
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1809 ((js--continued-expression-p)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1810 (+ js-indent-level js-expr-indent-offset))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1811 (t 0))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1812
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1813 (defun js-indent-line ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1814 "Indent the current line as JavaScript source text."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1815 (interactive)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1816 (save-restriction
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1817 (widen)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1818 (let* ((parse-status
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1819 (save-excursion (syntax-ppss (point-at-bol))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1820 (offset (- (current-column) (current-indentation))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1821
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1822 (indent-line-to (js--proper-indentation parse-status))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1823 (when (> offset 0) (forward-char offset)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1824
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1825 ;;; Filling
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1826
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1827 (defun js-c-fill-paragraph (&optional justify)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1828 "Fill the paragraph with c-fill-paragraph"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1829 (interactive "*P")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1830
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1831 (flet ((c-forward-sws
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1832 (&optional limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1833 (js--forward-syntactic-ws limit))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1834
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1835 (c-backward-sws
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1836 (&optional limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1837 (js--backward-syntactic-ws limit))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1838
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1839 (c-beginning-of-macro
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1840 (&optional limit)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1841 (js--beginning-of-macro limit)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1842
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1843 (let ((fill-paragraph-function 'c-fill-paragraph))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1844 (c-fill-paragraph justify))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1845
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1846 ;;; Type database and Imenu
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1847
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1848 ;; We maintain a cache of semantic information, i.e., the classes and
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1849 ;; functions we've encountered so far. In order to avoid having to
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1850 ;; re-parse the buffer on every change, we cache the parse state at
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1851 ;; each interesting point in the buffer. Each parse state is a
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1852 ;; modified copy of the previous one, or in the case of the first
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1853 ;; parse state, the empty state.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1854 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1855 ;; The parse state itself is just a stack of js--pitem
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1856 ;; instances. It starts off containing one element that is never
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1857 ;; closed, that is initially js--initial-pitem.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1858 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1859
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1860
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1861 (defun js--pitem-format (pitem)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1862 (let ((name (js--pitem-name pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1863 (type (js--pitem-type pitem)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1864
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1865 (format "name:%S type:%S"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1866 name
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1867 (if (atom type)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1868 type
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1869 (plist-get type :name)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1870
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1871 (defun js--make-merged-item (item child name-parts)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1872 "Internal helper for js--splice-into-items. Return a new
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1873 item that is the result of merging CHILD into ITEM. NAME-PARTS is
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1874 a list of parts of the name of CHILD that we haven't consumed
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1875 yet."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1876
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1877 (js--debug "js--make-merged-item: {%s} into {%s}"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1878 (js--pitem-format child)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1879 (js--pitem-format item))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1880
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1881 ;; If the item we're merging into isn't a class, make it into one
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1882 (unless (consp (js--pitem-type item))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1883 (js--debug "js--make-merged-item: changing dest into class")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1884 (setq item (make-js--pitem
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1885 :children (list item)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1886
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1887 ;; Use the child's class-style if it's available
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1888 :type (if (atom (js--pitem-type child))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1889 js--dummy-class-style
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1890 (js--pitem-type child))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1891
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1892 :name (js--pitem-strname item))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1893
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1894 ;; Now we can merge either a function or a class into a class
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1895 (cons (cond
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1896 ((cdr name-parts)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1897 (js--debug "js--make-merged-item: recursing")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1898 ;; if we have more name-parts to go before we get to the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1899 ;; bottom of the class hierarchy, call the merger
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1900 ;; recursively
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1901 (js--splice-into-items (car item) child
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1902 (cdr name-parts)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1903
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1904 ((atom (js--pitem-type child))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1905 (js--debug "js--make-merged-item: straight merge")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1906 ;; Not merging a class, but something else, so just prepend
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1907 ;; it
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1908 (cons child (car item)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1909
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1910 (t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1911 ;; Otherwise, merge the new child's items into those
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1912 ;; of the new class
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1913 (js--debug "js--make-merged-item: merging class contents")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1914 (append (car child) (car item))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1915 (cdr item)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1916
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1917 (defun js--pitem-strname (pitem)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1918 "Last part of the name of PITEM as a string or symbol"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1919 (let ((name (js--pitem-name pitem)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1920 (if (consp name)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1921 (car (last name))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1922 name)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1923
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1924 (defun js--splice-into-items (items child name-parts)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1925 "Non-destructively inserts CHILD into the item list ITEMS in
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1926 the proper place as given by NAME-PARTS. If a class doesn't
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1927 exist in the tree, create it. Return the new items list.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1928 NAME-PARTS is a list of strings given the broken-down class
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1929 name of the item to insert."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1930
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1931 (let ((top-name (car name-parts))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1932 (item-ptr items)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1933 new-items last-new-item new-cons item)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1934
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1935 (js--debug "js--splice-into-items: name-parts: %S items:%S"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1936 name-parts
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1937 (mapcar #'js--pitem-name items))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1938
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1939 (assert (stringp top-name))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1940 (assert (> (length top-name) 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1941
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1942 ;; If top-name isn't found in items, then we build a copy of items
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1943 ;; and throw it away. But that's okay, since most of the time, we
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1944 ;; *will* find an instance.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1945
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1946 (while (and item-ptr
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1947 (cond ((equal (js--pitem-strname (car item-ptr)) top-name)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1948 ;; Okay, we found an entry with the right name. Splice
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1949 ;; the merged item into the list...
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1950 (setq new-cons (cons (js--make-merged-item
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1951 (car item-ptr) child
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1952 name-parts)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1953 (cdr item-ptr)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1954
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1955 (if last-new-item
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1956 (setcdr last-new-item new-cons)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1957 (setq new-items new-cons))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1958
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1959 ;; ...and terminate the loop
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1960 nil)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1961
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1962 (t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1963 ;; Otherwise, copy the current cons and move onto the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1964 ;; text. This is tricky; we keep track of the tail of
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1965 ;; the list that begins with new-items in
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1966 ;; last-new-item.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1967 (setq new-cons (cons (car item-ptr) nil))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1968 (if last-new-item
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1969 (setcdr last-new-item new-cons)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1970 (setq new-items new-cons))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1971 (setq last-new-item new-cons)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1972
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1973 ;; Go to the next cell in items
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1974 (setq item-ptr (cdr item-ptr))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1975
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1976 (if item-ptr
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1977 ;; Yay! We stopped because we found something, not because
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1978 ;; we ran out of items to search. Just return the new
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1979 ;; list.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1980 (progn
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1981 (js--debug "search succeeded: %S" name-parts)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1982 new-items)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1983
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1984 ;; We didn't find anything. If the child is a class and we don't
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1985 ;; have any classes to drill down into, just push that class;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1986 ;; otherwise, make a fake class and carry on.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1987 (js--debug "search failed: %S" name-parts)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1988 (cons (if (cdr name-parts)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1989 ;; We have name-parts left to process. Make a fake
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1990 ;; class for this particular part...
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1991 (make-js--pitem
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1992 ;; ...and recursively digest the rest of the name
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1993 :children (js--splice-into-items
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1994 nil child (cdr name-parts))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1995 :type js--dummy-class-style
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1996 :name top-name)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1997
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1998 ;; Otherwise, this is the only name we have, so stick
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1999 ;; the item on the front of the list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2000 child)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2001 items))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2002
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2003 (defun js--pitem-add-child (pitem child)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2004 "Copy js--pitem PITEM and while copying, push CHILD onto
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2005 its list of children."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2006
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2007 (assert (integerp (js--pitem-h-begin child)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2008 (assert (if (consp (js--pitem-name child))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2009 (loop for part in (js--pitem-name child)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2010 always (stringp part))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2011 t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2012
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2013 ;; This trick works because we know (based on our defstructs) that
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2014 ;; the child list is always the first element, and so the second
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2015 ;; element and beyond can be shared when we make our "copy".
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2016 (cons
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2017
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2018 (let ((name (js--pitem-name child))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2019 (type (js--pitem-type child)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2020
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2021 (cond ((cdr-safe name) ; true if a list of at least two elements
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2022 ;; Use slow path because we need class lookup
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2023 (js--splice-into-items (car pitem) child name))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2024
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2025 ((and (consp type)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2026 (plist-get type :prototype))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2027
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2028 ;; Use slow path because we need class merging. We know
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2029 ;; name is a list here because down in
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2030 ;; `js--ensure-cache', we made sure to only add
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2031 ;; class entries with lists for :name
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2032 (assert (consp name))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2033 (js--splice-into-items (car pitem) child name))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2034
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2035 (t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2036 ;; Fast path
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2037 (cons child (car pitem)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2038
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2039 (cdr pitem)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2040
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2041 (defun js--maybe-make-marker (location)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2042 "Make LOCATION into a marker if imenu-use-markers"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2043 (if imenu-use-markers
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2044 (set-marker (make-marker) location)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2045 location))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2046
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2047 (defun js--pitems-to-imenu (pitems unknown-ctr)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2048 "Convert list of pitems PITEMS to imenu format"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2049
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2050 (let (imenu-items pitem pitem-type pitem-name subitems)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2051
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2052 (while (setq pitem (pop pitems))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2053 (setq pitem-type (js--pitem-type pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2054 (setq pitem-name (js--pitem-strname pitem))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2055 (when (eq pitem-name t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2056 (setq pitem-name (format "[unknown %s]"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2057 (incf (car unknown-ctr)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2058
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2059 (cond
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2060 ((memq pitem-type '(function macro))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2061 (assert (integerp (js--pitem-h-begin pitem)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2062 (push (cons pitem-name
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2063 (js--maybe-make-marker
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2064 (js--pitem-h-begin pitem)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2065 imenu-items))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2066
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2067 ((consp pitem-type) ; class definition
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2068 (setq subitems (js--pitems-to-imenu
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2069 (js--pitem-children pitem)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2070 unknown-ctr))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2071 (cond (subitems
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2072 (push (cons pitem-name subitems)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2073 imenu-items))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2074
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2075 ((js--pitem-h-begin pitem)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2076 (assert (integerp (js--pitem-h-begin pitem)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2077 (setq subitems (list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2078 (cons "[empty]"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2079 (js--maybe-make-marker
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2080 (js--pitem-h-begin pitem)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2081 (push (cons pitem-name subitems)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2082 imenu-items))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2083
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2084 (t (error "Unknown item type: %S" pitem-type))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2085
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2086 imenu-items))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2087
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2088 (defun js--imenu-create-index ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2089 "Creates an imenu index for the current buffer"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2090 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2091 (save-restriction
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2092 (widen)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2093 (goto-char (point-max))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2094 (js--ensure-cache)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2095 (assert (or (= (point-min) (point-max))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2096 (eq js--last-parse-pos (point))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2097 (when js--last-parse-pos
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2098 (let ((state js--state-at-last-parse-pos)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2099 (unknown-ctr (cons -1 nil)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2100
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2101 ;; Make sure everything is closed
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2102 (while (cdr state)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2103 (setq state
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2104 (cons (js--pitem-add-child (second state) (car state))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2105 (cddr state))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2106
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2107 (assert (= (length state) 1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2108
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2109 ;; Convert the new-finalized state into what imenu expects
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2110 (js--pitems-to-imenu
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2111 (car (js--pitem-children state))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2112 unknown-ctr))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2113
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2114 (defun js--which-func-joiner (parts)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2115 (mapconcat #'identity parts "."))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2116
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2117 (defun js--imenu-to-flat (items prefix symbols)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2118 (loop for item in items
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2119 if (imenu--subalist-p item)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2120 do (js--imenu-to-flat
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2121 (cdr item) (concat prefix (car item) ".")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2122 symbols)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2123 else
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2124 do (let* ((name (concat prefix (car item)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2125 (name2 name)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2126 (ctr 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2127
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2128 (while (gethash name2 symbols)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2129 (setq name2 (format "%s<%d>" name (incf ctr))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2130
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2131 (puthash name2 (cdr item) symbols))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2132
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2133 (defun js--get-all-known-symbols ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2134 "Get a hash table of all relevant Javascript symbols across all
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2135 js-mode buffers. Each key is the name of a symbol (possibly
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2136 disambiguated with <N>, where N > 1), and each value is a marker
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2137 giving the location of that symbol."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2138 (loop with symbols = (make-hash-table :test 'equal)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2139 with imenu-use-markers = t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2140 for buffer being the buffers
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2141 for imenu-index = (with-current-buffer buffer
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2142 (when (eq major-mode 'js-mode)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2143 (js--imenu-create-index)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2144 do (js--imenu-to-flat imenu-index "" symbols)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2145 finally return symbols))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2146
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2147 (defvar js--symbol-history nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2148 "History of entered Javascript symbols")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2149
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2150 (defun js--read-symbol (symbols-table prompt &optional initial-input)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2151 "Read a symbol from SYMBOLS-TABLE, which is a hash table like
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2152 the one from `js--get-all-known-symbols'. Return value is a
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2153 cons of (SYMBOL-NAME . LOCATION), where SYMBOL-NAME is a string
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2154 and LOCATION is a marker.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2155
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2156 Prompt is PROMPT.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2157
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2158 If INITIAL-INPUT is not nil, use it as the initial input"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2159
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2160 (unless ido-mode
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2161 (ido-mode t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2162 (ido-mode nil))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2163
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2164 (let ((choice (ido-completing-read
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2165 prompt
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2166 (loop for key being the hash-keys of symbols-table
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2167 collect key)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2168 nil t initial-input 'js--symbol-history)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2169 (cons choice (gethash choice symbols-table))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2170
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2171 (defun js--guess-symbol-at-point ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2172 (let ((bounds (bounds-of-thing-at-point 'symbol)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2173 (when bounds
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2174 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2175 (goto-char (car bounds))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2176 (when (eq (char-before) ?.)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2177 (backward-char)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2178 (setf (car bounds) (point))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2179 (buffer-substring (car bounds) (cdr bounds)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2180
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2181 (defun js-find-symbol (&optional arg)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2182 "Jump to a Javascript symbol we read in from the user. With
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2183 prefix argument, restrict symbols to those from the current
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2184 buffer. Pushes a mark onto the tag ring just like `find-tag'."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2185
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2186 (interactive "P")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2187 (let (symbols marker)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2188 (if (not arg)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2189 (setq symbols (js--get-all-known-symbols))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2190 (setq symbols (make-hash-table :test 'equal))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2191 (js--imenu-to-flat (js--imenu-create-index)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2192 "" symbols))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2193
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2194 (setq marker (cdr (js--read-symbol
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2195 symbols "Jump to: "
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2196 (js--guess-symbol-at-point))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2197
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2198 (ring-insert find-tag-marker-ring (point-marker))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2199 (switch-to-buffer (marker-buffer marker))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2200 (push-mark)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2201 (goto-char marker)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2202
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2203 ;;; MozRepl integration
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2204
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2205 (put 'js-moz-bad-rpc 'error-conditions '(error timeout))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2206 (put 'js-moz-bad-rpc 'error-message "Mozilla RPC Error")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2207
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2208 (put 'js-js-error 'error-conditions '(error js-error))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2209 (put 'js-js-error 'error-message "Javascript Error")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2210
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2211 (defun js--wait-for-matching-output
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2212 (process regexp timeout &optional start)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2213 "Wait TIMEOUT seconds for PROCESS to output something that
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2214 matches REGEXP. On timeout, return nil. On success, return t with
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2215 match data set. If START is non-nil, look for output starting
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2216 from START. Otherwise, use the current value of `process-mark'."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2217 (with-current-buffer (process-buffer process)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2218 (loop with start-pos = (or start
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2219 (marker-position (process-mark process)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2220 with end-time = (+ (float-time) timeout)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2221 for time-left = (- end-time (float-time))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2222 do (goto-char (point-max))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2223 if (looking-back regexp start-pos) return t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2224 while (> time-left 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2225 do (accept-process-output process time-left nil t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2226 do (goto-char (process-mark process))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2227 finally do (signal
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2228 'js-moz-bad-rpc
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2229 (list (format "Timed out waiting for output matching %S" regexp))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2230
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2231 (defstruct js--js-handle
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2232 ;; Integer, mirrors the value we see in JS
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2233 (id nil :read-only t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2234
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2235 ;; Process to which this thing belongs
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2236 (process nil :read-only t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2237
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2238 (defun js--js-handle-expired-p (x)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2239 (not (eq (js--js-handle-process x)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2240 (inferior-moz-process))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2241
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2242 (defvar js--js-references nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2243 "Maps Elisp Javascript proxy objects to their Javascript IDs.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2244
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2245 (defvar js--js-process nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2246 "The last MozRepl process object we saw")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2247
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2248 (defvar js--js-gc-idle-timer nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2249 "Idle timer for cleaning up JS object references")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2250
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2251 (defvar js--js-last-gcs-done nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2252 "Last number of gcs we GCed with")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2253
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2254 (defconst js--moz-interactor
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2255 (replace-regexp-in-string
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2256 "[ \n]+" " "
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2257 ; */" Make Emacs happy
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2258 "(function(repl) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2259 repl.defineInteractor('js', {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2260 onStart: function onStart(repl) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2261 if(!repl._jsObjects) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2262 repl._jsObjects = {};
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2263 repl._jsLastID = 0;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2264 repl._jsGC = this._jsGC;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2265 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2266 this._input = '';
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2267 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2268
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2269 _jsGC: function _jsGC(ids_in_use) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2270 var objects = this._jsObjects;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2271 var keys = [];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2272 var num_freed = 0;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2273
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2274 for(var pn in objects) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2275 keys.push(Number(pn));
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2276 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2277
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2278 keys.sort(function(x, y) x - y);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2279 ids_in_use.sort(function(x, y) x - y);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2280 var i = 0;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2281 var j = 0;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2282
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2283 while(i < ids_in_use.length && j < keys.length) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2284 var id = ids_in_use[i++];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2285 while(j < keys.length && keys[j] !== id) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2286 var k_id = keys[j++];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2287 delete objects[k_id];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2288 ++num_freed;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2289 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2290 ++j;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2291 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2292
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2293 while(j < keys.length) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2294 var k_id = keys[j++];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2295 delete objects[k_id];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2296 ++num_freed;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2297 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2298
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2299 return num_freed;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2300 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2301
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2302 _mkArray: function _mkArray() {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2303 var result = [];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2304 for(var i = 0; i < arguments.length; ++i) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2305 result.push(arguments[i]);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2306 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2307 return result;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2308 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2309
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2310 _parsePropDescriptor: function _parsePropDescriptor(parts) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2311 if(typeof parts === 'string') {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2312 parts = [ parts ];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2313 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2314
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2315 var obj = parts[0];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2316 var start = 1;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2317
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2318 if(typeof obj === 'string') {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2319 obj = window;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2320 start = 0;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2321 } else if(parts.length < 2) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2322 throw new Error('expected at least 2 arguments');
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2323 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2324
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2325 for(var i = start; i < parts.length - 1; ++i) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2326 obj = obj[parts[i]];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2327 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2328
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2329 return [obj, parts[parts.length - 1]];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2330 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2331
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2332 _getProp: function _getProp(/*...*/) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2333 if(arguments.length === 0) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2334 throw new Error('no arguments supplied to getprop');
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2335 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2336
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2337 if(arguments.length === 1 &&
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2338 (typeof arguments[0]) !== 'string')
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2339 {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2340 return arguments[0];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2341 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2342
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2343 var [obj, propname] = this._parsePropDescriptor(arguments);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2344 return obj[propname];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2345 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2346
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2347 _putProp: function _putProp(properties, value) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2348 var [obj, propname] = this._parsePropDescriptor(properties);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2349 obj[propname] = value;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2350 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2351
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2352 _delProp: function _delProp(propname) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2353 var [obj, propname] = this._parsePropDescriptor(arguments);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2354 delete obj[propname];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2355 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2356
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2357 _typeOf: function _typeOf(thing) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2358 return typeof thing;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2359 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2360
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2361 _callNew: function(constructor) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2362 if(typeof constructor === 'string')
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2363 {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2364 constructor = window[constructor];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2365 } else if(constructor.length === 1 &&
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2366 typeof constructor[0] !== 'string')
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2367 {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2368 constructor = constructor[0];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2369 } else {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2370 var [obj,propname] = this._parsePropDescriptor(constructor);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2371 constructor = obj[propname];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2372 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2373
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2374 /* Hacky, but should be robust */
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2375 var s = 'new constructor(';
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2376 for(var i = 1; i < arguments.length; ++i) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2377 if(i != 1) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2378 s += ',';
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2379 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2380
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2381 s += 'arguments[' + i + ']';
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2382 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2383
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2384 s += ')';
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2385 return eval(s);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2386 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2387
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2388 _callEval: function(thisobj, js) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2389 return eval.call(thisobj, js);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2390 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2391
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2392 getPrompt: function getPrompt(repl) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2393 return 'EVAL>'
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2394 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2395
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2396 _lookupObject: function _lookupObject(repl, id) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2397 if(typeof id === 'string') {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2398 switch(id) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2399 case 'global':
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2400 return window;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2401 case 'nil':
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2402 return null;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2403 case 't':
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2404 return true;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2405 case 'false':
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2406 return false;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2407 case 'undefined':
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2408 return undefined;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2409 case 'repl':
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2410 return repl;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2411 case 'interactor':
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2412 return this;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2413 case 'NaN':
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2414 return NaN;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2415 case 'Infinity':
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2416 return Infinity;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2417 case '-Infinity':
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2418 return -Infinity;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2419 default:
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2420 throw new Error('No object with special id:' + id);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2421 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2422 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2423
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2424 var ret = repl._jsObjects[id];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2425 if(ret === undefined) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2426 throw new Error('No object with id:' + id + '(' + typeof id + ')');
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2427 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2428 return ret;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2429 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2430
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2431 _findOrAllocateObject: function _findOrAllocateObject(repl, value) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2432 if(typeof value !== 'object' && typeof value !== 'function') {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2433 throw new Error('_findOrAllocateObject called on non-object('
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2434 + typeof(value) + '): '
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2435 + value)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2436 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2437
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2438 for(var id in repl._jsObjects) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2439 id = Number(id);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2440 var obj = repl._jsObjects[id];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2441 if(obj === value) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2442 return id;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2443 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2444 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2445
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2446 var id = ++repl._jsLastID;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2447 repl._jsObjects[id] = value;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2448 return id;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2449 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2450
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2451 _fixupList: function _fixupList(repl, list) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2452 for(var i = 0; i < list.length; ++i) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2453 if(list[i] instanceof Array) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2454 this._fixupList(repl, list[i]);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2455 } else if(typeof list[i] === 'object') {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2456 var obj = list[i];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2457 if(obj.funcall) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2458 var parts = obj.funcall;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2459 this._fixupList(repl, parts);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2460 var [thisobj, func] = this._parseFunc(parts[0]);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2461 list[i] = func.apply(thisobj, parts.slice(1));
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2462 } else if(obj.objid) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2463 list[i] = this._lookupObject(repl, obj.objid);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2464 } else {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2465 throw new Error('Unknown object type: ' + obj.toSource());
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2466 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2467 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2468 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2469 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2470
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2471 _parseFunc: function(func) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2472 var thisobj = null;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2473
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2474 if(typeof func === 'string') {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2475 func = window[func];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2476 } else if(func instanceof Array) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2477 if(func.length === 1 && typeof func[0] !== 'string') {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2478 func = func[0];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2479 } else {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2480 [thisobj, func] = this._parsePropDescriptor(func);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2481 func = thisobj[func];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2482 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2483 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2484
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2485 return [thisobj,func];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2486 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2487
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2488 _encodeReturn: function(value, array_as_mv) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2489 var ret;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2490
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2491 if(value === null) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2492 ret = ['special', 'null'];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2493 } else if(value === true) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2494 ret = ['special', 'true'];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2495 } else if(value === false) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2496 ret = ['special', 'false'];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2497 } else if(value === undefined) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2498 ret = ['special', 'undefined'];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2499 } else if(typeof value === 'number') {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2500 if(isNaN(value)) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2501 ret = ['special', 'NaN'];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2502 } else if(value === Infinity) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2503 ret = ['special', 'Infinity'];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2504 } else if(value === -Infinity) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2505 ret = ['special', '-Infinity'];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2506 } else {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2507 ret = ['atom', value];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2508 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2509 } else if(typeof value === 'string') {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2510 ret = ['atom', value];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2511 } else if(array_as_mv && value instanceof Array) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2512 ret = ['array', value.map(this._encodeReturn, this)];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2513 } else {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2514 ret = ['objid', this._findOrAllocateObject(repl, value)];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2515 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2516
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2517 return ret;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2518 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2519
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2520 _handleInputLine: function _handleInputLine(repl, line) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2521 var ret;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2522 var array_as_mv = false;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2523
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2524 try {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2525 if(line[0] === '*') {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2526 array_as_mv = true;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2527 line = line.substring(1);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2528 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2529 var parts = eval(line);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2530 this._fixupList(repl, parts);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2531 var [thisobj, func] = this._parseFunc(parts[0]);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2532 ret = this._encodeReturn(
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2533 func.apply(thisobj, parts.slice(1)),
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2534 array_as_mv);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2535 } catch(x) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2536 ret = ['error', x.toString() ];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2537 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2538
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2539 var JSON = Components.classes['@mozilla.org/dom/json;1'].createInstance(Components.interfaces.nsIJSON);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2540 repl.print(JSON.encode(ret));
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2541 repl._prompt();
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2542 },
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2543
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2544 handleInput: function handleInput(repl, chunk) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2545 this._input += chunk;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2546 var match, line;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2547 while(match = this._input.match(/.*\\n/)) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2548 line = match[0];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2549
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2550 if(line === 'EXIT\\n') {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2551 repl.popInteractor();
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2552 repl._prompt();
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2553 return;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2554 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2555
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2556 this._input = this._input.substring(line.length);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2557 this._handleInputLine(repl, line);
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2558 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2559 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2560 });
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2561 })
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2562 ")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2563
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2564 "String to set MozRepl up into a simple-minded evaluation mode")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2565
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2566 (defun js--js-encode-value (x)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2567 "Marshall the given value for JS. Strings and numbers get
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2568 JSON-encoded. Lists (including nil) are made into Javascript
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2569 array literals and their contents encoded with
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2570 js--js-encode-value."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2571
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2572 (cond ((stringp x) (json-encode-string x))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2573 ((numberp x) (json-encode-number x))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2574 ((symbolp x) (format "{objid:%S}" (symbol-name x)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2575 ((js--js-handle-p x)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2576
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2577 (when (js--js-handle-expired-p x)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2578 (error "Stale JS handle"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2579
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2580 (format "{objid:%s}" (js--js-handle-id x)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2581
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2582 ((sequencep x)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2583 (if (eq (car-safe x) 'js--funcall)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2584 (format "{funcall:[%s]}"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2585 (mapconcat #'js--js-encode-value (cdr x) ","))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2586 (concat
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2587 "[" (mapconcat #'js--js-encode-value x ",") "]")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2588 (t
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2589 (error "Unrecognized item: %S" x))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2590
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2591 (defconst js--js-prompt-regexp "\\(repl[0-9]*\\)> $")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2592 (defconst js--js-repl-prompt-regexp "^EVAL>$")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2593 (defvar js--js-repl-depth 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2594
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2595 (defun js--js-wait-for-eval-prompt ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2596 (js--wait-for-matching-output
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2597 (inferior-moz-process)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2598 js--js-repl-prompt-regexp js-js-timeout
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2599
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2600 ;; start matching against the beginning of the line in
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2601 ;; order to catch a prompt that's only partially arrived
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2602 (save-excursion (forward-line 0) (point))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2603
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2604 (defun js--js-enter-repl ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2605 (inferior-moz-process) ; called for side-effect
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2606 (with-current-buffer inferior-moz-buffer
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2607 (goto-char (point-max))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2608
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2609 ;; Do some initialization the first time we see a process
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2610 (unless (eq (inferior-moz-process) js--js-process)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2611 (setq js--js-process (inferior-moz-process))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2612 (setq js--js-references (make-hash-table :test 'eq :weakness t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2613 (setq js--js-repl-depth 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2614
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2615 ;; Send interactor definition
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2616 (comint-send-string js--js-process js--moz-interactor)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2617 (comint-send-string js--js-process
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2618 (concat "(" moz-repl-name ")\n"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2619 (js--wait-for-matching-output
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2620 (inferior-moz-process) js--js-prompt-regexp
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2621 js-js-timeout))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2622
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2623 ;; Sanity check
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2624 (when (looking-back js--js-prompt-regexp
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2625 (save-excursion (forward-line 0) (point)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2626 (setq js--js-repl-depth 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2627
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2628 (if (> js--js-repl-depth 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2629 ;; If js--js-repl-depth > 0, we *should* be seeing an
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2630 ;; EVAL> prompt. If we don't, give Mozilla a chance to catch
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2631 ;; up with us.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2632 (js--js-wait-for-eval-prompt)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2633
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2634 ;; Otherwise, tell Mozilla to enter the interactor mode
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2635 (insert (match-string-no-properties 1)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2636 ".pushInteractor('js')")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2637 (comint-send-input nil t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2638 (js--wait-for-matching-output
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2639 (inferior-moz-process) js--js-repl-prompt-regexp
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2640 js-js-timeout))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2641
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2642 (incf js--js-repl-depth)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2643
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2644 (defun js--js-leave-repl ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2645 (assert (> js--js-repl-depth 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2646 (when (= 0 (decf js--js-repl-depth))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2647 (with-current-buffer inferior-moz-buffer
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2648 (goto-char (point-max))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2649 (js--js-wait-for-eval-prompt)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2650 (insert "EXIT")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2651 (comint-send-input nil t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2652 (js--wait-for-matching-output
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2653 (inferior-moz-process) js--js-prompt-regexp
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2654 js-js-timeout))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2655
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2656 (defsubst js--js-not (value)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2657 (memq value '(nil false undefined)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2658
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2659 (defsubst js--js-true (value)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2660 (not (js--js-not value)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2661
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2662 (eval-and-compile
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2663 (defun js--optimize-arglist (arglist)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2664 "Convert immediate js< and js! references to deferred ones"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2665 (loop for item in arglist
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2666 if (eq (car-safe item) 'js<)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2667 collect (append (list 'list ''js--funcall
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2668 '(list 'interactor "_getProp"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2669 (js--optimize-arglist (cdr item)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2670 else if (eq (car-safe item) 'js>)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2671 collect (append (list 'list ''js--funcall
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2672 '(list 'interactor "_putProp"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2673
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2674 (if (atom (cadr item))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2675 (list (cadr item))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2676 (list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2677 (append
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2678 (list 'list ''js--funcall
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2679 '(list 'interactor "_mkArray"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2680 (js--optimize-arglist (cadr item)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2681 (js--optimize-arglist (cddr item)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2682 else if (eq (car-safe item) 'js!)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2683 collect (destructuring-bind (ignored function &rest body) item
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2684 (append (list 'list ''js--funcall
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2685 (if (consp function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2686 (cons 'list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2687 (js--optimize-arglist function))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2688 function))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2689 (js--optimize-arglist body)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2690 else
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2691 collect item)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2692
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2693 (defmacro js--js-get-service (class-name interface-name)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2694 `(js! ("Components" "classes" ,class-name "getService")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2695 (js< "Components" "interfaces" ,interface-name)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2696
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2697 (defmacro js--js-create-instance (class-name interface-name)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2698 `(js! ("Components" "classes" ,class-name "createInstance")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2699 (js< "Components" "interfaces" ,interface-name)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2700
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2701 (defmacro js--js-qi (object interface-name)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2702 `(js! (,object "QueryInterface")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2703 (js< "Components" "interfaces" ,interface-name)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2704
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2705 (defmacro with-js (&rest forms)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2706 "Runs FORMS with the Mozilla repl set up for js commands.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2707 Inside the lexical scope of `with-js', `js?', `js!',
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2708 `js-new', `js-eval', `js-list', `js<', `js>', `js-get-service',
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2709 `js-create-instance', and `js-qi' are defined."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2710
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2711 `(progn
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2712 (js--js-enter-repl)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2713 (unwind-protect
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2714 (macrolet ((js? (&rest body) `(js--js-true ,@body))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2715 (js! (function &rest body)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2716 `(js--js-funcall
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2717 ,(if (consp function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2718 (cons 'list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2719 (js--optimize-arglist function))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2720 function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2721 ,@(js--optimize-arglist body)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2722
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2723 (js-new (function &rest body)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2724 `(js--js-new
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2725 ,(if (consp function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2726 (cons 'list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2727 (js--optimize-arglist function))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2728 function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2729 ,@body))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2730
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2731 (js-eval (thisobj js)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2732 `(js--js-eval
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2733 ,@(js--optimize-arglist
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2734 (list thisobj js))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2735
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2736 (js-list (&rest args)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2737 `(js--js-list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2738 ,@(js--optimize-arglist args)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2739
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2740 (js-get-service (&rest args)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2741 `(js--js-get-service
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2742 ,@(js--optimize-arglist args)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2743
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2744 (js-create-instance (&rest args)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2745 `(js--js-create-instance
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2746 ,@(js--optimize-arglist args)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2747
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2748 (js-qi (&rest args)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2749 `(js--js-qi
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2750 ,@(js--optimize-arglist args)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2751
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2752 (js< (&rest body) `(js--js-get
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2753 ,@(js--optimize-arglist body)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2754 (js> (props value)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2755 `(js--js-funcall
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2756 '(interactor "_putProp")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2757 ,(if (consp props)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2758 (cons 'list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2759 (js--optimize-arglist props))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2760 props)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2761 ,@(js--optimize-arglist (list value))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2762 ))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2763 (js-handle? (arg) `(js--js-handle-p ,arg)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2764 ,@forms)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2765 (js--js-leave-repl))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2766
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2767 (defvar js--js-array-as-list nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2768 "If bound to t and a function returns an Array, return the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2769 elements of that Array as a list instead of returning the whole
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2770 Array as a JS symbol" )
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2771
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2772 (defun js--js-decode-retval (result)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2773 (ecase (intern (first result))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2774 (atom (second result))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2775 (special (intern (second result)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2776 (array
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2777 (mapcar #'js--js-decode-retval (second result)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2778 (objid
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2779 (or (gethash (second result)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2780 js--js-references)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2781 (puthash (second result)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2782 (make-js--js-handle
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2783 :id (second result)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2784 :process (inferior-moz-process))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2785 js--js-references)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2786
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2787 (error (signal 'js-js-error (list (second result))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2788
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2789 (defun js--js-funcall (function &rest arguments)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2790 "Call the Mozilla function FUNCTION with arguments ARGUMENTS.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2791 If function is a string, look it up as a property on the global
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2792 object and use the global object for `this'; if FUNCTION is a
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2793 list with one element, use that element as the function with the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2794 global object for `this', except that if that single element is a
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2795 string, look it up on the global object. If FUNCTION is a list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2796 with more than one argument, use the list up to the last value as
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2797 a property descriptor and the last argument as a function."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2798
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2799 (with-js
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2800 (let ((argstr (js--js-encode-value
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2801 (cons function arguments))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2802
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2803 (with-current-buffer inferior-moz-buffer
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2804 ;; Actual funcall
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2805 (when js--js-array-as-list
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2806 (insert "*"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2807 (insert argstr)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2808 (comint-send-input nil t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2809 (js--wait-for-matching-output
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2810 (inferior-moz-process) "EVAL>"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2811 js-js-timeout)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2812 (goto-char comint-last-input-end)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2813
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2814 ;; Read the result
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2815 (let* ((json-array-type 'list)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2816 (result (prog1 (json-read)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2817 (goto-char (point-max)))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2818 (js--js-decode-retval result))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2819
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2820 (defun js--js-new (constructor &rest arguments)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2821 "Call CONSTRUCTOR as a constructor (as with new), with the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2822 given arguments ARGUMENTS. CONSTRUCTOR is a JS handle, a string,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2823 or a list of these things."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2824
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2825 (apply #'js--js-funcall
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2826 '(interactor "_callNew")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2827 constructor arguments))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2828
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2829 (defun js--js-eval (thisobj js)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2830 (js--js-funcall '(interactor "_callEval") thisobj js))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2831
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2832 (defun js--js-list (&rest arguments)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2833 "Return a Lisp array that is the result of evaluating each of
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2834 the elements of ARGUMENTS"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2835
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2836 (let ((js--js-array-as-list t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2837 (apply #'js--js-funcall '(interactor "_mkArray")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2838 arguments)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2839
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2840 (defun js--js-get (&rest props)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2841 (apply #'js--js-funcall '(interactor "_getProp") props))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2842
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2843 (defun js--js-put (props value)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2844 (js--js-funcall '(interactor "_putProp") props value))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2845
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2846 (defun js-gc (&optional force)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2847 "Tell the repl about any objects we don't reference anymore.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2848 With argument, run even if no intervening GC has happened."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2849 (interactive)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2850
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2851 (when force
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2852 (setq js--js-last-gcs-done nil))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2853
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2854 (let ((this-gcs-done gcs-done) keys num)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2855 (when (and js--js-references
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2856 (boundp 'inferior-moz-buffer)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2857 (buffer-live-p inferior-moz-buffer)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2858
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2859 ;; Don't bother running unless we've had an intervening
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2860 ;; garbage collection; without a gc, nothing is deleted
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2861 ;; from the weak hash table, so it's pointless telling
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2862 ;; MozRepl about that references we still hold
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2863 (not (eq js--js-last-gcs-done this-gcs-done))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2864
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2865 ;; Are we looking at a normal prompt? Make sure not to
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2866 ;; interrupt the user if he's doing something
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2867 (with-current-buffer inferior-moz-buffer
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2868 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2869 (goto-char (point-max))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2870 (looking-back js--js-prompt-regexp
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2871 (save-excursion (forward-line 0) (point))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2872
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2873 (setq keys (loop for x being the hash-keys
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2874 of js--js-references
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2875 collect x))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2876 (setq num (js--js-funcall '(repl "_jsGC") (or keys [])))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2877
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2878 (setq js--js-last-gcs-done this-gcs-done)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2879 (when (interactive-p)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2880 (message "Cleaned %s entries" num))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2881
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2882 num)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2883
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2884 (run-with-idle-timer 30 t #'js-gc)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2885
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2886 (defun js-eval (js)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2887 "Evaluate the Javascript contained in JS and return the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2888 JSON-decoded result. eval must be called using this function
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2889 because it is special to the Javascript interpreter."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2890 (interactive "MJavascript to evaluate: ")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2891 (with-js
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2892 (let* ((content-window (js--js-content-window
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2893 (js--get-js-context)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2894 (result (js-eval content-window js)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2895
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2896 (when (interactive-p)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2897 (message "%s" (js! "String" result)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2898 result)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2899
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2900 (defun js--get-tabs ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2901 "Enumerate all the contexts available. Each one is a list:
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2902
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2903 The list is (TITLE URL BROWSER TAB TABBROWSER) for content documents
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2904 The list is (TITLE URL WINDOW) for windows
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2905
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2906 All tabs of a given window are grouped together. The most
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2907 recent window is first. Within each window, the tabs are
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2908 returned left-to-right.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2909 "
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2910 (with-js
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2911 (let (windows)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2912
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2913 (loop with window-mediator = (js! ("Components" "classes"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2914 "@mozilla.org/appshell/window-mediator;1"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2915 "getService")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2916 (js< "Components" "interfaces"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2917 "nsIWindowMediator"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2918 with enumerator = (js! (window-mediator "getEnumerator") nil)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2919
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2920 while (js? (js! (enumerator "hasMoreElements")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2921 for window = (js! (enumerator "getNext"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2922 for window-info = (js-list window
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2923 (js< window "document" "title")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2924 (js! (window "location" "toString"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2925 (js< window "closed")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2926 (js< window "windowState"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2927
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2928 unless (or (js? (fourth window-info))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2929 (eq (fifth window-info) 2))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2930 do (push window-info windows))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2931
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2932 (loop for window-info in windows
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2933 for window = (first window-info)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2934 collect (list (second window-info)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2935 (third window-info)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2936 window)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2937
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2938 for gbrowser = (js< window "gBrowser")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2939 if (js-handle? gbrowser)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2940 nconc (loop
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2941 for x below (js< gbrowser "browsers" "length")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2942 collect (js-list (js< gbrowser
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2943 "browsers"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2944 x
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2945 "contentDocument"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2946 "title")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2947
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2948 (js! (gbrowser
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2949 "browsers"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2950 x
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2951 "contentWindow"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2952 "location"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2953 "toString"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2954 (js< gbrowser
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2955 "browsers"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2956 x)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2957
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2958 (js! (gbrowser
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2959 "tabContainer"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2960 "childNodes"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2961 "item")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2962 x)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2963
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2964 gbrowser))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2965
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2966 (defvar js-read-tab-history nil)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2967
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2968 (defun js--read-tab (prompt)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2969 "Read a Mozilla tab with prompt PROMPT. Return a cons of (TYPE . OBJECT).
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2970 TYPE is either 'window or 'tab, and OBJECT is a Javascript handle
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2971 to a ChromeWindow or a browser, respectively."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2972
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2973 ;; Prime IDO
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2974 (unless ido-mode
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2975 (ido-mode t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2976 (ido-mode nil))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2977
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2978 (with-js
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2979 (lexical-let ((tabs (js--get-tabs)) selected-tab-cname
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2980 selected-tab prev-hitab)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2981
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2982 ;; Disambiguate names
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2983 (setq tabs (loop with tab-names = (make-hash-table :test 'equal)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2984 for tab in tabs
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2985 for cname = (format "%s (%s)" (second tab) (first tab))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2986 for num = (incf (gethash cname tab-names -1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2987 if (> num 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2988 do (setq cname (format "%s <%d>" cname num))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2989 collect (cons cname tab)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2990
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2991 (labels ((find-tab-by-cname
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2992 (cname)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2993 (loop for tab in tabs
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2994 if (equal (car tab) cname)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2995 return (cdr tab)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2996
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2997 (mogrify-highlighting
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2998 (hitab unhitab)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2999
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3000 ;; Hack to reduce the number of
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3001 ;; round-trips to mozilla
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3002 (let (cmds)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3003 (cond
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3004 ;; Highlighting tab
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3005 ((fourth hitab)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3006 (push '(js! ((fourth hitab) "setAttribute")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3007 "style"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3008 "color: red; font-weight: bold")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3009 cmds)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3010
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3011 ;; Highlight window proper
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3012 (push '(js! ((third hitab)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3013 "setAttribute")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3014 "style"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3015 "border: 8px solid red")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3016 cmds)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3017
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3018 ;; Select tab, when appropriate
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3019 (when js-js-switch-tabs
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3020 (push
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3021 '(js> ((fifth hitab) "selectedTab") (fourth hitab))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3022 cmds)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3023
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3024 ;; Hilighting whole window
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3025 ((third hitab)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3026 (push '(js! ((third hitab) "document"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3027 "documentElement" "setAttribute")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3028 "style"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3029 (concat "-moz-appearance: none;"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3030 "border: 8px solid red;"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3031 cmds)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3032
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3033 (cond
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3034 ;; Unhighlighting tab
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3035 ((fourth unhitab)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3036 (push '(js! ((fourth unhitab) "setAttribute") "style" "")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3037 cmds)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3038 (push '(js! ((third unhitab) "setAttribute") "style" "")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3039 cmds))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3040
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3041 ;; Unhighlighting window
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3042 ((third unhitab)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3043 (push '(js! ((third unhitab) "document"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3044 "documentElement" "setAttribute")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3045 "style" "")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3046 cmds)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3047
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3048 (eval (list 'with-js
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3049 (cons 'js-list (nreverse cmds))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3050
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3051 (command-hook
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3052 ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3053 (let* ((tab (find-tab-by-cname (car ido-matches))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3054 (mogrify-highlighting tab prev-hitab)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3055 (setq prev-hitab tab)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3056
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3057 (setup-hook
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3058 ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3059 ;; Fiddle with the match list a bit: if our first match
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3060 ;; is a tabbrowser window, rotate the match list until
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3061 ;; the active tab comes up
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3062 (let ((matched-tab (find-tab-by-cname (car ido-matches))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3063 (when (and matched-tab
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3064 (null (fourth matched-tab))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3065 (equal "navigator:browser"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3066 (js! ((third matched-tab)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3067 "document"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3068 "documentElement"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3069 "getAttribute")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3070 "windowtype")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3071
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3072 (loop with tab-to-match = (js< (third matched-tab)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3073 "gBrowser"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3074 "selectedTab")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3075
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3076 with index = 0
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3077 for match in ido-matches
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3078 for candidate-tab = (find-tab-by-cname match)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3079 if (eq (fourth candidate-tab) tab-to-match)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3080 do (setq ido-cur-list (ido-chop ido-cur-list match))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3081 and return t)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3082
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3083 (add-hook 'post-command-hook #'command-hook t t)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3084
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3085
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3086 (unwind-protect
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3087 (setq selected-tab-cname
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3088 (let ((ido-minibuffer-setup-hook
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3089 (cons #'setup-hook ido-minibuffer-setup-hook)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3090 (ido-completing-read
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3091 prompt
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3092 (mapcar #'car tabs)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3093 nil t nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3094 'js-read-tab-history)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3095
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3096 (when prev-hitab
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3097 (mogrify-highlighting nil prev-hitab)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3098 (setq prev-hitab nil)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3099
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3100 (add-to-history 'js-read-tab-history selected-tab-cname)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3101
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3102 (setq selected-tab (loop for tab in tabs
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3103 if (equal (car tab) selected-tab-cname)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3104 return (cdr tab)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3105
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3106 (if (fourth selected-tab)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3107 (cons 'browser (third selected-tab))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3108 (cons 'window (third selected-tab)))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3109
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3110 (defun js--guess-eval-defun-info (pstate)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3111 "Internal helper for `js-eval-defun'. Returns a list (NAME . CLASSPARTS),
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3112 where CLASSPARTS is a list of strings making up the class name
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3113 and NAME is the name of the function part."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3114 (cond ((and (= (length pstate) 3)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3115 (eq (js--pitem-type (first pstate)) 'function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3116 (= (length (js--pitem-name (first pstate))) 1)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3117 (consp (js--pitem-type (second pstate))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3118
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3119 (append (js--pitem-name (second pstate))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3120 (list (first (js--pitem-name (first pstate))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3121
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3122 ((and (= (length pstate) 2)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3123 (eq (js--pitem-type (first pstate)) 'function))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3124
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3125 (append
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3126 (butlast (js--pitem-name (first pstate)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3127 (list (car (last (js--pitem-name (first pstate)))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3128
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3129 (t (error "Function not a toplevel defun or class member"))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3130
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3131 (defvar js--js-context nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3132 "The current JS context. This is a cons like the one returned
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3133 from `js--read-tab'. Change with
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3134 `js-set-js-context'.")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3135
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3136 (defconst js--js-inserter
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3137 "(function(func_info,func) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3138 func_info.unshift('window');
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3139 var obj = window;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3140 for(var i = 1; i < func_info.length - 1; ++i) {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3141 var next = obj[func_info[i]];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3142 if(typeof next !== 'object' && typeof next !== 'function') {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3143 next = obj.prototype && obj.prototype[func_info[i]];
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3144 if(typeof next !== 'object' && typeof next !== 'function') {
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3145 alert('Could not find ' + func_info.slice(0, i+1).join('.') +
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3146 ' or ' + func_info.slice(0, i+1).join('.') + '.prototype');
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3147 return;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3148 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3149
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3150 func_info.splice(i+1, 0, 'prototype');
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3151 ++i;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3152 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3153 }
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3154
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3155 obj[func_info[i]] = func;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3156 alert('Successfully updated '+func_info.join('.'));
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3157 })")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3158
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3159 (defun js-set-js-context (context)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3160 "Set the Javascript context to CONTEXT, reading from the user
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3161 if interactive"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3162 (interactive (list (js--read-tab "Javascript Context: ")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3163 (setq js--js-context context))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3164
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3165 (defun js--get-js-context ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3166 "Return a valid JS context. If one hasn't been set, or if it's
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3167 stale, ask the user for a new one."
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3168
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3169 (with-js
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3170 (when (or (null js--js-context)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3171 (js--js-handle-expired-p (cdr js--js-context))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3172 (ecase (car js--js-context)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3173 (window (js? (js< (cdr js--js-context) "closed")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3174 (browser (not (js? (js< (cdr js--js-context)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3175 "contentDocument"))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3176 (setq js--js-context (js--read-tab "Javascript Context: ")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3177
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3178 js--js-context))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3179
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3180 (defun js--js-content-window (context)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3181 (with-js
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3182 (ecase (car context)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3183 (window (cdr context))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3184 (browser (js< (cdr context)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3185 "contentWindow" "wrappedJSObject")))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3186
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3187 (defun js--make-nsilocalfile (path)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3188 (with-js
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3189 (let ((file (js-create-instance "@mozilla.org/file/local;1"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3190 "nsILocalFile")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3191 (js! (file "initWithPath") path)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3192 file)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3193
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3194 (defun js--js-add-resource-alias (alias path)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3195 (with-js
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3196 (let* ((io-service (js-get-service "@mozilla.org/network/io-service;1"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3197 "nsIIOService"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3198 (res-prot (js! (io-service "getProtocolHandler") "resource"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3199 (res-prot (js-qi res-prot "nsIResProtocolHandler"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3200 (path-file (js--make-nsilocalfile path))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3201 (path-uri (js! (io-service "newFileURI") path-file)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3202 (js! (res-prot "setSubstitution") alias path-uri))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3203
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3204 (defun* js-eval-defun ()
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3205 "Update some Mozilla tab with defun containing point or after
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3206 point"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3207 (interactive)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3208
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3209 ;; This function works by generating a temporary file that contains
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3210 ;; the function we'd like to insert. We then use the elisp-js bridge
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3211 ;; to command mozilla to load this file by inserting a script tag
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3212 ;; into the document we set. This way, debuggers and such will have
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3213 ;; a way to find the source of the just-inserted function.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3214 ;;
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3215 ;; We delete the temporary file if there's an error, but otherwise
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3216 ;; we add an unload event listener on the Mozilla side to delete the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3217 ;; file.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3218
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3219 (save-excursion
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3220 (let (begin end pstate defun-info temp-name defun-body)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3221 (js--end-of-defun)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3222 (setq end (point))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3223 (js--ensure-cache)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3224 (js--beginning-of-defun)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3225 (re-search-forward "\\_<function\\_>")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3226 (setq begin (match-beginning 0))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3227 (setq pstate (js--forward-pstate))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3228
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3229 (when (or (null pstate)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3230 (> (point) end))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3231 (error "Could not locate function definition"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3232
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3233 (setq defun-info (js--guess-eval-defun-info pstate))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3234
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3235 (let ((overlay (make-overlay begin end)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3236 (overlay-put overlay 'face 'highlight)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3237 (unwind-protect
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3238 (unless (y-or-n-p (format "Send %s to Mozilla? "
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3239 (mapconcat #'identity defun-info ".")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3240 (message "") ; question message lingers until next command
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3241 (return-from js-eval-defun))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3242 (delete-overlay overlay)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3243
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3244 (setq defun-body (buffer-substring-no-properties begin end))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3245
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3246 (make-directory js-js-tmpdir t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3247
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3248 ;; (Re)register a Mozilla resource URL to point to the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3249 ;; temporary directory
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3250 (js--js-add-resource-alias "js" js-js-tmpdir)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3251
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3252 (setq temp-name (make-temp-file (concat js-js-tmpdir
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3253 "/js-")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3254 nil ".js"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3255 (unwind-protect
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3256 (with-js
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3257 (with-temp-buffer
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3258 (insert js--js-inserter)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3259 (insert "(")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3260 (insert (json-encode-list defun-info))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3261 (insert ",\n")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3262 (insert defun-body)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3263 (insert "\n)")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3264 (write-region (point-min) (point-max) temp-name
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3265 nil 1))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3266
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3267 ;; Give Mozilla responsibility for deleting this file
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3268 (let* ((content-window (js--js-content-window
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3269 (js--get-js-context)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3270 (content-document (js< content-window "document"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3271 (head (if (js? (js< content-document "body"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3272 ;; Regular content
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3273 (js< (js! (content-document "getElementsByTagName")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3274 "head")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3275 0)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3276 ;; Chrome
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3277 (js< content-document "documentElement")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3278 (elem (js! (content-document "createElementNS")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3279 "http://www.w3.org/1999/xhtml" "script")))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3280
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3281 (js! (elem "setAttribute") "type" "text/javascript")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3282 (js! (elem "setAttribute") "src"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3283 (format "resource://js/%s"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3284 (file-name-nondirectory temp-name)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3285
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3286 (js! (head "appendChild") elem)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3287
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3288 (js! (content-window "addEventListener") "unload"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3289 (js! ((js-new
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3290 "Function" "file"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3291 "return function() { file.remove(false) }"))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3292 (js--make-nsilocalfile temp-name))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3293 'false)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3294 (setq temp-name nil)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3295
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3296
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3297
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3298 ))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3299
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3300 ;; temp-name is set to nil on success
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3301 (when temp-name
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3302 (delete-file temp-name))))))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3303
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3304 ;;; Main Function
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3305
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3306 ;;;###autoload
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3307 (define-derived-mode js-mode nil "js"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3308 "Major mode for editing JavaScript source text.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3309
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3310 Key bindings:
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3311
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3312 \\{js-mode-map}"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3313
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3314 :group 'js
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3315 :syntax-table js-mode-syntax-table
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3316
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3317 (set (make-local-variable 'indent-line-function) 'js-indent-line)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3318 (set (make-local-variable 'beginning-of-defun-function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3319 'js--beginning-of-defun)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3320 (set (make-local-variable 'end-of-defun-function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3321 'js--end-of-defun)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3322
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3323 (set (make-local-variable 'open-paren-in-column-0-is-defun-start) nil)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3324 (set (make-local-variable 'font-lock-defaults)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3325 (list js--font-lock-keywords
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3326 nil nil nil nil
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3327 '(font-lock-syntactic-keywords
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3328 . js--font-lock-syntactic-keywords)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3329
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3330 (set (make-local-variable 'parse-sexp-ignore-comments) t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3331 (set (make-local-variable 'parse-sexp-lookup-properties) t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3332 (set (make-local-variable 'which-func-imenu-joiner-function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3333 #'js--which-func-joiner)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3334
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3335 ;; Comments
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3336 (setq comment-start "// ")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3337 (setq comment-end "")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3338 (set (make-local-variable 'fill-paragraph-function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3339 'js-c-fill-paragraph)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3340
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3341 ;; Parse cache
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3342 (add-hook 'before-change-functions #'js--flush-caches t t)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3343
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3344 ;; Frameworks
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3345 (js--update-quick-match-re)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3346
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3347 ;; Imenu
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3348 (setq imenu-case-fold-search nil)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3349 (set (make-local-variable 'imenu-create-index-function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3350 #'js--imenu-create-index)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3351
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3352 (setq major-mode 'js-mode)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3353 (setq mode-name "Javascript")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3354
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3355 ;; for filling, pretend we're cc-mode
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3356 (setq c-comment-prefix-regexp "//+\\|\\**"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3357 c-paragraph-start "$"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3358 c-paragraph-separate "$"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3359 c-block-comment-prefix "* "
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3360 c-line-comment-starter "//"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3361 c-comment-start-regexp "/[*/]\\|\\s!"
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3362 comment-start-skip "\\(//+\\|/\\*+\\)\\s *")
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3363
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3364 (let ((c-buffer-is-cc-mode t))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3365 (c-setup-paragraph-variables))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3366
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3367 (set (make-local-variable 'syntax-begin-function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3368 #'js--syntax-begin-function)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3369
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3370 ;; Important to fontify the whole buffer syntactically! If we don't,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3371 ;; then we might have regular expression literals that aren't marked
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3372 ;; as strings, which will screw up parse-partial-sexp, scan-lists,
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3373 ;; etc. and and produce maddening "unbalanced parenthesis" errors.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3374 ;; When we attempt to find the error and scroll to the portion of
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3375 ;; the buffer containing the problem, JIT-lock will apply the
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3376 ;; correct syntax to the regular expresion literal and the problem
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3377 ;; will mysteriously disappear.
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3378 (font-lock-set-defaults)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3379
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3380 (let (font-lock-keywords) ; leaves syntactic keywords intact
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3381 (font-lock-fontify-buffer)))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3382
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3383 (defalias 'javascript-mode 'js-mode)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3384
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3385 (eval-after-load 'folding
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3386 '(when (fboundp 'folding-add-to-marks-list)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3387 (folding-add-to-marks-list 'js-mode "// {{{" "// }}}" )))
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3388
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3389 (provide 'js)
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3390
ea67ac46d172 * progmodes/js2-mode.el: File removed.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3391 ;; js.el ends here