Function: js--splice-into-items
js--splice-into-items is a byte-compiled function defined in js.el.gz.
Signature
(js--splice-into-items ITEMS CHILD NAME-PARTS)
Documentation
Splice CHILD into the js--pitem ITEMS at NAME-PARTS.
If a class doesn't exist in the tree, create it. Return the new items list. NAME-PARTS is a list of strings given the broken-down class name of the item to insert.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/js.el.gz
(defun js--splice-into-items (items child name-parts)
"Splice CHILD into the `js--pitem' ITEMS at NAME-PARTS.
If a class doesn't exist in the tree, create it. Return
the new items list. NAME-PARTS is a list of strings given
the broken-down class name of the item to insert."
(let ((top-name (car name-parts))
(item-ptr items)
new-items last-new-item new-cons)
(js--debug "js--splice-into-items: name-parts: %S items:%S"
name-parts
(mapcar #'js--pitem-name items))
(cl-assert (stringp top-name))
(cl-assert (> (length top-name) 0))
;; If top-name isn't found in items, then we build a copy of items
;; and throw it away. But that's okay, since most of the time, we
;; *will* find an instance.
(while (and item-ptr
(cond ((equal (js--pitem-strname (car item-ptr)) top-name)
;; Okay, we found an entry with the right name. Splice
;; the merged item into the list...
(setq new-cons (cons (js--make-merged-item
(car item-ptr) child
name-parts)
(cdr item-ptr)))
(if last-new-item
(setcdr last-new-item new-cons)
(setq new-items new-cons))
;; ...and terminate the loop
nil)
(t
;; Otherwise, copy the current cons and move onto the
;; text. This is tricky; we keep track of the tail of
;; the list that begins with new-items in
;; last-new-item.
(setq new-cons (cons (car item-ptr) nil))
(if last-new-item
(setcdr last-new-item new-cons)
(setq new-items new-cons))
(setq last-new-item new-cons)
;; Go to the next cell in items
(setq item-ptr (cdr item-ptr))))))
(if item-ptr
;; Yay! We stopped because we found something, not because
;; we ran out of items to search. Just return the new
;; list.
(progn
(js--debug "search succeeded: %S" name-parts)
new-items)
;; We didn't find anything. If the child is a class and we don't
;; have any classes to drill down into, just push that class;
;; otherwise, make a fake class and carry on.
(js--debug "search failed: %S" name-parts)
(cons (if (cdr name-parts)
;; We have name-parts left to process. Make a fake
;; class for this particular part...
(make-js--pitem
;; ...and recursively digest the rest of the name
:children (js--splice-into-items
nil child (cdr name-parts))
:type js--dummy-class-style
:name top-name)
;; Otherwise, this is the only name we have, so stick
;; the item on the front of the list
child)
items))))