From 94a317f38774039aae8e8a61779be0a5b6062054 Mon Sep 17 00:00:00 2001 From: Erich Gubler Date: Thu, 17 Oct 2024 15:22:05 -0400 Subject: [PATCH] feat(wgsl-in): use more general `enable`-not-set diag. w/ unimpl. hint --- naga/src/front/wgsl/error.rs | 31 +++++++++++++++++++ .../wgsl/parse/directive/enable_extension.rs | 6 ++-- naga/src/front/wgsl/parse/mod.rs | 12 +++++-- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/naga/src/front/wgsl/error.rs b/naga/src/front/wgsl/error.rs index 622d7e3ea83..5302c1b22f3 100644 --- a/naga/src/front/wgsl/error.rs +++ b/naga/src/front/wgsl/error.rs @@ -281,6 +281,10 @@ pub(crate) enum Error<'a> { kind: UnimplementedEnableExtension, span: Span, }, + EnableExtensionNotEnabled { + kind: EnableExtension, + span: Span, + }, } #[derive(Clone, Debug)] @@ -937,6 +941,33 @@ impl<'a> Error<'a> { kind.tracking_issue_num() )], }, + Error::EnableExtensionNotEnabled { kind, span } => ParseError { + message: format!("`{}` enable extension is not enabled", kind.to_ident()), + labels: vec![( + span, + format!( + concat!( + "the `{}` enable extension is needed for this functionality, ", + "but it is not currently enabled" + ), + kind.to_ident() + ) + .into(), + )], + notes: if let EnableExtension::Unimplemented(kind) = kind { + vec![format!( + concat!( + "This extension is not yet implemented. ", + "Let Naga maintainers know that you ran into this at ", + ", ", + "so they can prioritize it!" + ), + kind.tracking_issue_num() + )] + } else { + vec![] + }, + }, } } } diff --git a/naga/src/front/wgsl/parse/directive/enable_extension.rs b/naga/src/front/wgsl/parse/directive/enable_extension.rs index fa5e240278c..ae3115c8a2d 100644 --- a/naga/src/front/wgsl/parse/directive/enable_extension.rs +++ b/naga/src/front/wgsl/parse/directive/enable_extension.rs @@ -62,13 +62,13 @@ impl EnableExtension { } /// Maps this [`EnableExtension`] into the sentinel word associated with it in WGSL. - pub fn to_ident(self) -> &'static str { + pub const fn to_ident(self) -> &'static str { match self { Self::Implemented(kind) => match kind {}, Self::Unimplemented(kind) => match kind { UnimplementedEnableExtension::F16 => Self::F16, - UnimplementedEnableExtension::ClipDistances => todo!(), - UnimplementedEnableExtension::DualSourceBlending => todo!(), + UnimplementedEnableExtension::ClipDistances => Self::CLIP_DISTANCES, + UnimplementedEnableExtension::DualSourceBlending => Self::DUAL_SOURCE_BLENDING, }, } } diff --git a/naga/src/front/wgsl/parse/mod.rs b/naga/src/front/wgsl/parse/mod.rs index f5142d07320..05049ac1d73 100644 --- a/naga/src/front/wgsl/parse/mod.rs +++ b/naga/src/front/wgsl/parse/mod.rs @@ -1,6 +1,6 @@ use crate::front::wgsl::error::{Error, ExpectedToken}; use crate::front::wgsl::parse::directive::enable_extension::{ - EnableExtension, EnableExtensions, ImplementedEnableExtension, + EnableExtension, EnableExtensions, ImplementedEnableExtension, UnimplementedEnableExtension, }; use crate::front::wgsl::parse::directive::DirectiveKind; use crate::front::wgsl::parse::lexer::{Lexer, Token}; @@ -669,7 +669,15 @@ impl Parser { } (Token::Number(res), span) => { let _ = lexer.next(); - let num = res.map_err(|err| Error::BadNumber(span, err))?; + let num = res.map_err(|err| match err { + super::error::NumberError::UnimplementedF16 => { + Error::EnableExtensionNotEnabled { + kind: EnableExtension::Unimplemented(UnimplementedEnableExtension::F16), + span, + } + } + err => Error::BadNumber(span, err), + })?; ast::Expression::Literal(ast::Literal::Number(num)) } (Token::Word("RAY_FLAG_NONE"), _) => {