Skip to content

Commit 0586f7b

Browse files
committed
handle all type resolution in the lowerer
1 parent 5b04dce commit 0586f7b

24 files changed

+212
-1108
lines changed

naga/src/front/wgsl/error.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,6 @@ pub enum ExpectedToken<'a> {
146146
WorkgroupSizeSeparator,
147147
/// Expected: 'struct', 'let', 'var', 'type', ';', 'fn', eof
148148
GlobalItem,
149-
/// Expected a type.
150-
Type,
151149
/// Access of `var`, `let`, `const`.
152150
Variable,
153151
/// Access of a function
@@ -206,7 +204,6 @@ pub(crate) enum Error<'a> {
206204
UnknownAccess(Span),
207205
UnknownIdent(Span, &'a str),
208206
UnknownScalarType(Span),
209-
UnknownType(Span),
210207
UnknownStorageFormat(Span),
211208
UnknownConservativeDepth(Span),
212209
UnknownEnableExtension(Span, &'a str),
@@ -517,7 +514,6 @@ impl<'a> Error<'a> {
517514
"or the end of the file"
518515
)
519516
.to_string(),
520-
ExpectedToken::Type => "type".to_string(),
521517
ExpectedToken::Variable => "variable access".to_string(),
522518
ExpectedToken::Function => "function name".to_string(),
523519
ExpectedToken::AfterIdentListArg => {
@@ -698,11 +694,6 @@ impl<'a> Error<'a> {
698694
labels: vec![(bad_span, "unknown conservative depth".into())],
699695
notes: vec![],
700696
},
701-
Error::UnknownType(bad_span) => ParseError {
702-
message: format!("unknown type: `{}`", &source[bad_span]),
703-
labels: vec![(bad_span, "unknown type".into())],
704-
notes: vec![],
705-
},
706697
Error::UnknownEnableExtension(span, word) => ParseError {
707698
message: format!("unknown enable-extension `{word}`"),
708699
labels: vec![(span, "".into())],

naga/src/front/wgsl/lower/mod.rs

Lines changed: 55 additions & 205 deletions
Large diffs are not rendered by default.

naga/src/front/wgsl/lower/template_list.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ impl<'iter, 'source> TemplateListIter<'iter, 'source> {
8383
ctx: &mut ExpressionContext<'source, '_, '_>,
8484
) -> Result<'source, ir::ArraySize> {
8585
if let Some(expr) = self.template_list.next() {
86-
lowerer.array_size2(*expr, ctx)
86+
lowerer.array_size(*expr, ctx)
8787
} else {
8888
Ok(ir::ArraySize::Dynamic)
8989
}

naga/src/front/wgsl/parse/ast.rs

Lines changed: 10 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use core::hash::Hash;
44
use crate::diagnostic_filter::DiagnosticFilterNode;
55
use crate::front::wgsl::parse::directive::enable_extension::EnableExtensions;
66
use crate::front::wgsl::parse::number::Number;
7-
use crate::front::wgsl::Scalar;
87
use crate::{Arena, FastIndexSet, Handle, Span};
98

109
#[derive(Debug, Default)]
@@ -24,12 +23,6 @@ pub struct TranslationUnit<'a> {
2423
/// [`Function`]: crate::Function
2524
pub expressions: Arena<Expression<'a>>,
2625

27-
/// Non-user-defined types, like `vec4<f32>` or `array<i32, 10>`.
28-
///
29-
/// These are referred to by `Handle<ast::Type<'a>>` values.
30-
/// User-defined types are referred to by name until lowering.
31-
pub types: Arena<Type<'a>>,
32-
3326
/// Arena for all diagnostic filter rules parsed in this module, including those in functions.
3427
///
3528
/// See [`DiagnosticFilterNode`] for details on how the tree is represented and used in
@@ -139,14 +132,14 @@ pub enum GlobalDeclKind<'a> {
139132
#[derive(Debug)]
140133
pub struct FunctionArgument<'a> {
141134
pub name: Ident<'a>,
142-
pub ty: Handle<Type<'a>>,
135+
pub ty: TemplateElaboratedIdent<'a>,
143136
pub binding: Option<Binding<'a>>,
144137
pub handle: Handle<Local>,
145138
}
146139

147140
#[derive(Debug)]
148141
pub struct FunctionResult<'a> {
149-
pub ty: Handle<Type<'a>>,
142+
pub ty: TemplateElaboratedIdent<'a>,
150143
pub binding: Option<Binding<'a>>,
151144
pub must_use: bool,
152145
}
@@ -194,15 +187,15 @@ pub struct GlobalVariable<'a> {
194187
pub name: Ident<'a>,
195188
pub template_list: Vec<Handle<Expression<'a>>>,
196189
pub binding: Option<ResourceBinding<'a>>,
197-
pub ty: Option<Handle<Type<'a>>>,
190+
pub ty: Option<TemplateElaboratedIdent<'a>>,
198191
pub init: Option<Handle<Expression<'a>>>,
199192
pub doc_comments: Vec<&'a str>,
200193
}
201194

202195
#[derive(Debug)]
203196
pub struct StructMember<'a> {
204197
pub name: Ident<'a>,
205-
pub ty: Handle<Type<'a>>,
198+
pub ty: TemplateElaboratedIdent<'a>,
206199
pub binding: Option<Binding<'a>>,
207200
pub align: Option<Handle<Expression<'a>>>,
208201
pub size: Option<Handle<Expression<'a>>>,
@@ -219,13 +212,13 @@ pub struct Struct<'a> {
219212
#[derive(Debug)]
220213
pub struct TypeAlias<'a> {
221214
pub name: Ident<'a>,
222-
pub ty: Handle<Type<'a>>,
215+
pub ty: TemplateElaboratedIdent<'a>,
223216
}
224217

225218
#[derive(Debug)]
226219
pub struct Const<'a> {
227220
pub name: Ident<'a>,
228-
pub ty: Option<Handle<Type<'a>>>,
221+
pub ty: Option<TemplateElaboratedIdent<'a>>,
229222
pub init: Handle<Expression<'a>>,
230223
pub doc_comments: Vec<&'a str>,
231224
}
@@ -234,69 +227,10 @@ pub struct Const<'a> {
234227
pub struct Override<'a> {
235228
pub name: Ident<'a>,
236229
pub id: Option<Handle<Expression<'a>>>,
237-
pub ty: Option<Handle<Type<'a>>>,
230+
pub ty: Option<TemplateElaboratedIdent<'a>>,
238231
pub init: Option<Handle<Expression<'a>>>,
239232
}
240233

241-
/// The size of an [`Array`] or [`BindingArray`].
242-
///
243-
/// [`Array`]: Type::Array
244-
/// [`BindingArray`]: Type::BindingArray
245-
#[derive(Debug, Copy, Clone)]
246-
pub enum ArraySize<'a> {
247-
/// The length as a constant expression.
248-
Constant(Handle<Expression<'a>>),
249-
Dynamic,
250-
}
251-
252-
#[derive(Debug)]
253-
pub enum Type<'a> {
254-
Scalar(Scalar),
255-
Vector {
256-
size: crate::VectorSize,
257-
ty: Handle<Type<'a>>,
258-
ty_span: Span,
259-
},
260-
Matrix {
261-
columns: crate::VectorSize,
262-
rows: crate::VectorSize,
263-
ty: Handle<Type<'a>>,
264-
ty_span: Span,
265-
},
266-
Atomic(Scalar),
267-
Pointer {
268-
base: Handle<Type<'a>>,
269-
space: crate::AddressSpace,
270-
},
271-
Array {
272-
base: Handle<Type<'a>>,
273-
size: ArraySize<'a>,
274-
},
275-
Image {
276-
dim: crate::ImageDimension,
277-
arrayed: bool,
278-
class: crate::ImageClass,
279-
},
280-
Sampler {
281-
comparison: bool,
282-
},
283-
AccelerationStructure {
284-
vertex_return: bool,
285-
},
286-
RayQuery {
287-
vertex_return: bool,
288-
},
289-
RayDesc,
290-
RayIntersection,
291-
BindingArray {
292-
base: Handle<Type<'a>>,
293-
size: ArraySize<'a>,
294-
},
295-
296-
/// A user-defined type, like a struct or a type alias.
297-
User(Ident<'a>),
298-
}
299-
300234
#[derive(Debug, Default)]
301235
pub struct Block<'a> {
302236
pub stmts: Vec<Statement<'a>>,
@@ -395,23 +329,23 @@ pub enum Expression<'a> {
395329
#[derive(Debug)]
396330
pub struct LocalVariable<'a> {
397331
pub name: Ident<'a>,
398-
pub ty: Option<Handle<Type<'a>>>,
332+
pub ty: Option<TemplateElaboratedIdent<'a>>,
399333
pub init: Option<Handle<Expression<'a>>>,
400334
pub handle: Handle<Local>,
401335
}
402336

403337
#[derive(Debug)]
404338
pub struct Let<'a> {
405339
pub name: Ident<'a>,
406-
pub ty: Option<Handle<Type<'a>>>,
340+
pub ty: Option<TemplateElaboratedIdent<'a>>,
407341
pub init: Handle<Expression<'a>>,
408342
pub handle: Handle<Local>,
409343
}
410344

411345
#[derive(Debug)]
412346
pub struct LocalConst<'a> {
413347
pub name: Ident<'a>,
414-
pub ty: Option<Handle<Type<'a>>>,
348+
pub ty: Option<TemplateElaboratedIdent<'a>>,
415349
pub init: Handle<Expression<'a>>,
416350
pub handle: Handle<Local>,
417351
}

naga/src/front/wgsl/parse/conv.rs

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -152,60 +152,6 @@ pub fn map_storage_format(word: &str, span: Span) -> Result<'_, crate::StorageFo
152152
})
153153
}
154154

155-
pub fn get_scalar_type(
156-
enable_extensions: &EnableExtensions,
157-
span: Span,
158-
word: &str,
159-
) -> Result<'static, Option<Scalar>> {
160-
use crate::ScalarKind as Sk;
161-
let scalar = match word {
162-
"f16" => Some(Scalar {
163-
kind: Sk::Float,
164-
width: 2,
165-
}),
166-
"f32" => Some(Scalar {
167-
kind: Sk::Float,
168-
width: 4,
169-
}),
170-
"f64" => Some(Scalar {
171-
kind: Sk::Float,
172-
width: 8,
173-
}),
174-
"i32" => Some(Scalar {
175-
kind: Sk::Sint,
176-
width: 4,
177-
}),
178-
"u32" => Some(Scalar {
179-
kind: Sk::Uint,
180-
width: 4,
181-
}),
182-
"i64" => Some(Scalar {
183-
kind: Sk::Sint,
184-
width: 8,
185-
}),
186-
"u64" => Some(Scalar {
187-
kind: Sk::Uint,
188-
width: 8,
189-
}),
190-
"bool" => Some(Scalar {
191-
kind: Sk::Bool,
192-
width: crate::BOOL_WIDTH,
193-
}),
194-
_ => None,
195-
};
196-
197-
if matches!(scalar, Some(Scalar::F16))
198-
&& !enable_extensions.contains(ImplementedEnableExtension::F16)
199-
{
200-
return Err(Box::new(Error::EnableExtensionNotEnabled {
201-
span,
202-
kind: ImplementedEnableExtension::F16.into(),
203-
}));
204-
}
205-
206-
Ok(scalar)
207-
}
208-
209155
pub fn map_derivative(word: &str) -> Option<(crate::DerivativeAxis, crate::DerivativeControl)> {
210156
use crate::{DerivativeAxis as Axis, DerivativeControl as Ctrl};
211157
match word {

naga/src/front/wgsl/parse/lexer.rs

Lines changed: 1 addition & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
use super::{number::consume_number, Error, ExpectedToken, Result};
22
use crate::front::wgsl::error::NumberError;
33
use crate::front::wgsl::parse::directive::enable_extension::EnableExtensions;
4-
use crate::front::wgsl::parse::{conv, Number};
5-
use crate::front::wgsl::Scalar;
4+
use crate::front::wgsl::parse::Number;
65
use crate::Span;
76

87
use alloc::{boxed::Box, vec::Vec};
@@ -534,10 +533,6 @@ impl<'a> Lexer<'a> {
534533
Ok(())
535534
}
536535

537-
pub(in crate::front::wgsl) fn end_of_generic_arguments(&mut self) -> bool {
538-
self.next_if(Token::Separator(',')) && self.peek().0 != Token::TemplateArgsEnd
539-
}
540-
541536
pub(in crate::front::wgsl) fn next_ident_with_span(&mut self) -> Result<'a, (&'a str, Span)> {
542537
match self.next() {
543538
(Token::Word("_"), span) => Err(Box::new(Error::InvalidIdentifierUnderscore(span))),
@@ -566,60 +561,6 @@ impl<'a> Lexer<'a> {
566561
}
567562
}
568563

569-
/// Parses a generic scalar type, for example `<f32>`.
570-
///
571-
/// Returns the span covering the inner type, excluding the brackets.
572-
pub(in crate::front::wgsl) fn next_scalar_generic_with_span(
573-
&mut self,
574-
) -> Result<'a, (Scalar, Span)> {
575-
self.expect(Token::TemplateArgsStart)?;
576-
577-
let (scalar, span) = match self.next() {
578-
(Token::Word(word), span) => {
579-
conv::get_scalar_type(&self.enable_extensions, span, word)?
580-
.map(|scalar| (scalar, span))
581-
.ok_or(Error::UnknownScalarType(span))?
582-
}
583-
(_, span) => return Err(Box::new(Error::UnknownScalarType(span))),
584-
};
585-
586-
self.expect(Token::TemplateArgsEnd)?;
587-
Ok((scalar, span))
588-
}
589-
590-
pub(in crate::front::wgsl) fn next_format_generic(
591-
&mut self,
592-
) -> Result<'a, (crate::StorageFormat, crate::StorageAccess)> {
593-
self.expect(Token::TemplateArgsStart)?;
594-
let (ident, ident_span) = self.next_ident_with_span()?;
595-
let format = conv::map_storage_format(ident, ident_span)?;
596-
self.expect(Token::Separator(','))?;
597-
let (ident, ident_span) = self.next_ident_with_span()?;
598-
let access = conv::map_access_mode(ident, ident_span)?;
599-
self.expect(Token::TemplateArgsEnd)?;
600-
Ok((format, access))
601-
}
602-
603-
pub(in crate::front::wgsl) fn next_acceleration_structure_flags(&mut self) -> Result<'a, bool> {
604-
Ok(if self.next_if(Token::TemplateArgsStart) {
605-
if !self.next_if(Token::TemplateArgsEnd) {
606-
let (name, span) = self.next_ident_with_span()?;
607-
let ret = if name == "vertex_return" {
608-
true
609-
} else {
610-
return Err(Box::new(Error::UnknownAttribute(span)));
611-
};
612-
self.next_if(Token::Separator(','));
613-
self.expect(Token::TemplateArgsEnd)?;
614-
ret
615-
} else {
616-
false
617-
}
618-
} else {
619-
false
620-
})
621-
}
622-
623564
pub(in crate::front::wgsl) fn open_arguments(&mut self) -> Result<'a, ()> {
624565
self.expect(Token::Paren('('))
625566
}

0 commit comments

Comments
 (0)