123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- (require 'semantic)
- (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 "(\"")
-
- (let ((name (semantic-tag-name tag))
- (class (semantic-tag-class tag)))
- (princ name)
- (princ "\" ")
- (princ (symbol-name class))
- )
- (let ((attr (semantic-tag-attributes tag))
- )
-
- (cond ((not attr)
- (princ " nil"))
- ((= (length attr) 2)
- (princ " (")
- (semantic-tag-write-one-attribute attr indent)
- (princ ")")
- )
- (t
-
- (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) ? ))
- ))
-
- (let ((rs (semantic--tag-get-property tag 'reparse-symbol)))
- (if (not rs)
- (princ " nil")
-
- (princ " (reparse-symbol ")
- (princ (symbol-name rs))
- (princ ")"))
- ))
-
- (if (semantic-tag-with-position-p tag)
- (let ((bounds (semantic-tag-bounds tag)))
- (princ " ")
- (prin1 (apply 'vector bounds))
- )
- (princ " nil"))
-
- (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
-
- (princ "\n")
- (princ (make-string indent ? ))))
- (princ "( ")
- (while tlist
- (if (semantic-tag-p (car tlist))
- (semantic-tag-write-one-tag (car tlist) (+ indent 2))
-
-
-
- (princ (format "%S" (car tlist))))
- (setq tlist (cdr tlist))
- (when tlist
- (princ "\n")
- (princ (make-string (+ indent 2) ? )))
- )
- (princ ")")
- (princ (make-string indent ? ))
- )
- (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
-
- ((semantic-tag-p value)
- (semantic-tag-write-one-tag value (+ indent 2)))
-
- ((and (listp value) (semantic-tag-p (car value)))
- (semantic-tag-write-tag-list value (+ indent 2))
- )
-
- (t
- (let ((str (format "%S" value)))
-
- (if (= (aref str 0) ?#)
- (progn
- (princ "nil")
- (message "Warning: Value %s not writable in tag." str))
- (princ str)))))
- )
- (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)
|