forked from area9innovation/flow9
-
Notifications
You must be signed in to change notification settings - Fork 0
/
fcmodule.flow
97 lines (85 loc) · 2.52 KB
/
fcmodule.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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import tools/flowc/fcexp;
import ds/set;
import tools/flowc/incremental/fifileinfo;
export {
FcModule(
fileinfo : FcFileInfo,
imports: [FcImport], // unresolved paths to included modules
forbids : [FcForbid], // unresolved paths to forbid
exports: Set<string>, // names of unions, structs, functions, values, natives
structs : Tree<string, FcTypeStruct>,
unions : Tree<string, FcTypeUnion>,
functions: Tree<string, FcFunctionDec>,
globalVars: Tree<string, FcGlobalVar>,
natives: Tree<string, FcNativeDec>,
// Safe initialization order of globals and functions.
initOrder : [string],
stringIncludes : [FiFileInfo], // "#include file"
// Errors from parsing and desugaring
errors : [FcError],
// Next alpha id
typevarid : int,
isCached : bool,
start : int, end : int
);
FcFileInfo(
flowfile : string, // The path as used by flow imports
trampstamp : double,
fullpath : string, // The full filesystem path
md5sum : string,
mutable content : string,
mutable gensymid : int,
filesize : double
);
FcImport(flowfile : string, dynamic : bool, start : int, end : int);
FcForbid(flowfile : string, start : int, end : int);
FcDeclaration ::= FcFunctionDec, FcGlobalVar, FcNativeDec;
// The info is for the declaration, while the lambda is for the implementation
FcFunctionDec(
name: string,
lambda: Maybe<FcLambda>,
declType : FcTypeFunction2,
declInfo : FcInfo,
defiInfo : FcInfo
);
FcPolymorphicConstraint(from : string, to : string);
FcGlobalVar(
name: string,
value: Maybe<FcExp>,
declInfo : FcInfo,
bodyInfo : FcInfo
);
FcNativeDec(
name: string, io: bool,
type : FcType,
nativeName : string,
flowfallback: Maybe<FcFunctionDec>,
info : FcInfo
);
// Some error message
FcError(message : string, positions : [FcPosition]);
FcPosition(file : string, start : int, end : int);
fcNativeHasFallback(nat : FcNativeDec) -> bool;
fcDeclarationInfo(decl : FcDeclaration) -> FcInfo;
fcCheckAvailableContent(info : FcFileInfo) -> void;
}
fcNativeHasFallback(nat : FcNativeDec) -> bool {
switch (nat.flowfallback) {
None() : false;
Some(__) : true;
}
}
fcDeclarationInfo(decl) {
switch (decl) {
FcFunctionDec(__, __, __, declInfo, __) : declInfo;
FcGlobalVar(__, __, declInfo, __) : declInfo;
FcNativeDec(__, __, __, __, __, info) : info;
}
}
// (Re)Load file content from disk if required.
// Used at least while generating FcInt for hex numbers detection.
fcCheckAvailableContent(info) {
if (info.content == "") {
info.content ::= getFileContent(info.fullpath);
}
}