use crate::Spanned;
use crate::parser::Span;
use crate::r#type::common::{AttributeDirective, DataType};
use crate::r#type::{FunctionSymbol, Immediate, VariableSymbol};
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum ModuleVariableDirective {
Tex {
directive: VariableDirective,
span: Span,
},
Shared {
directive: VariableDirective,
span: Span,
},
Global {
directive: VariableDirective,
span: Span,
},
Const {
directive: VariableDirective,
span: Span,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub struct VariableDirective {
pub attributes: Vec<AttributeDirective>,
pub modifiers: Vec<VariableModifier>,
pub ty: DataType,
pub name: VariableSymbol,
pub array_dims: Vec<Option<u64>>,
pub initializer: Option<GlobalInitializer>,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum VariableModifier {
Vector { value: u32, span: Span },
Alignment { value: u32, span: Span },
Ptr { span: Span },
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum ParameterDirective {
Register {
ty: DataType,
name: VariableSymbol,
span: Span,
},
Parameter {
align: Option<u32>,
ptr: bool,
space: Option<ParamStateSpace>,
ty: DataType,
name: VariableSymbol,
array: Vec<Option<u64>>,
span: Span,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum ParamStateSpace {
Const { span: Span },
Global { span: Span },
Local { span: Span },
Shared { span: Span },
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum InitializerValue {
NumericLiteral { value: Immediate, span: Span },
FunctionSymbol { name: FunctionSymbol, span: Span },
StringLiteral { value: String, span: Span },
}
#[derive(Debug, Clone, PartialEq, Eq, Spanned)]
pub enum GlobalInitializer {
Scalar {
value: InitializerValue,
span: Span,
},
Aggregate {
values: Vec<GlobalInitializer>,
span: Span,
},
}