]> gitweb.factorcode.org Git - factor.git/blob - basis/tools/crossref/crossref.factor
33cdeed2581c3372130d55dac9351fbf9eedb611
[factor.git] / basis / tools / crossref / crossref.factor
1 ! Copyright (C) 2005, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays assocs combinators.smart compiler.units
4 generic generic.single graphs hash-sets.identity hashtables help
5 help.crossref help.markup help.topics init io io.pathnames
6 io.styles kernel namespaces quotations see sequences sets
7 sorting source-files threads vocabs words ;
8 IN: tools.crossref
9
10 SYMBOL: crossref
11
12 GENERIC: uses ( defspec -- seq )
13
14 <PRIVATE
15
16 SYMBOL: visited
17
18 GENERIC# quot-uses 1 ( obj set -- )
19
20 M: object quot-uses 2drop ;
21
22 M: word quot-uses over crossref? [ adjoin ] [ 2drop ] if ;
23
24 : seq-uses ( seq set -- )
25     over visited get ?adjoin [
26         [ quot-uses ] curry each
27     ] [ 2drop ] if ; inline
28
29 : assoc-uses ( assoc' set -- )
30     over visited get ?adjoin [
31         [ quot-uses ] curry [ bi@ ] curry assoc-each
32     ] [ 2drop ] if ; inline
33
34 M: array quot-uses seq-uses ;
35
36 M: hashtable quot-uses assoc-uses ;
37
38 M: callable quot-uses seq-uses ;
39
40 M: wrapper quot-uses [ wrapped>> ] dip quot-uses ;
41
42 M: callable uses ( quot -- seq )
43     IHS{ } clone visited [
44         HS{ } clone [ quot-uses ] keep members
45     ] with-variable ;
46
47 M: word uses def>> uses ;
48
49 M: link uses
50     [ { $subsection $subsections $link $see-also } article-links [ >link ] map ]
51     [ { $vocab-link } article-links [ >vocab-link ] map ]
52     bi append ;
53
54 M: pathname uses string>> source-file top-level-form>> [ uses ] [ { } ] if* ;
55
56 ! To make UI browser happy
57 M: object uses drop f ;
58
59 : crossref-def ( defspec -- )
60     dup uses crossref get-global add-vertex ;
61
62 : defs-to-crossref ( -- seq )
63     [
64         all-words
65         [ [ generic? not ] filter ]
66         [ [ subwords ] map concat ] bi
67
68         all-articles [ >link ] map
69
70         source-files get keys [ <pathname> ] map
71     ] append-outputs ;
72
73 : build-crossref ( -- crossref )
74     "Computing usage index... " write flush yield
75     H{ } clone [
76         crossref set-global
77         defs-to-crossref [ crossref-def ] each
78     ] keep
79     "done" print flush ;
80
81 : get-crossref ( -- crossref )
82     crossref get-global [ build-crossref ] unless* ;
83
84 GENERIC: irrelevant? ( defspec -- ? )
85
86 M: object irrelevant? drop f ;
87
88 M: default-method irrelevant? drop t ;
89
90 M: predicate-engine-word irrelevant? drop t ;
91
92 PRIVATE>
93
94 : usage ( defspec -- seq ) get-crossref at keys ;
95
96 GENERIC: smart-usage ( defspec -- seq )
97
98 M: object smart-usage usage [ irrelevant? not ] filter ;
99
100 M: method smart-usage "method-generic" word-prop smart-usage ;
101
102 M: f smart-usage drop \ f smart-usage ;
103
104 : synopsis-alist ( definitions -- alist )
105     [ [ synopsis ] keep ] { } map>assoc ;
106
107 : definitions. ( alist -- )
108     [ write-object nl ] assoc-each ;
109
110 : sorted-definitions. ( definitions -- )
111     synopsis-alist sort-keys definitions. ;
112
113 : usage. ( word -- )
114     smart-usage
115     [ "No usages." print ] [ sorted-definitions. ] if-empty ;
116
117 : vocab-xref ( vocab quot: ( defspec -- seq ) -- vocabs )
118     [ [ vocab-name ] [ words [ generic? not ] filter ] bi ] dip map
119     [
120         [ [ word? ] [ generic? not ] bi and ] filter [
121             dup method?
122             [ "method-generic" word-prop ] when
123             vocabulary>>
124         ] map
125     ] gather natural-sort remove sift ; inline
126
127 : vocabs. ( seq -- )
128     [ dup >vocab-link write-object nl ] each ;
129
130 : vocab-uses ( vocab -- vocabs ) [ uses ] vocab-xref ;
131
132 : vocab-uses. ( vocab -- ) vocab-uses vocabs. ;
133
134 : vocab-usage ( vocab -- vocabs ) [ usage ] vocab-xref ;
135
136 : vocab-usage. ( vocab -- ) vocab-usage vocabs. ;
137
138 <PRIVATE
139
140 SINGLETON: invalidate-crossref
141
142 M: invalidate-crossref definitions-changed 2drop crossref global delete-at ;
143
144 [ invalidate-crossref add-definition-observer ] "tools.crossref" add-startup-hook
145
146 PRIVATE>