1 ! Copyright (C) 2005, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: words assocs definitions io io.pathnames io.styles kernel
4 prettyprint sorting see sets sequences arrays hashtables help.crossref
5 help.topics help.markup quotations accessors source-files namespaces
6 graphs vocabs generic generic.standard.engines.tuple threads
12 GENERIC: uses ( defspec -- seq )
18 GENERIC# quot-uses 1 ( obj assoc -- )
20 M: object quot-uses 2drop ;
22 M: word quot-uses over crossref? [ conjoin ] [ 2drop ] if ;
24 : (seq-uses) ( seq assoc -- )
25 [ quot-uses ] curry each ;
27 : seq-uses ( seq assoc -- )
28 over visited get memq? [ 2drop ] [
33 : assoc-uses ( assoc' assoc -- )
34 over visited get memq? [ 2drop ] [
36 [ >alist ] dip (seq-uses)
39 M: array quot-uses seq-uses ;
41 M: hashtable quot-uses assoc-uses ;
43 M: callable quot-uses seq-uses ;
45 M: wrapper quot-uses [ wrapped>> ] dip quot-uses ;
47 M: callable uses ( quot -- assoc )
49 H{ } clone [ quot-uses ] keep keys
52 M: word uses def>> uses ;
54 M: link uses { $subsection $link $see-also } article-links ;
56 M: pathname uses string>> source-file top-level-form>> [ uses ] [ { } ] if* ;
58 GENERIC: crossref-def ( defspec -- )
60 M: object crossref-def
61 dup uses crossref get add-vertex ;
64 [ call-next-method ] [ subwords [ crossref-def ] each ] bi ;
66 : build-crossref ( -- crossref )
67 "Computing usage index... " write flush yield
70 source-files get keys [ <pathname> ] map
71 [ [ crossref-def ] each ] bi@
76 : get-crossref ( -- crossref )
77 crossref global [ drop build-crossref ] cache ;
79 GENERIC: irrelevant? ( defspec -- ? )
81 M: object irrelevant? drop f ;
83 M: default-method irrelevant? drop t ;
85 M: engine-word irrelevant? drop t ;
89 : usage ( defspec -- seq ) get-crossref at keys ;
91 GENERIC: smart-usage ( defspec -- seq )
93 M: object smart-usage usage [ irrelevant? not ] filter ;
95 M: method-body smart-usage "method-generic" word-prop smart-usage ;
97 M: f smart-usage drop \ f smart-usage ;
99 : synopsis-alist ( definitions -- alist )
100 [ [ synopsis ] keep ] { } map>assoc ;
102 : definitions. ( alist -- )
103 [ write-object nl ] assoc-each ;
105 : sorted-definitions. ( definitions -- )
106 synopsis-alist sort-keys definitions. ;
109 smart-usage sorted-definitions. ;
111 : vocab-xref ( vocab quot -- vocabs )
112 [ [ vocab-name ] [ words [ generic? not ] filter ] bi ] dip map
114 [ [ word? ] [ generic? not ] bi and ] filter [
116 [ "method-generic" word-prop ] when
119 ] gather natural-sort remove sift ; inline
122 [ dup >vocab-link write-object nl ] each ;
124 : vocab-uses ( vocab -- vocabs ) [ uses ] vocab-xref ;
126 : vocab-uses. ( vocab -- ) vocab-uses vocabs. ;
128 : vocab-usage ( vocab -- vocabs ) [ usage ] vocab-xref ;
130 : vocab-usage. ( vocab -- ) vocab-usage vocabs. ;
134 SINGLETON: invalidate-crossref
136 M: invalidate-crossref definitions-changed 2drop crossref global delete-at ;
138 [ invalidate-crossref add-definition-observer ] "tools.crossref" add-init-hook