Mercurial > emacs
view lisp/cedet/semantic/tag-write.el @ 110305:b10051866f51
New syntax-propertize functionality.
* lisp/font-lock.el (font-lock-syntactic-keywords): Make obsolete.
(font-lock-fontify-syntactic-keywords-region): Move handling of
font-lock-syntactically-fontified to...
(font-lock-default-fontify-region): ...here.
Let syntax-propertize-function take precedence.
(font-lock-fontify-syntactically-region): Cal syntax-propertize.
* lisp/emacs-lisp/regexp-opt.el (regexp-opt-depth): Skip named groups.
* lisp/emacs-lisp/syntax.el (syntax-propertize-function)
(syntax-propertize-chunk-size, syntax-propertize--done)
(syntax-propertize-extend-region-functions): New vars.
(syntax-propertize-wholelines, syntax-propertize-multiline)
(syntax-propertize--shift-groups, syntax-propertize-via-font-lock)
(syntax-propertize): New functions.
(syntax-propertize-rules): New macro.
(syntax-ppss-flush-cache): Set syntax-propertize--done.
(syntax-ppss): Call syntax-propertize.
* lisp/progmodes/ada-mode.el (ada-set-syntax-table-properties)
(ada-after-change-function, ada-initialize-syntax-table-properties)
(ada-handle-syntax-table-properties): Only define when
syntax-propertize is not available.
(ada-mode): Use syntax-propertize-function.
* lisp/progmodes/autoconf.el (autoconf-mode):
Use syntax-propertize-function.
(autoconf-font-lock-syntactic-keywords): Remove.
* lisp/progmodes/cfengine.el (cfengine-mode):
Use syntax-propertize-function.
(cfengine-font-lock-syntactic-keywords): Remove.
* lisp/progmodes/cperl-mode.el (cperl-mode): Use syntax-propertize-function.
* lisp/progmodes/fortran.el (fortran-mode): Use syntax-propertize-function.
(fortran--font-lock-syntactic-keywords): New var.
(fortran-line-length): Update syntax-propertize-function and
fortran--font-lock-syntactic-keywords.
* lisp/progmodes/gud.el (gdb-script-syntax-propertize-function): New var;
replaces gdb-script-font-lock-syntactic-keywords.
(gdb-script-mode): Use it.
* lisp/progmodes/js.el (js--regexp-literal): Define while compiling.
(js-syntax-propertize-function): New var; replaces
js-font-lock-syntactic-keywords.
(js-mode): Use it.
* lisp/progmodes/make-mode.el (makefile-syntax-propertize-function):
New var; replaces makefile-font-lock-syntactic-keywords.
(makefile-mode): Use it.
(makefile-imake-mode): Adjust.
* lisp/progmodes/mixal-mode.el (mixal-syntax-propertize-function): New var;
replaces mixal-font-lock-syntactic-keywords.
(mixal-mode): Use it.
* lisp/progmodes/octave-mod.el (octave-syntax-propertize-sqs): New function
to replace octave-font-lock-close-quotes.
(octave-syntax-propertize-function): New function to replace
octave-font-lock-syntactic-keywords.
(octave-mode): Use it.
* lisp/progmodes/perl-mode.el (perl-syntax-propertize-function): New fun to
replace perl-font-lock-syntactic-keywords.
(perl-syntax-propertize-special-constructs): New fun to replace
perl-font-lock-special-syntactic-constructs.
(perl-font-lock-syntactic-face-function): New fun.
(perl-mode): Use it.
* lisp/progmodes/python.el (python-syntax-propertize-function): New var to
replace python-font-lock-syntactic-keywords.
(python-mode): Use it.
(python-quote-syntax): Simplify and adjust to new use.
* lisp/progmodes/ruby-mode.el (ruby-here-doc-beg-re):
Define while compiling.
(ruby-here-doc-end-re, ruby-here-doc-beg-match)
(ruby-font-lock-syntactic-keywords, ruby-comment-beg-syntax)
(syntax-ppss, ruby-in-ppss-context-p, ruby-in-here-doc-p)
(ruby-here-doc-find-end, ruby-here-doc-beg-syntax)
(ruby-here-doc-end-syntax): Only define when
syntax-propertize is not available.
(ruby-syntax-propertize-function, ruby-syntax-propertize-heredoc):
New functions.
(ruby-in-ppss-context-p): Update to new syntax of heredocs.
(electric-indent-chars): Silence bytecompiler.
(ruby-mode): Use prog-mode, syntax-propertize-function, and
electric-indent-chars.
* lisp/progmodes/sh-script.el (sh-st-symbol): Remove.
(sh-font-lock-close-heredoc, sh-font-lock-open-heredoc): Add eol arg.
(sh-font-lock-flush-syntax-ppss-cache, sh-font-lock-here-doc): Remove.
(sh-font-lock-quoted-subshell): Assume we've already matched $(.
(sh-font-lock-paren): Set syntax-multiline.
(sh-font-lock-syntactic-keywords): Remove.
(sh-syntax-propertize-function): New function to replace it.
(sh-mode): Use it.
* lisp/progmodes/simula.el (simula-syntax-propertize-function): New var to
replace simula-font-lock-syntactic-keywords.
(simula-mode): Use it.
* lisp/progmodes/tcl.el (tcl-syntax-propertize-function): New var to
replace tcl-font-lock-syntactic-keywords.
(tcl-mode): Use it.
* lisp/progmodes/vhdl-mode.el (vhdl-mode): Use syntax-propertize-function
if available.
(vhdl-fontify-buffer): Adjust.
* lisp/textmodes/bibtex.el (bibtex-mode): Use syntax-propertize-function.
* lisp/textmodes/reftex.el (font-lock-syntactic-keywords): Don't declare
since we don't use it.
* lisp/textmodes/sgml-mode.el (sgml-syntax-propertize-function): New var to
replace sgml-font-lock-syntactic-keywords.
(sgml-mode): Use it.
* lisp/textmodes/tex-mode.el (tex-common-initialization, doctex-mode):
Use syntax-propertize-function.
* lisp/textmodes/texinfo.el (texinfo-syntax-propertize-function): New fun
to replace texinfo-font-lock-syntactic-keywords.
(texinfo-mode): Use it.
* test/indent/octave.m: Remove some `fixindent' not needed any more.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Sat, 11 Sep 2010 01:13:42 +0200 |
parents | 1d1d5d9bd884 |
children | 376148b31b5e |
line wrap: on
line source
;;; semantic/tag-write.el --- Write tags to a text stream ;; Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. ;; Author: Eric M. Ludlam <eric@siege-engine.com> ;; This file is part of GNU Emacs. ;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. ;;; Commentary: ;; ;; Routine for writing out a list of tags to a text stream. ;; ;; These routines will be used by semanticdb to output a tag list into ;; a text stream to be saved to a file. Ideally, you could use tag streams ;; to share tags between processes as well. ;; ;; As a bonus, these routines will also validate the tag structure, and make sure ;; that they conform to good semantic tag hygiene. ;; (require 'semantic) ;;; Code: (defun semantic-tag-write-one-tag (tag &optional indent) "Write a single tag TAG to standard out. INDENT is the amount of indentation to use for this tag." (when (not (semantic-tag-p tag)) (signal 'wrong-type-argument (list tag 'semantic-tag-p))) (when (not indent) (setq indent 0)) ;(princ (make-string indent ? )) (princ "(\"") ;; Base parts (let ((name (semantic-tag-name tag)) (class (semantic-tag-class tag))) (princ name) (princ "\" ") (princ (symbol-name class)) ) (let ((attr (semantic-tag-attributes tag)) ) ;; Attributes (cond ((not attr) (princ " nil")) ((= (length attr) 2) ;; One item (princ " (") (semantic-tag-write-one-attribute attr indent) (princ ")") ) (t ;; More than one tag. (princ "\n") (princ (make-string (+ indent 3) ? )) (princ "(") (while attr (semantic-tag-write-one-attribute attr (+ indent 4)) (setq attr (cdr (cdr attr))) (when attr (princ "\n") (princ (make-string (+ indent 4) ? ))) ) (princ ")\n") (princ (make-string (+ indent 3) ? )) )) ;; Properties - for now, always nil. (let ((rs (semantic--tag-get-property tag 'reparse-symbol))) (if (not rs) (princ " nil") ;; Else, put in the property list. (princ " (reparse-symbol ") (princ (symbol-name rs)) (princ ")")) )) ;; Overlay (if (semantic-tag-with-position-p tag) (let ((bounds (semantic-tag-bounds tag))) (princ " ") (prin1 (apply 'vector bounds)) ) (princ " nil")) ;; End it. (princ ")") ) (defun semantic-tag-write-tag-list (tlist &optional indent dontaddnewline) "Write the tag list TLIST to the current stream. INDENT indicates the current indentation level. If optional DONTADDNEWLINE is non-nil, then don't add a newline." (if (not indent) (setq indent 0) (unless dontaddnewline ;; Assume cursor at end of current line. Add a CR, and make the list. (princ "\n") (princ (make-string indent ? )))) (princ "( ") (while tlist (if (semantic-tag-p (car tlist)) (semantic-tag-write-one-tag (car tlist) (+ indent 2)) ;; If we don't have a tag in the tag list, use the below hack, and hope ;; it doesn't contain anything bad. If we find something bad, go back here ;; and start extending what's expected here. (princ (format "%S" (car tlist)))) (setq tlist (cdr tlist)) (when tlist (princ "\n") (princ (make-string (+ indent 2) ? ))) ) (princ ")") (princ (make-string indent ? )) ) ;; Writing out random stuff. (defun semantic-tag-write-one-attribute (attrs indent) "Write out one attribute from the head of the list of attributes ATTRS. INDENT is the current amount of indentation." (when (not attrs) (signal 'wrong-type-argument (list 'listp attrs))) (when (not (symbolp (car attrs))) (error "Bad Attribute List in tag")) (princ (symbol-name (car attrs))) (princ " ") (semantic-tag-write-one-value (car (cdr attrs)) indent) ) (defun semantic-tag-write-one-value (value indent) "Write out a VALUE for something in a tag. INDENT is the current tag indentation. Items that are long lists of tags may need their own line." (cond ;; Another tag. ((semantic-tag-p value) (semantic-tag-write-one-tag value (+ indent 2))) ;; A list of more tags ((and (listp value) (semantic-tag-p (car value))) (semantic-tag-write-tag-list value (+ indent 2)) ) ;; Some arbitrary data. (t (let ((str (format "%S" value))) ;; Protect against odd data types in tags. (if (= (aref str 0) ?#) (progn (princ "nil") (message "Warning: Value %s not writable in tag." str)) (princ str))))) ) ;;; EIEIO USAGE ;;;###autoload (defun semantic-tag-write-list-slot-value (value) "Write out the VALUE of a slot for EIEIO. The VALUE is a list of tags." (if (not value) (princ "nil") (princ "\n '") (semantic-tag-write-tag-list value 10 t) )) (provide 'semantic/tag-write) ;; Local variables: ;; generated-autoload-file: "loaddefs.el" ;; generated-autoload-load-name: "semantic/tag-write" ;; End: ;; arch-tag: aa2301b3-f0c5-4d73-b456-43eaba5b2198 ;;; semantic/tag-write.el ends here