From e4bc844ba0306cfeb39f6b4aa0916cadd18fa6e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Capucho?= Date: Sun, 16 May 2021 16:27:09 +0100 Subject: [PATCH] [glsl-in] return error in constant math functions --- src/front/glsl/ast.rs | 4 +--- src/front/glsl/constants.rs | 6 +++++- src/front/glsl/error.rs | 11 ++++++++++- src/front/glsl/parser.rs | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/front/glsl/ast.rs b/src/front/glsl/ast.rs index ea06449395..7c67ddac59 100644 --- a/src/front/glsl/ast.rs +++ b/src/front/glsl/ast.rs @@ -153,9 +153,7 @@ impl<'a> Program<'a> { constants: &mut self.module.constants, }; - solver - .solve(root) - .map_err(|_| ErrorKind::SemanticError(meta, "Can't solve constant".into())) + solver.solve(root).map_err(|e| (meta, e).into()) } pub fn function_args_prelude(&self) -> (Vec, Vec) { diff --git a/src/front/glsl/constants.rs b/src/front/glsl/constants.rs index 1df4a95766..1143b90f34 100644 --- a/src/front/glsl/constants.rs +++ b/src/front/glsl/constants.rs @@ -51,6 +51,8 @@ pub enum ConstantSolvingError { InvalidBinaryOpArgs, #[error("Splat/swizzle type is not registered")] DestinationTypeNotFound, + #[error("Not implemented: {0}")] + NotImplemented(String), } impl<'a> ConstantSolver<'a> { @@ -152,7 +154,9 @@ impl<'a> ConstantSolver<'a> { self.binary_op(op, left_constant, right_constant) } - Expression::Math { .. } => todo!(), + Expression::Math { fun, .. } => { + Err(ConstantSolvingError::NotImplemented(format!("{:?}", fun))) + } Expression::As { convert, expr, diff --git a/src/front/glsl/error.rs b/src/front/glsl/error.rs index 705b4a798f..8ae98dd29c 100644 --- a/src/front/glsl/error.rs +++ b/src/front/glsl/error.rs @@ -1,4 +1,7 @@ -use super::token::{SourceMetadata, Token}; +use super::{ + constants::ConstantSolvingError, + token::{SourceMetadata, Token}, +}; use std::borrow::Cow; use thiserror::Error; @@ -58,6 +61,12 @@ impl ErrorKind { } } +impl From<(SourceMetadata, ConstantSolvingError)> for ErrorKind { + fn from((meta, err): (SourceMetadata, ConstantSolvingError)) -> Self { + ErrorKind::SemanticError(meta, err.to_string().into()) + } +} + #[derive(Debug, Error)] #[error("{kind}")] pub struct ParseError { diff --git a/src/front/glsl/parser.rs b/src/front/glsl/parser.rs index 13a82cd973..a3debee8c1 100644 --- a/src/front/glsl/parser.rs +++ b/src/front/glsl/parser.rs @@ -499,7 +499,7 @@ impl<'source, 'program, 'options> Parser<'source, 'program, 'options> { let init = self .bump_if(TokenValue::Assign) - .map(|_| { + .map::, _>(|_| { let (expr, init_meta) = self.parse_initializer(ty, ctx.ctx, ctx.body)?; meta = meta.union(&init_meta); Ok((expr, init_meta))