1use core::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 { declarator: Box<DirectDeclarator>, assignment_expression: Option<Expression> },
239 Function { declarator: Box<DirectDeclarator>, parameter_type_list: Option<ParameterTypeList>, identifier_list: Option<Vec<String>> },
240}
241
242#[derive(Debug, Clone, PartialEq)]
244pub struct ParameterTypeList {
245 pub parameter_list: Vec<ParameterDeclaration>,
246 pub variadic: bool,
247 pub span: SourceSpan,
248}
249
250#[derive(Debug, Clone, PartialEq)]
252pub struct ParameterDeclaration {
253 pub declaration_specifiers: Vec<DeclarationSpecifier>,
254 pub declarator: Option<Declarator>,
255 pub abstract_declarator: Option<AbstractDeclarator>,
256 pub span: SourceSpan,
257}
258
259#[derive(Debug, Clone, PartialEq)]
261pub struct AbstractDeclarator {
262 pub pointer: Option<Pointer>,
263 pub direct_abstract_declarator: Option<Box<DirectAbstractDeclarator>>,
264 pub span: SourceSpan,
265}
266
267#[derive(Debug, Clone, PartialEq)]
269pub enum DirectAbstractDeclarator {
270 AbstractDeclarator(Box<AbstractDeclarator>),
271 Array { declarator: Option<Box<DirectAbstractDeclarator>>, assignment_expression: Option<Box<Expression>> },
272 Function { declarator: Option<Box<DirectAbstractDeclarator>>, parameter_type_list: Option<ParameterTypeList> },
273}
274
275#[derive(Debug, Clone, PartialEq)]
277pub enum Initializer {
278 AssignmentExpression(Expression),
279 InitializerList(Vec<Initializer>),
280}
281
282#[derive(Debug, Clone, PartialEq)]
284pub enum Statement {
285 Labeled(LabeledStatement),
286 Compound(CompoundStatement),
287 Expression(ExpressionStatement),
288 Selection(SelectionStatement),
289 Iteration(IterationStatement),
290 Jump(JumpStatement),
291}
292
293#[derive(Debug, Clone, PartialEq)]
295pub enum LabeledStatement {
296 Label { identifier: String, statement: Box<Statement> },
297 Case { constant_expression: Expression, statement: Box<Statement> },
298 Default { statement: Box<Statement> },
299}
300
301#[derive(Debug, Clone, PartialEq)]
303pub struct CompoundStatement {
304 pub block_items: Vec<BlockItem>,
305 pub span: SourceSpan,
306}
307
308#[derive(Debug, Clone, PartialEq)]
310pub enum BlockItem {
311 Declaration(Declaration),
312 Statement(Statement),
313}
314
315#[derive(Debug, Clone, PartialEq)]
317pub struct ExpressionStatement {
318 pub expression: Option<Expression>,
319 pub span: SourceSpan,
320}
321
322#[derive(Debug, Clone, PartialEq)]
324pub enum SelectionStatement {
325 If { condition: Expression, then_statement: Box<Statement>, else_statement: Option<Box<Statement>> },
326 Switch { expression: Expression, statement: Box<Statement> },
327}
328
329#[derive(Debug, Clone, PartialEq)]
331pub enum IterationStatement {
332 While { condition: Expression, statement: Box<Statement> },
333 DoWhile { statement: Box<Statement>, condition: Expression },
334 For { init: Option<Expression>, condition: Option<Expression>, update: Option<Expression>, statement: Box<Statement> },
335}
336
337#[derive(Debug, Clone, PartialEq)]
339pub enum JumpStatement {
340 Goto(String),
341 Continue,
342 Break,
343 Return(Option<Expression>),
344}
345
346#[derive(Debug, Clone, PartialEq)]
348pub struct Expression {
349 pub kind: Box<ExpressionKind>,
350 pub span: SourceSpan,
351}
352
353#[derive(Debug, Clone, PartialEq)]
355pub enum ExpressionKind {
356 Identifier(String),
357 Constant(Constant),
358 StringLiteral(String),
359 ArraySubscript {
360 array: Box<Expression>,
361 index: Box<Expression>,
362 },
363 FunctionCall {
364 function: Box<Expression>,
365 arguments: Vec<Expression>,
366 },
367 MemberAccess {
368 object: Box<Expression>,
369 member: String,
370 is_pointer: bool, },
372 PostfixIncDec {
373 operand: Box<Expression>,
374 is_increment: bool,
375 },
376 PrefixIncDec {
377 operand: Box<Expression>,
378 is_increment: bool,
379 },
380 Unary {
381 operator: UnaryOperator,
382 operand: Box<Expression>,
383 },
384 Cast {
385 type_name: Box<TypeName>,
386 expression: Box<Expression>,
387 },
388 Binary {
389 left: Box<Expression>,
390 operator: BinaryOperator,
391 right: Box<Expression>,
392 },
393 Conditional {
394 condition: Box<Expression>,
395 then_expr: Box<Expression>,
396 else_expr: Box<Expression>,
397 },
398 Assignment {
399 left: Box<Expression>,
400 operator: AssignmentOperator,
401 right: Box<Expression>,
402 },
403 Comma {
404 expressions: Vec<Expression>,
405 },
406}
407
408#[derive(Debug, Clone, PartialEq)]
410pub enum Constant {
411 Integer(i64),
412 Float(f64),
413 Character(char),
414}
415
416#[derive(Debug, Clone, PartialEq)]
418pub enum UnaryOperator {
419 AddressOf, Dereference, Plus, Minus, BitwiseNot, LogicalNot, Sizeof, }
427
428#[derive(Debug, Clone, PartialEq)]
430pub enum BinaryOperator {
431 Add, Subtract, Multiply, Divide, Modulo, BitwiseAnd, BitwiseOr, BitwiseXor, LeftShift, RightShift, Equal, NotEqual, Less, Greater, LessEqual, GreaterEqual, LogicalAnd, LogicalOr, }
457
458#[derive(Debug, Clone, PartialEq)]
460pub enum AssignmentOperator {
461 Assign, AddAssign, SubAssign, MulAssign, DivAssign, ModAssign, AndAssign, OrAssign, XorAssign, LeftShiftAssign, RightShiftAssign, }
473
474#[derive(Debug, Clone, PartialEq)]
476pub struct TypeName {
477 pub specifier_qualifiers: Vec<SpecifierQualifier>,
478 pub abstract_declarator: Option<Box<AbstractDeclarator>>,
479 pub span: SourceSpan,
480}
481
482impl CAst {
483 pub fn new(translation_unit: TranslationUnit) -> Self {
484 Self { translation_unit }
485 }
486}
487
488impl TranslationUnit {
489 pub fn new(external_declarations: Vec<ExternalDeclaration>, span: SourceSpan) -> Self {
490 Self { external_declarations, span }
491 }
492}