From 2e61c71bd3602acfb6cbb37fe8a66042c2354839 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 +++++++++++++++++++++++++++++++ naga/src/front/wgsl/parse/mod.rs | 12 ++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/naga/src/front/wgsl/error.rs b/naga/src/front/wgsl/error.rs index 61a19e77716..4838f1b27b7 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() + )] + } else { + vec![] + }, + }, } } } 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"), _) => {