diff --git a/src/analysis/bounds.rs b/src/analysis/bounds.rs index c24342570..786499518 100644 --- a/src/analysis/bounds.rs +++ b/src/analysis/bounds.rs @@ -107,7 +107,11 @@ impl Bounds { )); if r#async && (par.name == "callback" || par.name.ends_with("_callback")) { let func_name = func.c_identifier.as_ref().unwrap(); - let finish_func_name = finish_function_name(func_name); + let finish_func_name = if let Some(finish_func_name) = &func.finish_func { + finish_func_name.to_string() + } else { + finish_function_name(func_name) + }; if let Some(function) = find_function(env, &finish_func_name) { // FIXME: This should work completely based on the analysis of the finish() // function but that a) happens afterwards and b) is diff --git a/src/analysis/functions.rs b/src/analysis/functions.rs index 8b201e044..427c1be48 100644 --- a/src/analysis/functions.rs +++ b/src/analysis/functions.rs @@ -978,7 +978,11 @@ fn analyze_async( // Checks for /*Ignored*/ or other error comments *commented |= callback_type.contains("/*"); let func_name = func.c_identifier.as_ref().unwrap(); - let finish_func_name = finish_function_name(func_name); + let finish_func_name = if let Some(finish_func_name) = &func.finish_func { + finish_func_name.to_string() + } else { + finish_function_name(func_name) + }; let mut output_params = vec![]; let mut ffi_ret = None; if let Some(function) = find_function(env, &finish_func_name) { diff --git a/src/library.rs b/src/library.rs index 1b0f60640..38b9880ae 100644 --- a/src/library.rs +++ b/src/library.rs @@ -551,6 +551,7 @@ pub struct Function { pub deprecated_version: Option, pub doc: Option, pub doc_deprecated: Option, + pub finish_func: Option, } #[derive(Debug)] diff --git a/src/parser.rs b/src/parser.rs index cdbcb66f6..c576e3379 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -594,6 +594,7 @@ impl Library { deprecated_version, doc, doc_deprecated, + finish_func: None, }) } else { Err(parser.fail("Missing element")) @@ -1017,6 +1018,7 @@ impl Library { let is_method = kind == FunctionKind::Method; let version = self.read_version(parser, ns_id, elem)?; let deprecated_version = self.read_deprecated_version(parser, ns_id, elem)?; + let finish_func = elem.attr("finish-func").map(ToString::to_string); let mut params = Vec::new(); let mut ret = None; @@ -1081,6 +1083,7 @@ impl Library { deprecated_version, doc, doc_deprecated, + finish_func, }) } else { Err(parser.fail_with_position(