Skip to content

Commit 531f122

Browse files
committed
Minor cleanup in virtual function special cases
Use Godot class names, make 4.4+ code more robust in case of future special cases.
1 parent c4b74c8 commit 531f122

File tree

3 files changed

+47
-34
lines changed

3 files changed

+47
-34
lines changed

godot-codegen/src/models/domain_mapping.rs

+12-6
Original file line numberDiff line numberDiff line change
@@ -483,20 +483,26 @@ impl ClassMethod {
483483

484484
// Since Godot 4.4, GDExtension advertises whether virtual methods have a default implementation or are required to be overridden.
485485
#[cfg(before_api = "4.4")]
486-
let is_virtual_required = special_cases::is_virtual_method_required(
487-
&class_name.rust_ty.to_string(),
488-
rust_method_name,
489-
);
486+
let is_virtual_required =
487+
special_cases::is_virtual_method_required(&class_name, rust_method_name);
490488

491489
#[cfg(since_api = "4.4")]
492-
let is_virtual_required = method.is_virtual
493-
&& method.is_required.unwrap_or_else(|| {
490+
#[allow(clippy::let_and_return)]
491+
let is_virtual_required = method.is_virtual && {
492+
// Evaluate this always first (before potential manual overrides), to detect mistakes in spec.
493+
let is_required_in_json = method.is_required.unwrap_or_else(|| {
494494
panic!(
495495
"virtual method {}::{} lacks field `is_required`",
496496
class_name.rust_ty, rust_method_name
497497
);
498498
});
499499

500+
// Potential special cases come here. The situation "virtual function is required in base class, but not in derived"
501+
// is not handled here, but in virtual_traits.rs. Here, virtual methods appear only once, in their base.
502+
503+
is_required_in_json
504+
};
505+
500506
Some(Self {
501507
common: FunctionCommon {
502508
name: rust_method_name.to_string(),

godot-codegen/src/special_cases/special_cases.rs

+35-22
Original file line numberDiff line numberDiff line change
@@ -620,9 +620,11 @@ pub fn get_interface_extra_docs(trait_name: &str) -> Option<&'static str> {
620620
}
621621

622622
#[cfg(before_api = "4.4")]
623-
pub fn is_virtual_method_required(class_name: &str, method: &str) -> bool {
624-
match (class_name, method) {
625-
("ScriptLanguageExtension", _) => method != "get_doc_comment_delimiters",
623+
pub fn is_virtual_method_required(class_name: &TyName, rust_method_name: &str) -> bool {
624+
// Do not call is_derived_virtual_method_required() here; that is handled in virtual_traits.rs.
625+
626+
match (class_name.godot_ty.as_str(), rust_method_name) {
627+
("ScriptLanguageExtension", method) => method != "get_doc_comment_delimiters",
626628

627629
("ScriptExtension", "editor_can_reload_from_file")
628630
| ("ScriptExtension", "can_instantiate")
@@ -660,7 +662,7 @@ pub fn is_virtual_method_required(class_name: &str, method: &str) -> bool {
660662
| ("EditorExportPlugin", "customize_scene")
661663
| ("EditorExportPlugin", "get_customization_configuration_hash")
662664
| ("EditorExportPlugin", "get_name")
663-
| ("EditorVcsInterface", _)
665+
| ("EditorVCSInterface", _)
664666
| ("MovieWriter", _)
665667
| ("TextServerExtension", "has_feature")
666668
| ("TextServerExtension", "get_name")
@@ -766,23 +768,23 @@ pub fn is_virtual_method_required(class_name: &str, method: &str) -> bool {
766768
| ("PacketPeerExtension", "get_available_packet_count")
767769
| ("PacketPeerExtension", "get_max_packet_size")
768770
| ("StreamPeerExtension", "get_available_bytes")
769-
| ("WebRtcDataChannelExtension", "poll")
770-
| ("WebRtcDataChannelExtension", "close")
771-
| ("WebRtcDataChannelExtension", "set_write_mode")
772-
| ("WebRtcDataChannelExtension", "get_write_mode")
773-
| ("WebRtcDataChannelExtension", "was_string_packet")
774-
| ("WebRtcDataChannelExtension", "get_ready_state")
775-
| ("WebRtcDataChannelExtension", "get_label")
776-
| ("WebRtcDataChannelExtension", "is_ordered")
777-
| ("WebRtcDataChannelExtension", "get_id")
778-
| ("WebRtcDataChannelExtension", "get_max_packet_life_time")
779-
| ("WebRtcDataChannelExtension", "get_max_retransmits")
780-
| ("WebRtcDataChannelExtension", "get_protocol")
781-
| ("WebRtcDataChannelExtension", "is_negotiated")
782-
| ("WebRtcDataChannelExtension", "get_buffered_amount")
783-
| ("WebRtcDataChannelExtension", "get_available_packet_count")
784-
| ("WebRtcDataChannelExtension", "get_max_packet_size")
785-
| ("WebRtcPeerConnectionExtension", _)
771+
| ("WebRTCDataChannelExtension", "poll")
772+
| ("WebRTCDataChannelExtension", "close")
773+
| ("WebRTCDataChannelExtension", "set_write_mode")
774+
| ("WebRTCDataChannelExtension", "get_write_mode")
775+
| ("WebRTCDataChannelExtension", "was_string_packet")
776+
| ("WebRTCDataChannelExtension", "get_ready_state")
777+
| ("WebRTCDataChannelExtension", "get_label")
778+
| ("WebRTCDataChannelExtension", "is_ordered")
779+
| ("WebRTCDataChannelExtension", "get_id")
780+
| ("WebRTCDataChannelExtension", "get_max_packet_life_time")
781+
| ("WebRTCDataChannelExtension", "get_max_retransmits")
782+
| ("WebRTCDataChannelExtension", "get_protocol")
783+
| ("WebRTCDataChannelExtension", "is_negotiated")
784+
| ("WebRTCDataChannelExtension", "get_buffered_amount")
785+
| ("WebRTCDataChannelExtension", "get_available_packet_count")
786+
| ("WebRTCDataChannelExtension", "get_max_packet_size")
787+
| ("WebRTCPeerConnectionExtension", _)
786788
| ("MultiplayerPeerExtension", "get_available_packet_count")
787789
| ("MultiplayerPeerExtension", "get_max_packet_size")
788790
| ("MultiplayerPeerExtension", "set_transfer_channel")
@@ -800,7 +802,18 @@ pub fn is_virtual_method_required(class_name: &str, method: &str) -> bool {
800802
| ("MultiplayerPeerExtension", "get_unique_id")
801803
| ("MultiplayerPeerExtension", "get_connection_status") => true,
802804

803-
(_, _) => false,
805+
_ => false,
806+
}
807+
}
808+
809+
// Adjustments for Godot 4.4+, where a virtual method is no longer needed (e.g. in a derived class).
810+
#[rustfmt::skip]
811+
pub fn is_derived_virtual_method_required(class_name: &TyName, rust_method_name: &str) -> Option<bool> {
812+
match (class_name.godot_ty.as_str(), rust_method_name) {
813+
// Required in base class, no longer in derived; https://github.com/godot-rust/gdext/issues/1133.
814+
| ("AudioStreamPlaybackResampled", "mix")
815+
816+
=> Some(false), _ => None
804817
}
805818
}
806819

godot-macros/src/class/data_models/signal.rs

-6
Original file line numberDiff line numberDiff line change
@@ -302,13 +302,7 @@ impl SignalCollection {
302302
// visibility that exceeds the class visibility). So, we can as well declare the visibility here.
303303
#vis_marker fn #signal_name(&mut self) -> #individual_struct_name<'c, C> {
304304
#individual_struct_name {
305-
// __typed: ::godot::register::TypedSignal::new(self.__internal_obj, #signal_name_str)
306-
// __typed: ::godot::register::TypedSignal::<'c, C, _>::new(self.__internal_obj, #signal_name_str)
307-
// __typed: todo!()
308-
309-
// __typed: self.__internal_obj.into_typed_signal(#signal_name_str)
310305
__typed: ::godot::register::TypedSignal::<'c, C, _>::extract(&mut self.__internal_obj, #signal_name_str)
311-
312306
}
313307
}
314308
});

0 commit comments

Comments
 (0)