1use oak_core::{ElementType, UniversalElementRole};
2use std::fmt;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub enum GsglElementType {
8 Root,
10 SourceFile,
12 FunctionDefinition,
14 VariableDeclaration,
16 StructDefinition,
18 Block,
20 IfStatement,
22 ForStatement,
24 WhileStatement,
26 ReturnStatement,
28
29 Shader,
31 Vertex,
33 Fragment,
35 Geometry,
37 Compute,
39 Uniform,
41 Attribute,
43 Varying,
45 In,
47 Out,
49 Inout,
51 Const,
53 Struct,
55 If,
57 Else,
59 For,
61 While,
63 Do,
65 Break,
67 Continue,
69 Return,
71 Discard,
73 True,
75 False,
77
78 Float,
80 Int,
82 Bool,
84 Vec2,
86 Vec3,
88 Vec4,
90 Mat2,
92 Mat3,
94 Mat4,
96 Sampler2D,
98 SamplerCube,
100 Void,
102
103 Identifier,
105 Number,
107 String,
109
110 Plus,
112 Minus,
114 Star,
116 Slash,
118 Percent,
120 Assign,
122 PlusAssign,
124 MinusAssign,
126 StarAssign,
128 SlashAssign,
130
131 Eq,
133 Ne,
135 Lt,
137 Le,
139 Gt,
141 Ge,
143
144 And,
146 Or,
148 Not,
150
151 BitAnd,
153 BitOr,
155 BitXor,
157 BitNot,
159 LeftShift,
161 RightShift,
163
164 LeftParen,
166 RightParen,
168 LeftBrace,
170 RightBrace,
172 LeftBracket,
174 RightBracket,
176 Semicolon,
178 Comma,
180 Dot,
182 Colon,
184 Question,
186 Hash,
188 At,
190
191 Preprocessor,
193 Include,
195 Define,
197 Ifdef,
199 Ifndef,
201 Endif,
203 Version,
205
206 Sin,
208 Cos,
210 Tan,
212 Sqrt,
214 Pow,
216 Exp,
218 Log,
220 Abs,
222 Sign,
224 Floor,
226 Ceil,
228 Fract,
230 Mod,
232 Min,
234 Max,
236 Clamp,
238 Mix,
240 Step,
242 Smoothstep,
244 Length,
246 Distance,
248 DotProduct,
250 Cross,
252 Normalize,
254 Faceforward,
256 Reflect,
258 Refract,
260
261 Whitespace,
263 Comment,
265 Newline,
267 Eof,
269 Error,
271
272 FunctionDecl,
274 VariableDecl,
276 StructDecl,
278 Statement,
280 Expression,
282 Parameter,
284 Argument,
286 FieldAccess,
288 ArrayAccess,
290 FunctionCall,
292 BinaryExpr,
294 UnaryExpr,
296 AssignmentExpr,
298 ConditionalExpr,
300 Literal,
302}
303
304impl GsglElementType {
305 pub fn is_keyword(self) -> bool {
307 matches!(
308 self,
309 Self::Shader
310 | Self::Vertex
311 | Self::Fragment
312 | Self::Geometry
313 | Self::Compute
314 | Self::Uniform
315 | Self::Attribute
316 | Self::Varying
317 | Self::In
318 | Self::Out
319 | Self::Inout
320 | Self::Const
321 | Self::Struct
322 | Self::If
323 | Self::Else
324 | Self::For
325 | Self::While
326 | Self::Do
327 | Self::Break
328 | Self::Continue
329 | Self::Return
330 | Self::Discard
331 | Self::True
332 | Self::False
333 )
334 }
335
336 pub fn is_type(self) -> bool {
338 matches!(self, Self::Float | Self::Int | Self::Bool | Self::Vec2 | Self::Vec3 | Self::Vec4 | Self::Mat2 | Self::Mat3 | Self::Mat4 | Self::Sampler2D | Self::SamplerCube | Self::Void)
339 }
340
341 pub fn is_operator(self) -> bool {
343 matches!(
344 self,
345 Self::Plus
346 | Self::Minus
347 | Self::Star
348 | Self::Slash
349 | Self::Percent
350 | Self::Assign
351 | Self::PlusAssign
352 | Self::MinusAssign
353 | Self::StarAssign
354 | Self::SlashAssign
355 | Self::Eq
356 | Self::Ne
357 | Self::Lt
358 | Self::Le
359 | Self::Gt
360 | Self::Ge
361 | Self::And
362 | Self::Or
363 | Self::Not
364 | Self::BitAnd
365 | Self::BitOr
366 | Self::BitXor
367 | Self::BitNot
368 | Self::LeftShift
369 | Self::RightShift
370 )
371 }
372}
373
374impl fmt::Display for GsglElementType {
375 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
376 let name = match self {
377 Self::Root => "ROOT",
378 Self::SourceFile => "SOURCE_FILE",
379 Self::Shader => "shader",
380 Self::Vertex => "vertex",
381 Self::Fragment => "fragment",
382 Self::Geometry => "geometry",
383 Self::Compute => "compute",
384 Self::Uniform => "uniform",
385 Self::Attribute => "attribute",
386 Self::Varying => "varying",
387 Self::In => "in",
388 Self::Out => "out",
389 Self::Inout => "inout",
390 Self::Const => "const",
391 Self::Struct => "struct",
392 Self::If => "if",
393 Self::Else => "else",
394 Self::For => "for",
395 Self::While => "while",
396 Self::Do => "do",
397 Self::Break => "break",
398 Self::Continue => "continue",
399 Self::Return => "return",
400 Self::Discard => "discard",
401 Self::True => "true",
402 Self::False => "false",
403 Self::Float => "float",
404 Self::Int => "int",
405 Self::Bool => "bool",
406 Self::Vec2 => "vec2",
407 Self::Vec3 => "vec3",
408 Self::Vec4 => "vec4",
409 Self::Mat2 => "mat2",
410 Self::Mat3 => "mat3",
411 Self::Mat4 => "mat4",
412 Self::Sampler2D => "sampler2D",
413 Self::SamplerCube => "samplerCube",
414 Self::Void => "void",
415 Self::Identifier => "IDENTIFIER",
416 Self::Number => "NUMBER",
417 Self::String => "STRING",
418 Self::Plus => "+",
419 Self::Minus => "-",
420 Self::Star => "*",
421 Self::Slash => "/",
422 Self::Percent => "%",
423 Self::Assign => "=",
424 Self::PlusAssign => "+=",
425 Self::MinusAssign => "-=",
426 Self::StarAssign => "*=",
427 Self::SlashAssign => "/=",
428 Self::Eq => "==",
429 Self::Ne => "!=",
430 Self::Lt => "<",
431 Self::Le => "<=",
432 Self::Gt => ">",
433 Self::Ge => ">=",
434 Self::And => "&&",
435 Self::Or => "||",
436 Self::Not => "!",
437 Self::BitAnd => "&",
438 Self::BitOr => "|",
439 Self::BitXor => "^",
440 Self::BitNot => "~",
441 Self::LeftShift => "<<",
442 Self::RightShift => ">>",
443 Self::LeftParen => "(",
444 Self::RightParen => ")",
445 Self::LeftBrace => "{",
446 Self::RightBrace => "}",
447 Self::LeftBracket => "[",
448 Self::RightBracket => "]",
449 Self::Semicolon => ";",
450 Self::Comma => ",",
451 Self::Dot => ".",
452 Self::Colon => ":",
453 Self::Question => "?",
454 Self::Hash => "#",
455 Self::At => "@",
456 Self::Preprocessor => "PREPROCESSOR",
457 Self::Include => "#include",
458 Self::Define => "#define",
459 Self::Ifdef => "#ifdef",
460 Self::Ifndef => "#ifndef",
461 Self::Endif => "#endif",
462 Self::Version => "#version",
463 Self::Sin => "sin",
464 Self::Cos => "cos",
465 Self::Tan => "tan",
466 Self::Sqrt => "sqrt",
467 Self::Pow => "pow",
468 Self::Abs => "abs",
469 Self::Min => "min",
470 Self::Max => "max",
471 Self::Clamp => "clamp",
472 Self::Mix => "mix",
473 Self::Step => "step",
474 Self::Smoothstep => "smoothstep",
475 Self::Length => "length",
476 Self::Distance => "distance",
477 Self::DotProduct => "dot",
478 Self::Whitespace => "WHITESPACE",
479 Self::Newline => "NEWLINE",
480 Self::Comment => "COMMENT",
481 Self::Error => "ERROR",
482 Self::Eof => "EOF",
483 Self::FunctionDecl => "FUNCTION_DECL",
484 Self::VariableDecl => "VARIABLE_DECL",
485 Self::StructDecl => "STRUCT_DECL",
486 Self::Statement => "STATEMENT",
487 Self::Expression => "EXPRESSION",
488 Self::Parameter => "PARAMETER",
489 Self::Argument => "ARGUMENT",
490 Self::FieldAccess => "FIELD_ACCESS",
491 Self::ArrayAccess => "ARRAY_ACCESS",
492 Self::FunctionCall => "FUNCTION_CALL",
493 Self::BinaryExpr => "BINARY_EXPR",
494 Self::UnaryExpr => "UNARY_EXPR",
495 Self::AssignmentExpr => "ASSIGNMENT_EXPR",
496 Self::ConditionalExpr => "CONDITIONAL_EXPR",
497 Self::Literal => "LITERAL",
498 _ => "UNKNOWN",
499 };
500 write!(f, "{}", name)
501 }
502}
503
504impl ElementType for GsglElementType {
505 type Role = UniversalElementRole;
506
507 fn role(&self) -> Self::Role {
508 match self {
509 Self::Root | Self::SourceFile => UniversalElementRole::Root,
510 Self::FunctionDefinition | Self::FunctionDecl => UniversalElementRole::Definition,
511 Self::VariableDeclaration | Self::VariableDecl => UniversalElementRole::Definition,
512 Self::StructDefinition | Self::StructDecl => UniversalElementRole::Typing,
513 Self::Block => UniversalElementRole::Container,
514 Self::IfStatement => UniversalElementRole::Statement,
515 Self::ForStatement | Self::WhileStatement => UniversalElementRole::Statement,
516 Self::ReturnStatement => UniversalElementRole::Statement,
517 Self::Expression | Self::BinaryExpr | Self::UnaryExpr | Self::AssignmentExpr | Self::ConditionalExpr => UniversalElementRole::Expression,
518 Self::Statement => UniversalElementRole::Statement,
519 _ => UniversalElementRole::None,
520 }
521 }
522}
523
524impl From<crate::lexer::token_type::GsglTokenType> for GsglElementType {
525 fn from(token: crate::lexer::token_type::GsglTokenType) -> Self {
526 use crate::lexer::token_type::GsglTokenType as T;
527 match token {
528 T::Root => Self::Root,
529 T::SourceFile => Self::SourceFile,
530 T::FunctionDefinition => Self::FunctionDefinition,
531 T::VariableDeclaration => Self::VariableDeclaration,
532 T::StructDefinition => Self::StructDefinition,
533 T::Block => Self::Block,
534 T::IfStatement => Self::IfStatement,
535 T::ForStatement => Self::ForStatement,
536 T::WhileStatement => Self::WhileStatement,
537 T::ReturnStatement => Self::ReturnStatement,
538 T::Shader => Self::Shader,
539 T::Vertex => Self::Vertex,
540 T::Fragment => Self::Fragment,
541 T::Geometry => Self::Geometry,
542 T::Compute => Self::Compute,
543 T::Uniform => Self::Uniform,
544 T::Attribute => Self::Attribute,
545 T::Varying => Self::Varying,
546 T::In => Self::In,
547 T::Out => Self::Out,
548 T::Inout => Self::Inout,
549 T::Const => Self::Const,
550 T::Struct => Self::Struct,
551 T::If => Self::If,
552 T::Else => Self::Else,
553 T::For => Self::For,
554 T::While => Self::While,
555 T::Do => Self::Do,
556 T::Break => Self::Break,
557 T::Continue => Self::Continue,
558 T::Return => Self::Return,
559 T::Discard => Self::Discard,
560 T::True => Self::True,
561 T::False => Self::False,
562 T::Float => Self::Float,
563 T::Int => Self::Int,
564 T::Bool => Self::Bool,
565 T::Vec2 => Self::Vec2,
566 T::Vec3 => Self::Vec3,
567 T::Vec4 => Self::Vec4,
568 T::Mat2 => Self::Mat2,
569 T::Mat3 => Self::Mat3,
570 T::Mat4 => Self::Mat4,
571 T::Sampler2D => Self::Sampler2D,
572 T::SamplerCube => Self::SamplerCube,
573 T::Void => Self::Void,
574 T::Identifier => Self::Identifier,
575 T::Number => Self::Number,
576 T::String => Self::String,
577 T::Plus => Self::Plus,
578 T::Minus => Self::Minus,
579 T::Star => Self::Star,
580 T::Slash => Self::Slash,
581 T::Percent => Self::Percent,
582 T::Assign => Self::Assign,
583 T::PlusAssign => Self::PlusAssign,
584 T::MinusAssign => Self::MinusAssign,
585 T::StarAssign => Self::StarAssign,
586 T::SlashAssign => Self::SlashAssign,
587 T::Eq => Self::Eq,
588 T::Ne => Self::Ne,
589 T::Lt => Self::Lt,
590 T::Le => Self::Le,
591 T::Gt => Self::Gt,
592 T::Ge => Self::Ge,
593 T::And => Self::And,
594 T::Or => Self::Or,
595 T::Not => Self::Not,
596 T::BitAnd => Self::BitAnd,
597 T::BitOr => Self::BitOr,
598 T::BitXor => Self::BitXor,
599 T::BitNot => Self::BitNot,
600 T::LeftShift => Self::LeftShift,
601 T::RightShift => Self::RightShift,
602 T::LeftParen => Self::LeftParen,
603 T::RightParen => Self::RightParen,
604 T::LeftBrace => Self::LeftBrace,
605 T::RightBrace => Self::RightBrace,
606 T::LeftBracket => Self::LeftBracket,
607 T::RightBracket => Self::RightBracket,
608 T::Semicolon => Self::Semicolon,
609 T::Comma => Self::Comma,
610 T::Dot => Self::Dot,
611 T::Colon => Self::Colon,
612 T::Question => Self::Question,
613 T::Hash => Self::Hash,
614 T::At => Self::At,
615 T::Preprocessor => Self::Preprocessor,
616 T::Include => Self::Include,
617 T::Define => Self::Define,
618 T::Ifdef => Self::Ifdef,
619 T::Ifndef => Self::Ifndef,
620 T::Endif => Self::Endif,
621 T::Version => Self::Version,
622 T::Sin => Self::Sin,
623 T::Cos => Self::Cos,
624 T::Tan => Self::Tan,
625 T::Sqrt => Self::Sqrt,
626 T::Pow => Self::Pow,
627 T::Exp => Self::Exp,
628 T::Log => Self::Log,
629 T::Abs => Self::Abs,
630 T::Sign => Self::Sign,
631 T::Floor => Self::Floor,
632 T::Ceil => Self::Ceil,
633 T::Fract => Self::Fract,
634 T::Mod => Self::Mod,
635 T::Min => Self::Min,
636 T::Max => Self::Max,
637 T::Clamp => Self::Clamp,
638 T::Mix => Self::Mix,
639 T::Step => Self::Step,
640 T::Smoothstep => Self::Smoothstep,
641 T::Length => Self::Length,
642 T::Distance => Self::Distance,
643 T::DotProduct => Self::DotProduct,
644 T::Cross => Self::Cross,
645 T::Normalize => Self::Normalize,
646 T::Faceforward => Self::Faceforward,
647 T::Reflect => Self::Reflect,
648 T::Refract => Self::Refract,
649 T::Whitespace => Self::Whitespace,
650 T::Comment => Self::Comment,
651 T::Newline => Self::Newline,
652 T::Eof => Self::Eof,
653 T::Error => Self::Error,
654 }
655 }
656}