Update copyright year to 2014 by running admin/update-copyright.
[emacs.git] / lisp / cedet / semantic / wisent / javascript.el
blob5fcda5931b0b471c7be549e754975c9592e2ac17
1 ;;; semantic/wisent/javascript.el --- javascript parser support
3 ;; Copyright (C) 2005, 2009-2014 Free Software Foundation, Inc.
5 ;; Author: Eric Ludlam <zappo@gnu.org>
6 ;; Keywords: syntax
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/>.
23 ;;; Commentary:
25 ;; Parser support for javascript language.
28 ;;; Code:
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.
44 (while elts
45 ;; For each name element, clone the initial tag and give it
46 ;; the name of the element.
47 (setq elt (car elts)
48 elts (cdr elts)
49 clone (semantic-tag-clone tag (car elt))
50 value (car (cdr 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
57 ;; element.
58 (semantic-tag-set-bounds clone start end))
59 xpand)))
61 ;;; Override Methods
63 ;; These methods override aspects of how semantic-tools can access
64 ;; the tags created by the javascript parser.
65 ;; Local context
66 (define-mode-local-override semantic-get-local-variables
67 javascript-mode ()
68 "Get local values from a specific context.
69 This function overrides `get-local-variables'."
70 ;; Does javascript have identifiable local variables?
71 nil)
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
80 classes.
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."
86 nil)
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."
93 nil)
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."
101 (save-excursion
102 (if point (goto-char point))
103 (let* ((case-fold-search semantic-case-fold)
104 symlist tmp end)
105 (with-syntax-table semantic-lex-syntax-table
106 (save-excursion
107 (when (looking-at "\\w\\|\\s_")
108 (forward-sexp 1))
109 (setq end (point))
110 (unless (re-search-backward "\\s-" (point-at-bol) t)
111 (beginning-of-line))
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))))))))
118 ;;; Setup Function
120 ;; Since javascript-mode is an alias for js-mode, let it inherit all
121 ;; the overrides.
122 (define-child-mode js-mode javascript-mode)
124 ;; Since javascript-mode is an alias for js-mode, let it inherit all
125 ;; the overrides.
126 (define-child-mode js-mode javascript-mode)
128 ;; In semantic-imenu.el, not part of Emacs.
129 (defvar semantic-imenu-summary-function)
131 ;;;###autoload
132 (defun wisent-javascript-setup-parser ()
133 "Setup buffer for parse."
134 (wisent-javascript-jv-wy--install-parser)
135 (setq
136 ;; Lexical Analysis
137 semantic-lex-analyzer 'javascript-lexer-jv
138 semantic-lex-number-expression semantic-java-number-regexp
139 ;; semantic-lex-depth nil ;; Full lexical analysis
140 ;; Parsing
141 semantic-tag-expand-function 'wisent-javascript-jv-expand-tag
142 ;; Environment
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)
150 ;; Local variables:
151 ;; generated-autoload-file: "../loaddefs.el"
152 ;; generated-autoload-load-name: "semantic/wisent/javascript"
153 ;; End:
155 ;;; semantic/wisent/javascript-jv.el ends here