1use std::range::Range;
2
3type SourceSpan = Range<usize>;
4
5#[derive(Debug, Clone, PartialEq)]
7pub struct GraphQLRoot {
8 pub document: Document,
9}
10
11#[derive(Debug, Clone, PartialEq)]
13pub struct Document {
14 pub definitions: Vec<Definition>,
15 pub span: SourceSpan,
16}
17
18#[derive(Debug, Clone, PartialEq)]
20pub enum Definition {
21 Operation(OperationDefinition),
22 Fragment(FragmentDefinition),
23 Schema(SchemaDefinition),
24 Type(TypeDefinition),
25}
26
27#[derive(Debug, Clone, PartialEq)]
29pub struct OperationDefinition {
30 pub operation_type: OperationType,
31 pub name: Option<String>,
32 pub span: SourceSpan,
33}
34
35#[derive(Debug, Clone, PartialEq)]
37pub enum OperationType {
38 Query,
39 Mutation,
40 Subscription,
41}
42
43#[derive(Debug, Clone, PartialEq)]
45pub struct FragmentDefinition {
46 pub name: String,
47 pub span: SourceSpan,
48}
49
50#[derive(Debug, Clone, PartialEq)]
52pub struct SchemaDefinition {
53 pub span: SourceSpan,
54}
55
56#[derive(Debug, Clone, PartialEq)]
58pub struct TypeDefinition {
59 pub name: String,
60 pub span: SourceSpan,
61}
62
63#[derive(Debug, Clone, PartialEq)]
65pub struct CAst {
66 pub translation_unit: TranslationUnit,
67}
68
69#[derive(Debug, Clone, PartialEq)]
71pub struct TranslationUnit {
72 pub external_declarations: Vec<ExternalDeclaration>,
73 pub span: SourceSpan,
74}
75
76#[derive(Debug, Clone, PartialEq)]
78pub enum ExternalDeclaration {
79 FunctionDefinition(FunctionDefinition),
80 Declaration(Declaration),
81}
82
83#[derive(Debug, Clone, PartialEq)]
85pub struct FunctionDefinition {
86 pub declaration_specifiers: Vec<DeclarationSpecifier>,
87 pub declarator: Declarator,
88 pub compound_statement: CompoundStatement,
89 pub span: SourceSpan,
90}
91
92#[derive(Debug, Clone, PartialEq)]
94pub struct Declaration {
95 pub declaration_specifiers: Vec<DeclarationSpecifier>,
96 pub init_declarators: Vec<InitDeclarator>,
97 pub span: SourceSpan,
98}
99
100#[derive(Debug, Clone, PartialEq)]
102pub enum DeclarationSpecifier {
103 StorageClassSpecifier(StorageClassSpecifier),
104 TypeSpecifier(TypeSpecifier),
105 TypeQualifier(TypeQualifier),
106 FunctionSpecifier(FunctionSpecifier),
107}
108
109#[derive(Debug, Clone, PartialEq)]
111pub enum StorageClassSpecifier {
112 Typedef,
113 Extern,
114 Static,
115 Auto,
116 Register,
117}
118
119#[derive(Debug, Clone, PartialEq)]
121pub enum TypeSpecifier {
122 Void,
123 Char,
124 Short,
125 Int,
126 Long,
127 Float,
128 Double,
129 Signed,
130 Unsigned,
131 Bool,
132 Complex,
133 Imaginary,
134 StructOrUnion(StructOrUnionSpecifier),
135 Enum(EnumSpecifier),
136 TypedefName(String),
137}
138
139#[derive(Debug, Clone, PartialEq)]
141pub enum TypeQualifier {
142 Const,
143 Restrict,
144 Volatile,
145}
146
147#[derive(Debug, Clone, PartialEq)]
149pub enum FunctionSpecifier {
150 Inline,
151 Noreturn,
152}
153
154#[derive(Debug, Clone, PartialEq)]
156pub struct StructOrUnionSpecifier {
157 pub struct_or_union: StructOrUnion,
158 pub identifier: Option<String>,
159 pub struct_declarations: Option<Vec<StructDeclaration>>,
160 pub span: SourceSpan,
161}
162
163#[derive(Debug, Clone, PartialEq)]
165pub enum StructOrUnion {
166 Struct,
167 Union,
168}
169
170#[derive(Debug, Clone, PartialEq)]
172pub struct StructDeclaration {
173 pub specifier_qualifiers: Vec<SpecifierQualifier>,
174 pub struct_declarators: Vec<StructDeclarator>,
175 pub span: SourceSpan,
176}
177
178#[derive(Debug, Clone, PartialEq)]
180pub enum SpecifierQualifier {
181 TypeSpecifier(TypeSpecifier),
182 TypeQualifier(TypeQualifier),
183}
184
185#[derive(Debug, Clone, PartialEq)]
187pub struct StructDeclarator {
188 pub declarator: Option<Declarator>,
189 pub constant_expression: Option<Expression>,
190 pub span: SourceSpan,
191}
192
193#[derive(Debug, Clone, PartialEq)]
195pub struct EnumSpecifier {
196 pub identifier: Option<String>,
197 pub enumerators: Option<Vec<Enumerator>>,
198 pub span: SourceSpan,
199}
200
201#[derive(Debug, Clone, PartialEq)]
203pub struct Enumerator {
204 pub identifier: String,
205 pub constant_expression: Option<Expression>,
206 pub span: SourceSpan,
207}
208
209#[derive(Debug, Clone, PartialEq)]
211pub struct InitDeclarator {
212 pub declarator: Declarator,
213 pub initializer: Option<Initializer>,
214 pub span: SourceSpan,
215}
216
217#[derive(Debug, Clone, PartialEq)]
219pub struct Declarator {
220 pub pointer: Option<Pointer>,
221 pub direct_declarator: DirectDeclarator,
222 pub span: SourceSpan,
223}
224
225#[derive(Debug, Clone, PartialEq)]
227pub struct Pointer {
228 pub type_qualifiers: Vec<TypeQualifier>,
229 pub pointer: Option<Box<Pointer>>,
230 pub span: SourceSpan,
231}
232
233#[derive(Debug, Clone, PartialEq)]
235pub enum DirectDeclarator {
236 Identifier(String),
237 Declarator(Box<Declarator>),
238 Array {
239 declarator: Box<DirectDeclarator>,
240 assignment_expression: Option<Expression>,
241 },
242 Function {
243 declarator: Box<DirectDeclarator>,
244 parameter_type_list: Option<ParameterTypeList>,
245 identifier_list: Option<Vec<String>>,
246 },
247}
248
249#[derive(Debug, Clone, PartialEq)]
251pub struct ParameterTypeList {
252 pub parameter_list: Vec<ParameterDeclaration>,
253 pub variadic: bool,
254 pub span: SourceSpan,
255}
256
257#[derive(Debug, Clone, PartialEq)]
259pub struct ParameterDeclaration {
260 pub declaration_specifiers: Vec<DeclarationSpecifier>,
261 pub declarator: Option<Declarator>,
262 pub abstract_declarator: Option<AbstractDeclarator>,
263 pub span: SourceSpan,
264}
265
266#[derive(Debug, Clone, PartialEq)]
268pub struct AbstractDeclarator {
269 pub pointer: Option<Pointer>,
270 pub direct_abstract_declarator: Option<Box<DirectAbstractDeclarator>>,
271 pub span: SourceSpan,
272}
273
274#[derive(Debug, Clone, PartialEq)]
276pub enum DirectAbstractDeclarator {
277 AbstractDeclarator(Box<AbstractDeclarator>),
278 Array { declarator: Option<Box<DirectAbstractDeclarator>>, assignment_expression: Option<Box<Expression>> },
279 Function { declarator: Option<Box<DirectAbstractDeclarator>>, parameter_type_list: Option<ParameterTypeList> },
280}
281
282#[derive(Debug, Clone, PartialEq)]
284pub enum Initializer {
285 AssignmentExpression(Expression),
286 InitializerList(Vec<Initializer>),
287}
288
289#[derive(Debug, Clone, PartialEq)]
291pub enum Statement {
292 Labeled(LabeledStatement),
293 Compound(CompoundStatement),
294 Expression(ExpressionStatement),
295 Selection(SelectionStatement),
296 Iteration(IterationStatement),
297 Jump(JumpStatement),
298}
299
300#[derive(Debug, Clone, PartialEq)]
302pub enum LabeledStatement {
303 Label { identifier: String, statement: Box<Statement> },
304 Case { constant_expression: Expression, statement: Box<Statement> },
305 Default { statement: Box<Statement> },
306}
307
308#[derive(Debug, Clone, PartialEq)]
310pub struct CompoundStatement {
311 pub block_items: Vec<BlockItem>,
312 pub span: SourceSpan,
313}
314
315#[derive(Debug, Clone, PartialEq)]
317pub enum BlockItem {
318 Declaration(Declaration),
319 Statement(Statement),
320}
321
322#[derive(Debug, Clone, PartialEq)]
324pub struct ExpressionStatement {
325 pub expression: Option<Expression>,
326 pub span: SourceSpan,
327}
328
329#[derive(Debug, Clone, PartialEq)]
331pub enum SelectionStatement {
332 If { condition: Expression, then_statement: Box<Statement>, else_statement: Option<Box<Statement>> },
333 Switch { expression: Expression, statement: Box<Statement> },
334}
335
336#[derive(Debug, Clone, PartialEq)]
338pub enum IterationStatement {
339 While { condition: Expression, statement: Box<Statement> },
340 DoWhile { statement: Box<Statement>, condition: Expression },
341 For { init: Option<Expression>, condition: Option<Expression>, update: Option<Expression>, statement: Box<Statement> },
342}
343
344#[derive(Debug, Clone, PartialEq)]
346pub enum JumpStatement {
347 Goto(String),
348 Continue,
349 Break,
350 Return(Option<Expression>),
351}
352
353#[derive(Debug, Clone, PartialEq)]
355pub struct Expression {
356 pub kind: Box<ExpressionKind>,
357 pub span: SourceSpan,
358}
359
360#[derive(Debug, Clone, PartialEq)]
362pub enum ExpressionKind {
363 Identifier(String),
364 Constant(Constant),
365 StringLiteral(String),
366 ArraySubscript {
367 array: Box<Expression>,
368 index: Box<Expression>,
369 },
370 FunctionCall {
371 function: Box<Expression>,
372 arguments: Vec<Expression>,
373 },
374 MemberAccess {
375 object: Box<Expression>,
376 member: String,
377 is_pointer: bool, },
379 PostfixIncDec {
380 operand: Box<Expression>,
381 is_increment: bool,
382 },
383 PrefixIncDec {
384 operand: Box<Expression>,
385 is_increment: bool,
386 },
387 Unary {
388 operator: UnaryOperator,
389 operand: Box<Expression>,
390 },
391 Cast {
392 type_name: Box<TypeName>,
393 expression: Box<Expression>,
394 },
395 Binary {
396 left: Box<Expression>,
397 operator: BinaryOperator,
398 right: Box<Expression>,
399 },
400 Conditional {
401 condition: Box<Expression>,
402 then_expr: Box<Expression>,
403 else_expr: Box<Expression>,
404 },
405 Assignment {
406 left: Box<Expression>,
407 operator: AssignmentOperator,
408 right: Box<Expression>,
409 },
410 Comma {
411 expressions: Vec<Expression>,
412 },
413}
414
415#[derive(Debug, Clone, PartialEq)]
417pub enum Constant {
418 Integer(i64),
419 Float(f64),
420 Character(char),
421}
422
423#[derive(Debug, Clone, PartialEq)]
425pub enum UnaryOperator {
426 AddressOf, Dereference, Plus, Minus, BitwiseNot, LogicalNot, Sizeof, }
434
435#[derive(Debug, Clone, PartialEq)]
437pub enum BinaryOperator {
438 Add, Subtract, Multiply, Divide, Modulo, BitwiseAnd, BitwiseOr, BitwiseXor, LeftShift, RightShift, Equal, NotEqual, Less, Greater, LessEqual, GreaterEqual, LogicalAnd, LogicalOr, }
464
465#[derive(Debug, Clone, PartialEq)]
467pub enum AssignmentOperator {
468 Assign, AddAssign, SubAssign, MulAssign, DivAssign, ModAssign, AndAssign, OrAssign, XorAssign, LeftShiftAssign, RightShiftAssign, }
480
481#[derive(Debug, Clone, PartialEq)]
483pub struct TypeName {
484 pub specifier_qualifiers: Vec<SpecifierQualifier>,
485 pub abstract_declarator: Option<Box<AbstractDeclarator>>,
486 pub span: SourceSpan,
487}
488
489impl CAst {
490 pub fn new(translation_unit: TranslationUnit) -> Self {
491 Self { translation_unit }
492 }
493}
494
495impl TranslationUnit {
496 pub fn new(external_declarations: Vec<ExternalDeclaration>, span: SourceSpan) -> Self {
497 Self { external_declarations, span }
498 }
499}