USING: assocs help.markup help.syntax words ;
IN: compiler.crossref
+HELP: compiled-crossref
+{ $var-description "A hashtable that maps words to other words that depend on them. It also stores the types of the dependencies." } ;
+
HELP: load-dependencies
{ $values { "word" word } { "assoc" assoc } }
{ $description "Creates an assoc where keys are the words the word depends on and values are the dependency type." } ;
-USING: compiler.crossref fry kernel sequences tools.test vocabs words ;
+USING: compiler.crossref fry kernel namespaces sequences
+stack-checker.dependencies tools.test vocabs words ;
IN: compiler.crossref.tests
! Dependencies of all words should always be satisfied unless we're
all-words dup [ subwords ] map concat append
H{ } clone '[ _ dependencies-satisfied? ] reject
] unit-test
+
+: setup-crossref ( -- assoc )
+ H{
+ {
+ 10
+ H{
+ { 20 definition-dependency }
+ { 30 conditional-dependency }
+ { 40 effect-dependency }
+ }
+ }
+ } clone ;
+
+! dependencies-of
+{
+ H{ { 20 definition-dependency } }
+} [
+ setup-crossref compiled-crossref [
+ 10 definition-dependency dependencies-of
+ ] with-variable
+] unit-test
+
+{
+ H{ { 20 definition-dependency } { 30 conditional-dependency } }
+} [
+ setup-crossref compiled-crossref [
+ 10 conditional-dependency dependencies-of
+ ] with-variable
+] unit-test
+
+! join-dependencies
+{
+ H{
+ { 1 effect-dependency }
+ { 2 effect-dependency }
+ { 3 conditional-dependency }
+ { 4 conditional-dependency }
+ { 5 definition-dependency }
+ { 6 definition-dependency }
+ }
+} [
+ { 1 2 } { 3 4 } { 5 6 } join-dependencies
+] unit-test
generic-call-site-crossref [ H{ } clone ] initialize
-: effect-dependencies-of ( word -- assoc )
+: all-dependencies-of ( word -- assoc )
compiled-crossref get at ;
-: definition-dependencies-of ( word -- assoc )
- effect-dependencies-of [ nip definition-dependency dependency>= ] assoc-filter ;
-
-: conditional-dependencies-of ( word -- assoc )
- effect-dependencies-of [ nip conditional-dependency dependency>= ] assoc-filter ;
+: dependencies-of ( word dep-type -- assoc )
+ [ all-dependencies-of ] dip '[ nip _ dependency>= ] assoc-filter ;
: outdated-definition-usages ( set -- assocs )
- members [ word? ] filter [ definition-dependencies-of ] map ;
+ members [ word? ] filter [ definition-dependency dependencies-of ] map ;
: outdated-effect-usages ( set -- assocs )
- members [ word? ] filter [ effect-dependencies-of ] map ;
+ members [ word? ] filter [ all-dependencies-of ] map ;
: dependencies-satisfied? ( word cache -- ? )
[ "dependency-checks" word-prop ] dip
: outdated-conditional-usages ( set -- assocs )
members H{ } clone '[
- conditional-dependencies-of
+ conditional-dependency dependencies-of
[ drop _ dependencies-satisfied? ] assoc-reject
] map ;
{ } [ "IN: generic.standard.tests USE: math FORGET: M\\ integer forget-test" eval( -- ) ] unit-test
{ { } } [
- \ + effect-dependencies-of keys [ method? ] filter
+ \ + all-dependencies-of keys [ method? ] filter
[ "method-generic" word-prop \ forget-test eq? ] filter
] unit-test