Skip to content

Commit d8864f1

Browse files
authored
Merge pull request #1353 from Yarwin/preserve-docs-in-signal
Preserve doc comments for signal.
2 parents c3f705b + 885bf9e commit d8864f1

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ struct SignalDetails<'a> {
109109
signal_name_str: String,
110110
/// `#[cfg(..)] #[cfg(..)]`
111111
signal_cfg_attrs: Vec<&'a venial::Attribute>,
112+
/// `///` `#[doc = ...]`
113+
signal_doc_attrs: Vec<&'a venial::Attribute>,
112114
/// `MyClass_MySignal`
113115
individual_struct_name: Ident,
114116
/// Visibility, e.g. `pub(crate)`
@@ -146,6 +148,11 @@ impl<'a> SignalDetails<'a> {
146148
.into_iter()
147149
.collect();
148150

151+
// Preserve docs.
152+
let signal_doc_attrs = util::extract_doc_attrs(external_attributes)
153+
.into_iter()
154+
.collect();
155+
149156
let param_tuple = quote! { ( #( #param_types, )* ) };
150157
let signal_name = &fn_signature.name;
151158
let individual_struct_name = format_ident!("__godot_Signal_{}_{}", class_name, signal_name);
@@ -169,6 +176,7 @@ impl<'a> SignalDetails<'a> {
169176
signal_name,
170177
signal_name_str: fn_signature.name.to_string(),
171178
signal_cfg_attrs,
179+
signal_doc_attrs,
172180
individual_struct_name,
173181
vis_marker: vis_marker.clone(),
174182
// vis_classified,
@@ -285,6 +293,7 @@ impl SignalCollection {
285293
signal_name,
286294
signal_name_str,
287295
signal_cfg_attrs,
296+
signal_doc_attrs,
288297
individual_struct_name,
289298
vis_marker,
290299
..
@@ -293,6 +302,7 @@ impl SignalCollection {
293302
self.provider_methods.push(quote! {
294303
// Deliberately not #[doc(hidden)] for IDE completion.
295304
#(#signal_cfg_attrs)*
305+
#(#signal_doc_attrs)*
296306
// Note: this could be `pub` always and would still compile (maybe warning with the following message).
297307
// associated function `SignalCollection::my_signal` is reachable at visibility `pub(crate)`
298308
//

godot-macros/src/util/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,15 @@ pub(crate) fn extract_cfg_attrs(
275275
attrs.iter().filter(|attr| is_cfg_or_cfg_attr(attr))
276276
}
277277

278+
pub(crate) fn extract_doc_attrs(
279+
attrs: &[venial::Attribute],
280+
) -> impl IntoIterator<Item = &venial::Attribute> {
281+
attrs.iter().filter(|attr| {
282+
attr.get_single_path_segment()
283+
.is_some_and(|attr_name| attr_name == "doc")
284+
})
285+
}
286+
278287
#[cfg(before_api = "4.3")]
279288
pub fn make_virtual_tool_check() -> TokenStream {
280289
quote! {

itest/rust/src/register_tests/func_test.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,17 @@ impl GdSelfObj {
192192
#[cfg(any())]
193193
fn cfg_removes_signal();
194194

195+
/// Sample docstring.
196+
///
197+
/// Impossible to check by other means than manually, but it is still nice to have some documentation.
198+
#[signal]
199+
fn docstring_is_preserved_in_signal();
200+
201+
/// Sample docstring, to watch if it causes any issues with `#[cfg(...)]`.
202+
#[signal]
203+
#[cfg(any())]
204+
fn cfg_removes_signal_with_docstring();
205+
195206
#[func]
196207
fn fail_to_update_internal_value_due_to_conflicting_borrow(
197208
&mut self,

0 commit comments

Comments
 (0)