     (debug-print-analysis node analysis)
     {:id          (:id node)
      :text        (zip/string loc)
+     :nodes       nodes
      :analysis    analysis
      :tokens      tokens                                    ; will be used for soup generation
      :selectables selectables                               ; will be used for selections

(defn prepare-render-infos-of-top-level-forms [editor]
  (let [tree (:parse-tree editor)
        top (make-zipper tree)                              ; root "forms" node
        loc (zip/down top)
        right-siblinks (collect-all-right loc)
        old-forms (get-in editor [:render-state :forms])
        find-old (fn [{:keys [id]}] (some #(if (= (:id %) id) %) old-forms))]
    (map #(merge (find-old (first %)) (prepare-form-render-info %)) right-siblinks)))

(defn analyze-with-delay [editor-id delay]
  (go

(defn extract-selectables-from-docs [docs-infos]
  (flatten (map (fn [info] [(:id info) info]) docs-infos)))

(defn collect-nodes [node]
  (let [relevant-nodes (fn [nodes] (remove #(or (node/whitespace? %) (node/comment? %)) nodes))
        child-nodes (fn [node]
                      (if (node/inner? node)
                        (flatten (map collect-nodes (relevant-nodes (node/children node))))))]
    (concat [(:id node) node] (child-nodes node))))

(defn prepare-form-render-info [loc]
  {:pre [(= (node/tag (zip/node (zip/up loc))) :forms)]}
  (let [node (zip/node loc)
        _ (assert node)
        nodes (apply hash-map (collect-nodes node))
        analysis (->> {}
                   (analyze-scopes node)
                   (analyze-symbols node)
