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
//! # Concrete syntax tree of types
//!
//! Type syntax:
//! ```text
//! type ::= primitive-type
//!        | generic-type
//!        | deduced-type
//!        | user-type
//!
//! primitive-type ::= 'any' | 'char' | 'float' | 'int' | 'object' | 'string' | 'void'
//!
//! generic-type ::= 'vector' '<' generic-type-parameter '>'
//!
//! generic-type-parameter-list ::= generic-type-parameter-list ',' type
//!                               | type
//!
//! deduced-type ::= 'auto'
//!
//! user-type ::= identifier
//! ```

use smallvec::SmallVec;

use crate::diag::location::{SourceLoc, SourceRange};
use crate::syntax::id::Identifier;
use crate::syntax::token::Token;

#[cfg_attr(test, derive(Debug))]
pub enum ConcreteType<'a> {
    PrimitiveType(Token<'a>),
    GenericType(Box<ConcreteGenericType<'a>>),
    DeducedType(SourceRange),
    UserType(Identifier<'a>)
}

#[cfg_attr(test, derive(Debug))]
pub struct ConcreteGenericType<'a> {
    pub base: Token<'a>,
    pub inner: SmallVec<[ConcreteType<'a>; 2]>,
    pub left_angle: SourceLoc,
    pub right_angle: SourceLoc
}