forked from area9innovation/flow9
-
Notifications
You must be signed in to change notification settings - Fork 0
/
export_signature.flow
44 lines (38 loc) · 1.37 KB
/
export_signature.flow
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import tools/flowc/incremental/fitype;
import tools/flowc/incremental/fimodule;
import ds/tree;
import ds/set;
export {
FiExportSignature ::= FiTypeStruct, FiTypeUnion, FiType, FiExportNative;
FiExportNative(io : bool, type : FiType, nativeName : string);
getExportedFiTypes(i : FiModule) -> Tree<string, FiExportSignature>;
}
getExportedFiTypes(i : FiModule) -> Tree<string, FiExportSignature> {
exported = buildSet(i.exports);
structs = fold(i.structs, makeTree(), \acc : Tree<string, FiExportSignature>, s -> {
if (containsSet(exported, s.name)) {
setTree(acc, s.name, s)
} else acc;
});
unions = fold(i.unions, structs, \acc : Tree<string, FiExportSignature>, s -> {
if (containsSet(exported, s.name)) {
setTree(acc, s.name, s)
} else acc;
});
functions = fold(i.functions, unions, \acc: Tree<string, FiExportSignature>, s : FiFunctionDec -> {
if (containsSet(exported, s.name)) {
setTree(acc, s.name, s.type)
} else acc;
});
globalVars = fold(i.globalVars, functions, \acc: Tree<string, FiExportSignature>, s : FiGlobalVar -> {
if (containsSet(exported, s.name)) {
setTree(acc, s.name, s.type)
} else acc;
});
natives = fold(i.natives, globalVars, \acc: Tree<string, FiExportSignature>, n : FiNativeDec -> {
if (containsSet(exported, n.name)) {
setTree(acc, n.name, FiExportNative(n.io, n.type, n.nativeName))
} else acc;
});
natives;
}