1 ;;; semantic/wisent/javascript.el --- javascript parser support
3 ;; Copyright (C) 2005, 2009-2012 Free Software Foundation, Inc.
5 ;; Author: Eric Ludlam <zappo@gnu.org>
8 ;; This file is part of GNU Emacs.
10 ;; GNU Emacs is free software: you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation, either version 3 of the License, or
13 ;; (at your option) any later version.
15 ;; GNU Emacs is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
25 ;; Parser support for javascript language.
29 (require 'semantic
/java
)
30 (require 'semantic
/wisent
)
31 (require 'semantic
/wisent
/js-wy
)
33 (defun wisent-javascript-jv-expand-tag (tag)
34 "Expand TAG into a list of equivalent tags, or nil.
35 Expand multiple variable declarations in the same statement, that is
36 tags of class `variable' whose name is equal to a list of elements of
37 the form (NAME VALUE START . END). NAME is a variable name. VALUE is
38 an initializer START and END are the bounds in the declaration, related
39 to this variable NAME."
40 (let (elts elt value clone start end xpand
)
41 (when (and (eq 'variable
(semantic-tag-class tag
))
42 (consp (setq elts
(semantic-tag-name tag
))))
43 ;; There are multiple names in the same variable declaration.
45 ;; For each name element, clone the initial tag and give it
46 ;; the name of the element.
49 clone
(semantic-tag-clone tag
(car elt
))
51 start
(if elts
(car (cddr elt
)) (semantic-tag-start tag
))
52 end
(if xpand
(cdr (cddr elt
)) (semantic-tag-end tag
))
53 xpand
(cons clone xpand
))
54 ;; Set the definition of the cloned tag
55 (semantic-tag-put-attribute clone
:default-value value
)
56 ;; Set the bounds of the cloned tag with those of the name
58 (semantic-tag-set-bounds clone start end
))
63 ;; These methods override aspects of how semantic-tools can access
64 ;; the tags created by the javascript parser.
66 (define-mode-local-override semantic-get-local-variables
68 "Get local values from a specific context.
69 This function overrides `get-local-variables'."
70 ;; Does javascript have identifiable local variables?
73 (define-mode-local-override semantic-tag-protection javascript-mode
(tag &optional parent
)
74 "Return protection information about TAG with optional PARENT.
75 This function returns on of the following symbols:
76 nil - No special protection. Language dependent.
77 'public - Anyone can access this TAG.
78 'private - Only methods in the local scope can access TAG.
79 'protected - Like private for outside scopes, like public for child
81 Some languages may choose to provide additional return symbols specific
82 to themselves. Use of this function should allow for this.
84 The default behavior (if not overridden with `tag-protection'
85 is to return a symbol based on type modifiers."
88 (define-mode-local-override semantic-analyze-scope-calculate-access javascript-mode
(type scope
)
89 "Calculate the access class for TYPE as defined by the current SCOPE.
90 Access is related to the :parents in SCOPE. If type is a member of SCOPE
91 then access would be 'private. If TYPE is inherited by a member of SCOPE,
92 the access would be 'protected. Otherwise, access is 'public."
95 (define-mode-local-override semantic-ctxt-current-symbol javascript-mode
(&optional point
)
96 "Return the current symbol the cursor is on at POINT in a list.
97 This is a very simple implementation for Javascript symbols. It
98 will at maximum do one split, so that the first part is seen as
99 one type. For example: $('#sel').foo.bar will return (\"$('sel').foo\" \"bar\").
100 This is currently needed for the mozrepl omniscient database."
102 (if point
(goto-char point
))
103 (let* ((case-fold-search semantic-case-fold
)
105 (with-syntax-table semantic-lex-syntax-table
107 (when (looking-at "\\w\\|\\s_")
110 (unless (re-search-backward "\\s-" (point-at-bol) t
)
112 (setq tmp
(buffer-substring-no-properties (point) end
))
113 (if (string-match "\\(.+\\)\\." tmp
)
114 (setq symlist
(list (match-string 1 tmp
)
115 (substring tmp
(1+ (match-end 1)) (length tmp
))))
116 (setq symlist
(list tmp
))))))))
120 ;; Since javascript-mode is an alias for js-mode, let it inherit all
122 (define-child-mode js-mode javascript-mode
)
124 ;; Since javascript-mode is an alias for js-mode, let it inherit all
126 (define-child-mode js-mode javascript-mode
)
128 ;; In semantic-imenu.el, not part of Emacs.
129 (defvar semantic-imenu-summary-function
)
132 (defun wisent-javascript-setup-parser ()
133 "Setup buffer for parse."
134 (wisent-javascript-jv-wy--install-parser)
137 semantic-lex-analyzer
'javascript-lexer-jv
138 semantic-lex-number-expression semantic-java-number-regexp
139 ;; semantic-lex-depth nil ;; Full lexical analysis
141 semantic-tag-expand-function
'wisent-javascript-jv-expand-tag
143 semantic-imenu-summary-function
'semantic-format-tag-name
144 imenu-create-index-function
'semantic-create-imenu-index
145 semantic-command-separation-character
";"
148 (provide 'semantic
/wisent
/javascript-jv
)
151 ;; generated-autoload-file: "../loaddefs.el"
152 ;; generated-autoload-load-name: "semantic/wisent/javascript"
155 ;;; semantic/wisent/javascript-jv.el ends here