Skip to content

Commit 9c172ea

Browse files
authored
Merge pull request #1086 from jf2048/new-with-type-split
Split new/with_type in a few more places
2 parents 2b2bc94 + cde4f8c commit 9c172ea

File tree

8 files changed

+40
-25
lines changed

8 files changed

+40
-25
lines changed

gio/src/list_store.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{prelude::*, ListModel, ListStore};
88

99
impl ListStore {
1010
#[doc(alias = "g_list_store_new")]
11-
pub fn new<T: StaticType>() -> Self {
11+
pub fn new<T: IsA<Object>>() -> Self {
1212
Self::with_type(T::static_type())
1313
}
1414

glib-macros/src/variant_derive.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -552,18 +552,15 @@ fn derive_variant_for_c_enum(
552552
),
553553
EnumMode::Enum { repr: false } => (
554554
quote! {
555-
let ty = <Self as #glib::StaticType>::static_type();
556-
let enum_class = #glib::EnumClass::new(ty);
557-
let enum_class = ::core::option::Option::unwrap(enum_class);
555+
let enum_class = #glib::EnumClass::new::<Self>();
558556
let value = <Self as #glib::translate::IntoGlib>::into_glib(*self);
559557
let value = #glib::EnumClass::value(&enum_class, value);
560558
let value = ::core::option::Option::unwrap(value);
561559
let nick = #glib::EnumValue::nick(&value);
562560
#glib::ToVariant::to_variant(nick)
563561
},
564562
quote! {
565-
let ty = <Self as #glib::StaticType>::static_type();
566-
let enum_class = #glib::EnumClass::new(ty)?;
563+
let enum_class = #glib::EnumClass::new::<Self>();
567564
let tag = #glib::Variant::str(&variant)?;
568565
let value = #glib::EnumClass::value_by_nick(&enum_class, tag)?;
569566
let value = #glib::EnumValue::value(&value);
@@ -581,16 +578,13 @@ fn derive_variant_for_c_enum(
581578
),
582579
EnumMode::Flags { repr: false } => (
583580
quote! {
584-
let ty = <Self as #glib::StaticType>::static_type();
585-
let flags_class = #glib::FlagsClass::new(ty);
586-
let flags_class = ::core::option::Option::unwrap(flags_class);
581+
let flags_class = #glib::FlagsClass::new::<Self>();
587582
let value = <Self as #glib::translate::IntoGlib>::into_glib(*self);
588583
let s = #glib::FlagsClass::to_nick_string(&flags_class, value);
589584
#glib::ToVariant::to_variant(&s)
590585
},
591586
quote! {
592-
let ty = <Self as #glib::StaticType>::static_type();
593-
let flags_class = #glib::FlagsClass::new(ty)?;
587+
let flags_class = #glib::FlagsClass::new::<Self>();
594588
let s = #glib::Variant::str(&variant)?;
595589
let value = #glib::FlagsClass::from_nick_string(&flags_class, s).ok()?;
596590
::core::option::Option::Some(unsafe { #glib::translate::from_glib(value) })

glib-macros/tests/test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ fn derive_enum() {
120120
assert!(t.is_a(glib::Type::ENUM));
121121
assert_eq!(t.name(), "TestAnimalType");
122122

123-
let e = glib::EnumClass::new(t).expect("EnumClass::new failed");
123+
let e = glib::EnumClass::with_type(t).expect("EnumClass::new failed");
124124
let v = e.value(0).expect("EnumClass::get_value(0) failed");
125125
assert_eq!(v.name(), "Goat");
126126
assert_eq!(v.nick(), "goat");
@@ -221,7 +221,7 @@ fn attr_flags() {
221221
assert!(t.is_a(glib::Type::FLAGS));
222222
assert_eq!(t.name(), "MyFlags");
223223

224-
let e = glib::FlagsClass::new(t).expect("FlagsClass::new failed");
224+
let e = glib::FlagsClass::with_type(t).expect("FlagsClass::new failed");
225225
let v = e.value(1).expect("FlagsClass::get_value(1) failed");
226226
assert_eq!(v.name(), "Flag A");
227227
assert_eq!(v.nick(), "nick-a");

glib/Gir_GObject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ status = "generate"
109109
final_type = true
110110
concurrency = "send+sync"
111111
version = "2.74"
112+
[[object.function]]
113+
name = "new"
114+
rename = "with_type"
112115
[[object.function]]
113116
name = "connect"
114117
manual = true

glib/src/enums.rs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::{cmp, ffi::CStr, fmt, ptr};
55
use crate::{
66
translate::*,
77
value::{FromValue, ValueTypeChecker},
8-
Type, Value,
8+
HasParamSpec, ParamSpecEnum, ParamSpecFlags, StaticType, Type, Value,
99
};
1010

1111
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
@@ -67,11 +67,18 @@ impl fmt::Debug for EnumClass {
6767
}
6868

6969
impl EnumClass {
70+
// rustdoc-stripper-ignore-next
71+
/// Create a new `EnumClass` from a static type `T`.
72+
///
73+
/// Panics if `T` is not representing an enum.
74+
pub fn new<T: StaticType + HasParamSpec<ParamSpec = ParamSpecEnum>>() -> Self {
75+
Self::with_type(T::static_type()).expect("invalid enum class")
76+
}
7077
// rustdoc-stripper-ignore-next
7178
/// Create a new `EnumClass` from a `Type`.
7279
///
7380
/// Returns `None` if `type_` is not representing an enum.
74-
pub fn new(type_: Type) -> Option<Self> {
81+
pub fn with_type(type_: Type) -> Option<Self> {
7582
unsafe {
7683
let is_enum: bool = from_glib(gobject_ffi::g_type_is_a(
7784
type_.into_glib(),
@@ -255,7 +262,7 @@ impl EnumValue {
255262
/// Convert enum value from a `Value`.
256263
pub fn from_value(value: &Value) -> Option<(EnumClass, &EnumValue)> {
257264
unsafe {
258-
let enum_class = EnumClass::new(value.type_())?;
265+
let enum_class = EnumClass::with_type(value.type_())?;
259266
let v = enum_class.value(gobject_ffi::g_value_get_enum(value.to_glib_none().0))?;
260267
let v = &*(v as *const EnumValue);
261268
Some((enum_class, v))
@@ -341,11 +348,18 @@ impl fmt::Debug for FlagsClass {
341348
}
342349

343350
impl FlagsClass {
351+
// rustdoc-stripper-ignore-next
352+
/// Create a new `FlagsClass` from a static type `T`.
353+
///
354+
/// Panics if `T` is not representing an flags type.
355+
pub fn new<T: StaticType + HasParamSpec<ParamSpec = ParamSpecFlags>>() -> Self {
356+
Self::with_type(T::static_type()).expect("invalid flags class")
357+
}
344358
// rustdoc-stripper-ignore-next
345359
/// Create a new `FlagsClass` from a `Type`
346360
///
347361
/// Returns `None` if `type_` is not representing a flags type.
348-
pub fn new(type_: Type) -> Option<Self> {
362+
pub fn with_type(type_: Type) -> Option<Self> {
349363
unsafe {
350364
let is_flags: bool = from_glib(gobject_ffi::g_type_is_a(
351365
type_.into_glib(),
@@ -771,7 +785,7 @@ impl FlagsValue {
771785
/// Convert flags values from a `Value`. This returns all flags that are set.
772786
pub fn from_value(value: &Value) -> Option<(FlagsClass, Vec<&FlagsValue>)> {
773787
unsafe {
774-
let flags_class = FlagsClass::new(value.type_())?;
788+
let flags_class = FlagsClass::with_type(value.type_())?;
775789
let mut res = Vec::new();
776790
let f = gobject_ffi::g_value_get_flags(value.to_glib_none().0);
777791
for v in flags_class.values() {
@@ -931,11 +945,10 @@ impl std::error::Error for InvalidFlagsError {}
931945
#[cfg(test)]
932946
mod tests {
933947
use super::*;
934-
use crate::StaticType;
935948

936949
#[test]
937950
fn test_flags() {
938-
let flags = FlagsClass::new(crate::BindingFlags::static_type()).unwrap();
951+
let flags = FlagsClass::new::<crate::BindingFlags>();
939952
let values = flags.values();
940953
let def1 = values
941954
.iter()

glib/src/gobject/auto/signal_group.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ crate::wrapper! {
1616

1717
impl SignalGroup {
1818
#[doc(alias = "g_signal_group_new")]
19-
pub fn new(target_type: crate::types::Type) -> SignalGroup {
19+
#[doc(alias = "new")]
20+
pub fn with_type(target_type: crate::types::Type) -> SignalGroup {
2021
unsafe { from_glib_full(gobject_ffi::g_signal_group_new(target_type.into_glib())) }
2122
}
2223

glib/src/gobject/signal_group.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@ use std::mem::transmute;
55
use crate::{
66
signal::{connect_raw, SignalHandlerId},
77
translate::*,
8-
Object, ObjectType, RustClosure, SignalGroup, Value,
8+
IsA, Object, ObjectType, RustClosure, SignalGroup, Value,
99
};
1010

1111
impl SignalGroup {
12+
#[doc(alias = "g_signal_group_new")]
13+
pub fn new<T: IsA<Object>>() -> Self {
14+
Self::with_type(T::static_type())
15+
}
1216
#[doc(alias = "g_signal_group_connect_closure")]
1317
pub fn connect_closure(&self, signal_name: &str, after: bool, closure: RustClosure) {
1418
unsafe {
@@ -212,7 +216,7 @@ mod tests {
212216

213217
#[test]
214218
fn group_emit() {
215-
let group = SignalGroup::new(SignalObject::static_type());
219+
let group = SignalGroup::new::<SignalObject>();
216220

217221
let obj = Object::new::<SignalObject>();
218222
let store = Rc::new(RefCell::new(String::new()));

glib/src/param_spec.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,7 +1027,7 @@ impl ParamSpecEnum {
10271027

10281028
debug_assert!(!(*ptr).enum_class.is_null());
10291029

1030-
crate::EnumClass::new(from_glib((*(*ptr).enum_class).g_type_class.g_type))
1030+
crate::EnumClass::with_type(from_glib((*(*ptr).enum_class).g_type_class.g_type))
10311031
.expect("Invalid enum class")
10321032
}
10331033
}
@@ -1175,7 +1175,7 @@ impl ParamSpecFlags {
11751175

11761176
debug_assert!(!(*ptr).flags_class.is_null());
11771177

1178-
crate::FlagsClass::new(from_glib((*(*ptr).flags_class).g_type_class.g_type))
1178+
crate::FlagsClass::with_type(from_glib((*(*ptr).flags_class).g_type_class.g_type))
11791179
.expect("Invalid flags class")
11801180
}
11811181
}

0 commit comments

Comments
 (0)