handle non-exhaustive enums in Visit proc-macro correctly

This commit is contained in:
Dmitry Stepanov
2026-08-11 11:48:55 +03:00
parent 3451e0c1e1
commit efe97b8229
37 changed files with 48 additions and 80 deletions
+1 -5
View File
@@ -20,11 +20,7 @@
use crate::{
fyrox::{
core::{
algebra::Vector2,
pool::Handle,
visitor::{Visit, VisitResult, Visitor},
},
core::{algebra::Vector2, pool::Handle, visitor::prelude::*},
gui::{
border::BorderBuilder,
button::{ButtonBuilder, ButtonMessage},
+1 -1
View File
@@ -33,7 +33,7 @@ use crate::{
pool::{ErasedHandle, Handle, Pool, Ticket},
reflect::prelude::*,
uuid::{uuid, Uuid},
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
ImmutableString, NameProvider,
},
track::Track,
+1 -4
View File
@@ -26,10 +26,7 @@
#![warn(missing_docs)]
use crate::{
core::{
reflect::prelude::*,
visitor::{Visit, VisitResult, Visitor},
},
core::{reflect::prelude::*, visitor::prelude::*},
Animation, AnimationContainer, AnimationPose, EntityId,
};
use fxhash::FxHashSet;
+1 -1
View File
@@ -24,7 +24,7 @@ use crate::{
core::{
pool::{Handle, Pool},
reflect::prelude::*,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
},
machine::{
node::AnimationEventCollectionStrategy, node::BasePoseNode, AnimationPoseSource, Parameter,
+6 -6
View File
@@ -37,7 +37,7 @@ use syn::{parse_macro_input, DeriveInput};
/// For example,
///
/// ```
/// use fyrox_core::visitor::{Visit, VisitResult, Visitor};
/// use fyrox_core::visitor::prelude::*;
/// #[derive(Visit)]
/// struct Foo<T: Visit> {
/// example_one: String,
@@ -49,7 +49,7 @@ use syn::{parse_macro_input, DeriveInput};
/// would expand to something like:
///
/// ```
/// # use fyrox_core::visitor::{Visit, VisitResult, Visitor};
/// # use fyrox_core::visitor::prelude::*;
/// # struct Foo<T> { example_one: String, example_two: T,}
/// impl<T> Visit for Foo<T> where T: Visit {
/// fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult {
@@ -66,7 +66,7 @@ use syn::{parse_macro_input, DeriveInput};
/// [to_case(Case::UpperCamel)](https://docs.rs/convert_case/0.6.0/convert_case/enum.Case.html#variant.Pascal).
///
/// ```
/// # use fyrox_core::visitor::{Visit, VisitResult, Visitor};
/// # use fyrox_core::visitor::prelude::*;
/// #[derive(Visit)]
/// struct Pair (usize, usize);
/// # fn main() {}
@@ -75,7 +75,7 @@ use syn::{parse_macro_input, DeriveInput};
/// would expand to something like:
///
/// ```
/// # use fyrox_core::visitor::{Visit, VisitResult, Visitor};
/// # use fyrox_core::visitor::prelude::*;
/// # struct Pair (usize, usize);
/// impl Visit for Pair {
/// fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult {
@@ -89,7 +89,7 @@ use syn::{parse_macro_input, DeriveInput};
/// ```
///
/// ```
/// # use fyrox_core::visitor::{Visit, VisitResult, Visitor};
/// # use fyrox_core::visitor::prelude::*;
/// #[derive(Visit)]
/// enum EnumExample { A, B(usize) }
/// # fn main() {}
@@ -98,7 +98,7 @@ use syn::{parse_macro_input, DeriveInput};
/// would expand to something like:
///
/// ```
/// # use fyrox_core::visitor::{Visit, VisitResult, Visitor};
/// # use fyrox_core::visitor::prelude::*;
/// # enum EnumExample { A, B(usize) }
/// impl Visit for EnumExample {
/// fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult {
+1
View File
@@ -255,6 +255,7 @@ fn impl_visit_enum(ty_args: &args::TypeArgs, variant_args: &[args::VariantArgs])
match self {
#(#variant_visits)*
_ => return Err(VisitError::UnhandledEnumVariant)
}
return Ok(());
+1 -1
View File
@@ -21,7 +21,7 @@
use crate::{
algebra::{Vector3, Vector4},
reflect::prelude::*,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
};
use bytemuck::{Pod, Zeroable};
use num_traits::Zero;
+1 -5
View File
@@ -18,11 +18,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
use crate::{
color::Color,
reflect::prelude::*,
visitor::{Visit, VisitResult, Visitor},
};
use crate::{color::Color, reflect::prelude::*, visitor::prelude::*};
use std::cmp::Ordering;
#[derive(PartialEq, Debug, Visit, Reflect)]
+1 -1
View File
@@ -36,7 +36,7 @@ pub use rand;
pub use sstorage::ImmutableString;
pub use uuid;
use crate::visitor::{Visit, VisitResult, Visitor};
use crate::visitor::prelude::*;
use bytemuck::Pod;
use fxhash::FxHashMap;
pub use safelock::*;
+1 -5
View File
@@ -23,11 +23,7 @@
#![warn(missing_docs)]
use crate::{
parking_lot::Mutex,
visitor::{Visit, VisitResult, Visitor},
SafeLock,
};
use crate::{parking_lot::Mutex, visitor::prelude::*, SafeLock};
use fxhash::{FxHashMap, FxHasher};
use serde::{Deserialize, Serialize};
use std::{
+6
View File
@@ -102,6 +102,9 @@ pub enum VisitError {
UuidError(uuid::Error),
/// Arbitrary error.
Any(Box<dyn Error + Send + Sync>),
/// Unhandled enum variant. Typically, means that a match arm of non-exhaustive pattern is not
/// handled.
UnhandledEnumVariant,
}
impl Error for VisitError {}
@@ -171,6 +174,9 @@ impl Display for VisitError {
Self::Any(e) => {
write!(f, "{e}")
}
VisitError::UnhandledEnumVariant => {
write!(f, "unhandled enum variant")
}
}
}
}
+1 -1
View File
@@ -829,7 +829,7 @@ impl Visitor {
#[cfg(test)]
mod test {
use crate::visitor::{BinaryBlob, Visit, VisitResult, Visitor};
use crate::visitor::{prelude::*, BinaryBlob};
use nalgebra::{
Matrix2, Matrix3, Matrix4, UnitComplex, UnitQuaternion, Vector2, Vector3, Vector4,
};
+1 -1
View File
@@ -53,7 +53,7 @@ use crate::{
uuid::Uuid,
variable::InheritableVariable,
visitor::error::VisitError,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
NameProvider,
},
engine::SerializationContext,
+1 -1
View File
@@ -31,7 +31,7 @@ use crate::{
pool::{ErasedHandle, Handle},
reflect::prelude::*,
variable::InheritableVariable,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
ImmutableString,
},
engine::SerializationContext,
+1 -1
View File
@@ -30,7 +30,7 @@ use crate::{
reflect::prelude::*,
uuid::{uuid, Uuid},
variable::InheritableVariable,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
},
graph::SceneGraph,
resource::texture::{
+1 -1
View File
@@ -52,7 +52,7 @@ use crate::{
math::{aabb::AxisAlignedBoundingBox, Matrix4Ext},
pool::{Handle, MultiBorrowContext, ObjectOrVariant, Pool, PoolError, Ticket},
reflect::prelude::*,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
},
graph::{NodeHandleMap, NodeWrapper, SceneGraph},
material::{MaterialResourceBinding, MaterialTextureBinding},
+1 -1
View File
@@ -35,7 +35,7 @@ use crate::{
reflect::prelude::*,
uuid::{uuid, Uuid},
variable::InheritableVariable,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
},
scene::{
base::{Base, BaseBuilder},
+2 -5
View File
@@ -38,11 +38,8 @@
use crate::{
core::{
algebra::Vector3,
color::Color,
reflect::prelude::*,
variable::InheritableVariable,
visitor::{Visit, VisitResult, Visitor},
algebra::Vector3, color::Color, reflect::prelude::*, variable::InheritableVariable,
visitor::prelude::*,
},
scene::base::{Base, BaseBuilder},
};
+1 -1
View File
@@ -47,7 +47,7 @@ use crate::{
reflect::prelude::*,
uuid::{uuid, Uuid},
variable::InheritableVariable,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
},
scene::{
base::Base,
+1 -1
View File
@@ -53,7 +53,7 @@ use crate::{
reflect::prelude::*,
uuid::{uuid, Uuid},
variable::InheritableVariable,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
},
resource::texture::TextureResource,
scene::{
+1 -1
View File
@@ -38,7 +38,7 @@ use crate::{
reflect::prelude::*,
sparse::AtomicIndex,
variable::InheritableVariable,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
},
material::{Material, MaterialResource, MaterialResourceExtension},
resource::texture::{TextureKind, TexturePixelKind, TextureResource, TextureResourceExtension},
+1 -6
View File
@@ -22,12 +22,7 @@
//! control over instantiation process at deserialization.
use crate::{
core::{
pool::PayloadContainer,
reflect::prelude::*,
uuid::Uuid,
visitor::{Visit, VisitResult, Visitor},
},
core::{pool::PayloadContainer, reflect::prelude::*, uuid::Uuid, visitor::prelude::*},
engine::SerializationContext,
scene::node::Node,
};
+1 -1
View File
@@ -35,7 +35,7 @@ use crate::{
uuid::Uuid,
variable,
variable::mark_inheritable_properties_non_modified,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
NameProvider,
},
graph::NodeWrapper,
+1 -1
View File
@@ -33,7 +33,7 @@ use crate::{
uuid::{uuid, Uuid},
value_as_u8_slice,
variable::InheritableVariable,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
},
graph::{constructor::ConstructorProvider, SceneGraph},
material::{Material, MaterialResource},
+1 -1
View File
@@ -69,7 +69,7 @@ use crate::core::{
log::{Log, MessageKind},
reflect::prelude::*,
variable::InheritableVariable,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
};
use std::cell::Cell;
+1 -1
View File
@@ -30,7 +30,7 @@ use crate::{
pool::{Handle, PoolError},
reflect::prelude::*,
uuid::Uuid,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
},
engine::{input::InputState, task::TaskPoolHandler, GraphicsContext, ScriptMessageDispatcher},
event::Event,
+1 -1
View File
@@ -31,7 +31,7 @@ use crate::{
arrayvec::ArrayVec,
math::{self, plane::Plane, ray::Ray, PositionProvider, TriangleDefinition, Vector3Ext},
reflect::prelude::*,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
},
scene::mesh::{
buffer::{VertexAttributeUsage, VertexReadTrait},
+1 -1
View File
@@ -107,7 +107,7 @@ impl ResourceConstructorContainer {
#[cfg(test)]
mod test {
use fyrox_core::reflect::prelude::*;
use fyrox_core::visitor::{Visit, VisitResult, Visitor};
use fyrox_core::visitor::prelude::*;
use std::error::Error;
use std::path::Path;
+1 -1
View File
@@ -2092,7 +2092,7 @@ mod test {
};
use fyrox_core::{
uuid::{uuid, Uuid},
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
};
use std::{error::Error, fs::File, time::Duration};
+1 -4
View File
@@ -27,10 +27,7 @@
//! description of each filter. There is no need to describe them all here.
use crate::dsp::DelayLine;
use fyrox_core::{
reflect::prelude::*,
visitor::{Visit, VisitResult, Visitor},
};
use fyrox_core::{reflect::prelude::*, visitor::prelude::*};
/// One-pole Filter.
/// For details see - <https://www.earlevel.com/main/2012/12/15/a-one-pole-filter/>
+1 -1
View File
@@ -29,7 +29,7 @@
//! `fc` - normalized frequency, i.e. `fc = 0.2` with `sample rate = 44100 Hz` will be `f = 8820 Hz`
use fyrox_core::visitor::pod::PodVecView;
use fyrox_core::visitor::{Visit, VisitResult, Visitor};
use fyrox_core::visitor::prelude::*;
pub mod filters;
+1 -1
View File
@@ -25,7 +25,7 @@
//! Sound engine manages contexts, feeds output device with data.
use crate::context::SoundContext;
use fyrox_core::visitor::{Visit, VisitResult, Visitor};
use fyrox_core::visitor::prelude::*;
use fyrox_core::SafeLock;
use std::error::Error;
use std::sync::{Arc, Mutex, MutexGuard};
+1 -1
View File
@@ -84,7 +84,7 @@ use fyrox_core::{
log::Log,
reflect::prelude::*,
uuid::{uuid, Uuid},
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
};
use fyrox_resource::untyped::ResourceKind;
use fyrox_resource::{
+1 -4
View File
@@ -32,10 +32,7 @@ use crate::{
source::SoundSource,
};
use fyrox_core::math::lerpf;
use fyrox_core::{
reflect::prelude::*,
visitor::{Visit, VisitResult, Visitor},
};
use fyrox_core::{reflect::prelude::*, visitor::prelude::*};
use strum_macros::{AsRefStr, EnumString, VariantNames};
pub mod hrtf;
+1 -6
View File
@@ -55,12 +55,7 @@ use crate::{
error::SoundError,
listener::Listener,
};
use fyrox_core::{
algebra::Vector3,
log::Log,
reflect::prelude::*,
visitor::{Visit, VisitResult, Visitor},
};
use fyrox_core::{algebra::Vector3, log::Log, reflect::prelude::*, visitor::prelude::*};
use std::time::Duration;
/// Status (state) of sound source.
+1 -1
View File
@@ -54,7 +54,7 @@ use fyrox_core::{
reflect::prelude::*,
sparse::AtomicIndex,
uuid::Uuid,
visitor::{Visit, VisitResult, Visitor},
visitor::prelude::*,
};
use fyrox_resource::{
embedded_data_source, io::ResourceIo, manager::BuiltInResource, options::ImportOptions,
+1 -6
View File
@@ -23,12 +23,7 @@
use crate::{
constructor::WidgetConstructorContainer,
core::{
pool::PayloadContainer,
reflect::prelude::*,
uuid::Uuid,
visitor::{Visit, VisitResult, Visitor},
},
core::{pool::PayloadContainer, reflect::prelude::*, uuid::Uuid, visitor::prelude::*},
UiNode,
};
use fyrox_core::visitor::error::VisitError;