1 ! Copyright (C) 2005, 2010 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
5 help.crossref help.topics help.markup quotations accessors
6 source-files namespaces graphs vocabs generic generic.single
7 threads compiler.units init combinators.smart ;
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 over visited get member-eq? [ 2drop ] [
27 [ quot-uses ] curry each
30 : assoc-uses ( assoc' assoc -- )
31 over visited get member-eq? [ 2drop ] [
33 [ quot-uses ] curry [ bi@ ] curry assoc-each
36 M: array quot-uses seq-uses ;
38 M: hashtable quot-uses assoc-uses ;
40 M: callable quot-uses seq-uses ;
42 M: wrapper quot-uses [ wrapped>> ] dip quot-uses ;
44 M: callable uses ( quot -- assoc )
46 H{ } clone [ quot-uses ] keep keys
49 M: word uses def>> uses ;
52 [ { $subsection $subsections $link $see-also } article-links [ >link ] map ]
53 [ { $vocab-link } article-links [ >vocab-link ] map ]
56 M: pathname uses string>> source-file top-level-form>> [ uses ] [ { } ] if* ;
58 ! To make UI browser happy
59 M: vocab uses drop f ;
61 : crossref-def ( defspec -- )
62 dup uses crossref get-global add-vertex ;
64 : defs-to-crossref ( -- seq )
67 [ [ generic? not ] filter ]
68 [ [ subwords ] map concat ] bi
70 all-articles [ >link ] map
72 source-files get keys [ <pathname> ] map
75 : build-crossref ( -- crossref )
76 "Computing usage index... " write flush yield
79 defs-to-crossref [ crossref-def ] each
83 : get-crossref ( -- crossref )
84 crossref get-global [ build-crossref ] unless* ;
86 GENERIC: irrelevant? ( defspec -- ? )
88 M: object irrelevant? drop f ;
90 M: default-method irrelevant? drop t ;
92 M: predicate-engine irrelevant? drop t ;
96 : usage ( defspec -- seq ) get-crossref at keys ;
98 GENERIC: smart-usage ( defspec -- seq )
100 M: object smart-usage usage [ irrelevant? not ] filter ;
102 M: method smart-usage "method-generic" word-prop smart-usage ;
104 M: f smart-usage drop \ f smart-usage ;
106 : synopsis-alist ( definitions -- alist )
107 [ [ synopsis ] keep ] { } map>assoc ;
109 : definitions. ( alist -- )
110 [ write-object nl ] assoc-each ;
112 : sorted-definitions. ( definitions -- )
113 synopsis-alist sort-keys definitions. ;
117 [ "No usages." print ] [ sorted-definitions. ] if-empty ;
119 : vocab-xref ( vocab quot: ( defspec -- seq ) -- vocabs )
120 [ [ vocab-name ] [ words [ generic? not ] filter ] bi ] dip map
122 [ [ word? ] [ generic? not ] bi and ] filter [
124 [ "method-generic" word-prop ] when
127 ] gather natural-sort remove sift ; inline
130 [ dup >vocab-link write-object nl ] each ;
132 : vocab-uses ( vocab -- vocabs ) [ uses ] vocab-xref ;
134 : vocab-uses. ( vocab -- ) vocab-uses vocabs. ;
136 : vocab-usage ( vocab -- vocabs ) [ usage ] vocab-xref ;
138 : vocab-usage. ( vocab -- ) vocab-usage vocabs. ;
142 SINGLETON: invalidate-crossref
144 M: invalidate-crossref definitions-changed 2drop crossref global delete-at ;
146 [ invalidate-crossref add-definition-observer ] "tools.crossref" add-startup-hook