Rewrite From/TryFrom conversions on generated types to avoid future orphan rule violations (#34554)

* script: Add traits to allow converting between types that are not defined in the script crate.

Signed-off-by: Josh Matthews <josh@joshmatthews.net>

* script: Rewrite all From/TryFrom implementations on generated WebIDL types to use new Convert/TryConvert traits.

Signed-off-by: Josh Matthews <josh@joshmatthews.net>

---------

Signed-off-by: Josh Matthews <josh@joshmatthews.net>
This commit is contained in:
Josh Matthews 2024-12-11 00:52:48 -05:00 committed by GitHub
parent e10e989abb
commit e0cbab2fbb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
40 changed files with 439 additions and 380 deletions

View file

@ -15,6 +15,7 @@ use webxr_api::{
MockViewInit, MockViewsInit, MockWorld, TargetRayMode, Triangle, Visibility,
};
use crate::conversions::Convert;
use crate::dom::bindings::codegen::Bindings::DOMPointBinding::DOMPointInit;
use crate::dom::bindings::codegen::Bindings::FakeXRDeviceBinding::{
FakeXRBoundsPoint, FakeXRDeviceMethods, FakeXRRegionType, FakeXRRigidTransformInit,
@ -147,7 +148,7 @@ pub fn get_world(world: &FakeXRWorldInit) -> Fallible<MockWorld> {
.hitTestRegions
.iter()
.map(|region| {
let ty = region.type_.into();
let ty = region.type_.convert();
let faces = region
.faces
.iter()
@ -172,9 +173,9 @@ pub fn get_world(world: &FakeXRWorldInit) -> Fallible<MockWorld> {
Ok(MockWorld { regions })
}
impl From<FakeXRRegionType> for EntityType {
fn from(x: FakeXRRegionType) -> Self {
match x {
impl Convert<EntityType> for FakeXRRegionType {
fn convert(self) -> EntityType {
match self {
FakeXRRegionType::Point => EntityType::Point,
FakeXRRegionType::Plane => EntityType::Plane,
FakeXRRegionType::Mesh => EntityType::Mesh,
@ -255,8 +256,8 @@ impl FakeXRDeviceMethods<crate::DomTypeHolder> for FakeXRDevice {
let id = self.next_input_id.get();
self.next_input_id.set(InputId(id.0 + 1));
let handedness = init.handedness.into();
let target_ray_mode = init.targetRayMode.into();
let handedness = init.handedness.convert();
let target_ray_mode = init.targetRayMode.convert();
let pointer_origin = Some(get_origin(&init.pointerOrigin)?);
@ -346,9 +347,9 @@ impl FakeXRDeviceMethods<crate::DomTypeHolder> for FakeXRDevice {
}
}
impl From<XRHandedness> for Handedness {
fn from(h: XRHandedness) -> Self {
match h {
impl Convert<Handedness> for XRHandedness {
fn convert(self) -> Handedness {
match self {
XRHandedness::None => Handedness::None,
XRHandedness::Left => Handedness::Left,
XRHandedness::Right => Handedness::Right,
@ -356,9 +357,9 @@ impl From<XRHandedness> for Handedness {
}
}
impl From<XRTargetRayMode> for TargetRayMode {
fn from(t: XRTargetRayMode) -> Self {
match t {
impl Convert<TargetRayMode> for XRTargetRayMode {
fn convert(self) -> TargetRayMode {
match self {
XRTargetRayMode::Gaze => TargetRayMode::Gaze,
XRTargetRayMode::Tracked_pointer => TargetRayMode::TrackedPointer,
XRTargetRayMode::Screen => TargetRayMode::Screen,

View file

@ -9,6 +9,7 @@ use webxr_api::{
SelectKind, TargetRayMode,
};
use crate::conversions::Convert;
use crate::dom::bindings::codegen::Bindings::FakeXRDeviceBinding::FakeXRRigidTransformInit;
use crate::dom::bindings::codegen::Bindings::FakeXRInputControllerBinding::{
FakeXRButtonStateInit, FakeXRButtonType, FakeXRInputControllerMethods,
@ -165,9 +166,9 @@ impl FakeXRInputControllerMethods<crate::DomTypeHolder> for FakeXRInputControlle
}
}
impl From<FakeXRButtonType> for MockButtonType {
fn from(b: FakeXRButtonType) -> Self {
match b {
impl Convert<MockButtonType> for FakeXRButtonType {
fn convert(self) -> MockButtonType {
match self {
FakeXRButtonType::Grip => MockButtonType::Grip,
FakeXRButtonType::Touchpad => MockButtonType::Touchpad,
FakeXRButtonType::Thumbstick => MockButtonType::Thumbstick,
@ -182,7 +183,7 @@ pub fn init_to_mock_buttons(buttons: &[FakeXRButtonStateInit]) -> Vec<MockButton
let supported: Vec<MockButton> = buttons
.iter()
.map(|b| MockButton {
button_type: b.buttonType.into(),
button_type: b.buttonType.convert(),
pressed: b.pressed,
touched: b.touched,
pressed_value: *b.pressedValue,

View file

@ -24,6 +24,7 @@ use webxr_api::{
SelectEvent, SelectKind, Session, SessionId, View, Viewer, Visibility,
};
use crate::conversions::Convert;
use crate::dom::bindings::trace::HashMapTracedValues;
use crate::dom::bindings::buffer_source::create_buffer_source;
use crate::dom::bindings::callback::ExceptionHandling;
@ -124,7 +125,7 @@ impl XRSession {
) -> XRSession {
XRSession {
eventtarget: EventTarget::new_inherited(),
blend_mode: session.environment_blend_mode().into(),
blend_mode: session.environment_blend_mode().convert(),
mode,
visibility_state: Cell::new(XRVisibilityState::Visible),
viewer_space: Default::default(),
@ -1100,9 +1101,9 @@ pub fn cast_transform<T, U, V, W>(
unsafe { mem::transmute(transform) }
}
impl From<EnvironmentBlendMode> for XREnvironmentBlendMode {
fn from(x: EnvironmentBlendMode) -> Self {
match x {
impl Convert<XREnvironmentBlendMode> for EnvironmentBlendMode {
fn convert(self) -> XREnvironmentBlendMode {
match self {
EnvironmentBlendMode::Opaque => XREnvironmentBlendMode::Opaque,
EnvironmentBlendMode::AlphaBlend => XREnvironmentBlendMode::Alpha_blend,
EnvironmentBlendMode::Additive => XREnvironmentBlendMode::Additive,

View file

@ -13,6 +13,7 @@ use profile_traits::ipc;
use servo_config::pref;
use webxr_api::{Error as XRError, Frame, Session, SessionInit, SessionMode};
use crate::conversions::Convert;
use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::XRSystemBinding::{
XRSessionInit, XRSessionMode, XRSystemMethods,
@ -100,9 +101,9 @@ impl XRSystem {
}
}
impl From<XRSessionMode> for SessionMode {
fn from(mode: XRSessionMode) -> SessionMode {
match mode {
impl Convert<SessionMode> for XRSessionMode {
fn convert(self) -> SessionMode {
match self {
XRSessionMode::Immersive_vr => SessionMode::ImmersiveVR,
XRSessionMode::Immersive_ar => SessionMode::ImmersiveAR,
XRSessionMode::Inline => SessionMode::Inline,
@ -148,7 +149,7 @@ impl XRSystemMethods<crate::DomTypeHolder> for XRSystem {
}),
);
if let Some(mut r) = window.webxr_registry() {
r.supports_session(mode.into(), sender);
r.supports_session(mode.convert(), sender);
}
promise
@ -266,7 +267,7 @@ impl XRSystemMethods<crate::DomTypeHolder> for XRSystem {
}),
);
if let Some(mut r) = window.webxr_registry() {
r.request_session(mode.into(), init, sender, frame_sender);
r.request_session(mode.convert(), init, sender, frame_sender);
}
promise
}