diff options
author | David Aspinall <da@inf.ed.ac.uk> | 2002-08-28 23:07:41 +0000 |
---|---|---|
committer | David Aspinall <da@inf.ed.ac.uk> | 2002-08-28 23:07:41 +0000 |
commit | 08f9b032abee4323acdf61555bf0cbe512968eda (patch) | |
tree | 6b1bd10f9b1e6cfcdb1a4a3f80003e8523a3b56d /generic/proof-depends.el | |
parent | 78bd1cffbc75c8e56fa3d53eb8bf5751cb38e63c (diff) |
Change to proof-shell-theorem-dependency-regexp; also add code to make nested submenus of deps.
Diffstat (limited to 'generic/proof-depends.el')
-rw-r--r-- | generic/proof-depends.el | 60 |
1 files changed, 53 insertions, 7 deletions
diff --git a/generic/proof-depends.el b/generic/proof-depends.el index 9907f3a5..57500bc8 100644 --- a/generic/proof-depends.el +++ b/generic/proof-depends.el @@ -74,10 +74,15 @@ Called from `proof-done-advancing' when a save is processed and proof-last-theorem-dependencies is set." (set-span-property gspan 'dependencies - proof-last-theorem-dependencies) + ;; Ancestors of NAME are in the second component. + ;; FIXME: for now we ignore the first component: + ;; NAME may not be enough [Isar allows proof regions + ;; with multiple names, which are reported in dep'c'y + ;; output]. + (cdr proof-last-theorem-dependencies)) (let* ((samefilenames (proof-depends-names-in-same-file - proof-last-theorem-dependencies)) + (cdr proof-last-theorem-dependencies))) ;; Find goalsave spans earlier in this file which this ;; one depends on; update their list of dependents, @@ -137,11 +142,52 @@ proof-last-theorem-dependencies is set." span 'dependents) ["Unhighlight all" proof-dep-unhighlight t] "-------------" - (proof-dep-make-submenu "All Dependencies..." - (lambda (name) (car name)) - 'proof-show-dependency - (mapcar 'list (span-property span 'dependencies))))) - + (proof-dep-alldeps-menu span))) + +(defun proof-dep-alldeps-menu (span) + (or (span-property span 'dependencies-menu) ;; cached value + (set-span-property span 'dependencies-menu + (proof-dep-make-alldeps-menu + (span-property span 'dependencies))))) + +(defun proof-dep-make-alldeps-menu (deps) + (let ((menuname "All Dependencies...") + (showdep 'proof-show-dependency)) + (if deps + (let ((nestedtop (proof-dep-split-deps deps))) + (cons menuname + (append + (mapcar (lambda (l) + (vector l (list showdep l) t)) + (cdr nestedtop)) + (mapcar (lambda (sm) + (proof-dep-make-submenu (car sm) + 'car + 'proof-show-dependency + (mapcar 'list (cdr sm)))) + (car nestedtop))))) + (vector menuname nil nil)))) + +(defun proof-dep-split-deps (deps) + "Split dependencies into named nested lists according to dotted prefixes." + ;; NB: could handle deeper nesting here, but just do one level for now. + (let (nested toplevel) + ;; Add each name into a nested list or toplevel list + (mapcar + (lambda (name) + (let* ((period (string-match "\\." name)) + (ns (and period (substring name 0 period))) + (subitems (and ns (assoc ns nested)))) + (cond + ((and ns subitems) + (setcdr subitems (adjoin name (cdr subitems)))) + (ns + (setq nested + (cons (cons ns (list name)) nested))) + (t + (setq toplevel (adjoin name toplevel)))))) + deps) + (cons nested toplevel))) (defun proof-dep-make-submenu (name namefn appfn list) "Make menu items for a submenu NAME, using appfn applied to each elt in LIST. |