forked from creditkarma/thrift-parser
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathorganizer.ts
96 lines (82 loc) · 2.56 KB
/
organizer.ts
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
import {
ConstDefinition,
CppIncludeDefinition,
EnumDefinition,
ExceptionDefinition,
IncludeDefinition,
NamespaceDefinition,
ServiceDefinition,
StructDefinition,
SyntaxType,
ThriftDocument,
TypedefDefinition,
UnionDefinition,
} from './types'
export function organize(raw: ThriftDocument): ThriftDocument {
const namespaces: Array<NamespaceDefinition> = []
const includes: Array<IncludeDefinition> = []
const cppIncludes: Array<CppIncludeDefinition> = []
const constants: Array<ConstDefinition> = []
const enums: Array<EnumDefinition> = []
const typedefs: Array<TypedefDefinition> = []
const structs: Array<StructDefinition> = []
const unions: Array<UnionDefinition> = []
const exceptions: Array<ExceptionDefinition> = []
const services: Array<ServiceDefinition> = []
for (const next of raw.body) {
switch (next.type) {
case SyntaxType.NamespaceDefinition:
namespaces.push(next)
break
case SyntaxType.IncludeDefinition:
includes.push(next)
break
case SyntaxType.CppIncludeDefinition:
cppIncludes.push(next)
break
case SyntaxType.CppIncludeDefinition:
// We're not generating C++
break
case SyntaxType.ConstDefinition:
constants.push(next)
break
case SyntaxType.EnumDefinition:
enums.push(next)
break
case SyntaxType.StructDefinition:
structs.push(next)
break
case SyntaxType.UnionDefinition:
unions.push(next)
break
case SyntaxType.ExceptionDefinition:
exceptions.push(next)
break
case SyntaxType.TypedefDefinition:
typedefs.push(next)
break
case SyntaxType.ServiceDefinition:
services.push(next)
break
default:
const msg: never = next
throw new Error(`Unexpected statement type found: ${msg}`)
}
}
return {
type: SyntaxType.ThriftDocument,
body: [
...namespaces,
...includes,
...cppIncludes,
...enums,
...typedefs,
...constants,
...structs,
...unions,
...exceptions,
...services,
],
tokens: raw.tokens,
}
}