Skip to content

Commit 032af6e

Browse files
authored
Merge pull request #962 from 0x53A/dev-test-godot_dyn
Fix `#[godot_dyn]` causing error when implemented for two traits
2 parents 735d88f + c4fd83d commit 032af6e

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

godot-core/src/registry/class.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,10 @@ impl ClassRegistrationInfo {
113113
PluginItem::Struct { .. } => 0,
114114
PluginItem::InherentImpl(_) => 1,
115115
PluginItem::ITraitImpl { .. } => 2,
116-
PluginItem::DynTraitImpl { .. } => 3,
116+
117+
// Multiple dyn traits can be registered, thus don't validate for uniqueness.
118+
// (Still keep array size, so future additions don't have to regard this).
119+
PluginItem::DynTraitImpl { .. } => return,
117120
};
118121

119122
if self.component_already_filled[index] {

itest/rust/src/object_tests/dyn_gd_test.rs

+32-5
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ fn dyn_gd_hash() {
160160

161161
#[itest]
162162
fn dyn_gd_exclusive_guard() {
163-
let mut a = foreign::NodeHealth::new_alloc().into_dyn();
163+
let mut a = foreign::NodeHealth::new_alloc().into_dyn::<dyn Health>();
164164
let mut b = a.clone();
165165

166166
let guard = a.dyn_bind_mut();
@@ -187,7 +187,7 @@ fn dyn_gd_exclusive_guard() {
187187

188188
#[itest]
189189
fn dyn_gd_shared_guard() {
190-
let a = foreign::NodeHealth::new_alloc().into_dyn();
190+
let a = foreign::NodeHealth::new_alloc().into_dyn::<dyn Health>();
191191
let b = a.clone();
192192
let mut c = a.clone();
193193

@@ -227,7 +227,7 @@ fn dyn_gd_downgrade() {
227227

228228
#[itest]
229229
fn dyn_gd_call_godot_method() {
230-
let mut node = foreign::NodeHealth::new_alloc().into_dyn();
230+
let mut node = foreign::NodeHealth::new_alloc().into_dyn::<dyn Health>();
231231

232232
node.set_name("dyn-name!");
233233
assert_eq!(node.get_name(), "dyn-name!".into());
@@ -237,7 +237,7 @@ fn dyn_gd_call_godot_method() {
237237

238238
#[itest]
239239
fn dyn_gd_pass_to_godot_api() {
240-
let child = foreign::NodeHealth::new_alloc().into_dyn();
240+
let child = foreign::NodeHealth::new_alloc().into_dyn::<dyn Health>();
241241

242242
let mut parent = Node::new_alloc();
243243
parent.add_child(&child);
@@ -331,7 +331,7 @@ fn dyn_gd_error_unimplemented_trait() {
331331

332332
#[itest]
333333
fn dyn_gd_free_while_dyn_bound() {
334-
let mut obj = foreign::NodeHealth::new_alloc().into_dyn();
334+
let mut obj: DynGd<_, dyn Health> = foreign::NodeHealth::new_alloc().into_dyn();
335335

336336
{
337337
let copy = obj.clone();
@@ -354,6 +354,18 @@ fn dyn_gd_free_while_dyn_bound() {
354354
obj.free();
355355
}
356356

357+
#[itest]
358+
fn dyn_gd_multiple_traits() {
359+
let obj = foreign::NodeHealth::new_alloc();
360+
let original_id = obj.instance_id();
361+
362+
let obj = obj.into_dyn::<dyn InstanceIdProvider>().upcast::<Node>();
363+
let id = obj.dyn_bind().get_id_dynamic();
364+
assert_eq!(id, original_id);
365+
366+
obj.free();
367+
}
368+
357369
// ----------------------------------------------------------------------------------------------------------------------------------------------
358370
// Example symbols
359371

@@ -418,3 +430,18 @@ impl Health for foreign::NodeHealth {
418430
self.base_mut().set_meta("hp", &new_hp.to_variant());
419431
}
420432
}
433+
434+
// ----------------------------------------------------------------------------------------------------------------------------------------------
435+
// Check that one class can implement two or more traits.
436+
437+
// Pointless trait, but tests access to object.
438+
trait InstanceIdProvider {
439+
fn get_id_dynamic(&self) -> InstanceId;
440+
}
441+
442+
#[godot_dyn]
443+
impl InstanceIdProvider for foreign::NodeHealth {
444+
fn get_id_dynamic(&self) -> InstanceId {
445+
self.base().instance_id()
446+
}
447+
}

0 commit comments

Comments
 (0)