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