Skip to content

Commit 1825132

Browse files
authored
Merge pull request gtk-rs#602 from EPashkin/async_exctraction
Async exctraction
2 parents 47ba509 + 305c6a9 commit 1825132

File tree

3 files changed

+100
-59
lines changed

3 files changed

+100
-59
lines changed

src/analysis/bounds.rs

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ use std::collections::vec_deque::VecDeque;
22
use std::slice::Iter;
33
use std::vec::Vec;
44

5-
use consts::TYPE_PARAMETERS_START;
6-
use env::Env;
7-
use analysis::imports::Imports;
5+
use analysis::function_parameters::{async_param_to_remove, CParameter};
86
use analysis::functions::{find_function, find_index_to_ignore, finish_function_name};
9-
use analysis::function_parameters::{CParameter, async_param_to_remove};
7+
use analysis::imports::Imports;
108
use analysis::out_parameters::use_function_return_for_result;
119
use analysis::rust_type::{bounds_rust_type, rust_type};
10+
use consts::TYPE_PARAMETERS_START;
11+
use env::Env;
1212
use library::{Function, Fundamental, Nullable, ParameterDirection, Type, TypeId};
1313
use traits::IntoString;
1414

@@ -97,22 +97,29 @@ impl Bound {
9797
}
9898
}
9999

100+
#[derive(Debug)]
101+
pub struct CallbackInfo {
102+
pub callback_type: String,
103+
pub success_parameters: String,
104+
pub error_parameters: String,
105+
pub bound_name: char,
106+
}
107+
100108
impl Bounds {
101109
pub fn add_for_parameter(
102110
&mut self,
103111
env: &Env,
104112
func: &Function,
105113
par: &CParameter,
106114
async: bool,
107-
) -> (Option<String>, Option<(String, String, String, char)>) {
115+
) -> (Option<String>, Option<CallbackInfo>) {
108116
let type_name = bounds_rust_type(env, par.typ);
109-
let mut type_string =
110-
if async && async_param_to_remove(&par.name) {
111-
return (None, None);
112-
} else {
113-
type_name.into_string()
114-
};
115-
let mut trampoline_info = None;
117+
let mut type_string = if async && async_param_to_remove(&par.name) {
118+
return (None, None);
119+
} else {
120+
type_name.into_string()
121+
};
122+
let mut callback_info = None;
116123
let mut ret = None;
117124
if !par.instance_parameter && par.direction != ParameterDirection::Out {
118125
if let Some(bound_type) = Bounds::type_for(env, par.typ, par.nullable) {
@@ -123,13 +130,22 @@ impl Bounds {
123130
if let Some(function) = find_function(env, &finish_func_name) {
124131
let mut out_parameters = find_out_parameters(env, function);
125132
if use_function_return_for_result(env, function.ret.typ) {
126-
out_parameters.insert(0, rust_type(env, function.ret.typ).into_string());
133+
out_parameters
134+
.insert(0, rust_type(env, function.ret.typ).into_string());
127135
}
128136
let parameters = format_out_parameters(&out_parameters);
129137
let error_type = find_error_type(env, function);
130-
type_string = format!("FnOnce(Result<{}, {}>) + Send + 'static", parameters, error_type);
131-
let bounds_name = *self.unused.front().unwrap();
132-
trampoline_info = Some((type_string.clone(), parameters, error_type, bounds_name));
138+
type_string = format!(
139+
"FnOnce(Result<{}, {}>) + Send + 'static",
140+
parameters, error_type
141+
);
142+
let bound_name = *self.unused.front().unwrap();
143+
callback_info = Some(CallbackInfo {
144+
callback_type: type_string.clone(),
145+
success_parameters: parameters,
146+
error_parameters: error_type,
147+
bound_name,
148+
});
133149
}
134150
}
135151
if !self.add_parameter(&par.name, &type_string, bound_type, async) {
@@ -140,7 +156,7 @@ impl Bounds {
140156
}
141157
}
142158
}
143-
(ret, trampoline_info)
159+
(ret, callback_info)
144160
}
145161

146162
pub fn type_for(env: &Env, type_id: TypeId, nullable: Nullable) -> Option<BoundType> {

src/analysis/functions.rs

Lines changed: 66 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
use std::collections::HashMap;
99
use std::vec::Vec;
1010

11-
use analysis::bounds::Bounds;
11+
use analysis::bounds::{Bounds, CallbackInfo};
1212
use analysis::function_parameters::{self, Parameters, Transformation, TransformationType};
13-
use analysis::out_parameters::use_function_return_for_result;
1413
use analysis::imports::Imports;
1514
use analysis::out_parameters;
15+
use analysis::out_parameters::use_function_return_for_result;
1616
use analysis::ref_mode::RefMode;
1717
use analysis::return_value;
1818
use analysis::rust_type::*;
@@ -22,9 +22,9 @@ use config;
2222
use env::Env;
2323
use library::{self, Function, FunctionKind, Nullable, Parameter, ParameterScope, Type};
2424
use nameutil;
25+
use std::borrow::Borrow;
2526
use traits::*;
2627
use version::Version;
27-
use std::borrow::Borrow;
2828

2929
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
3030
pub enum Visibility {
@@ -197,48 +197,18 @@ fn analyze_function(
197197
if let Ok(s) = used_rust_type(env, par.typ) {
198198
used_types.push(s);
199199
}
200-
let (to_glib_extra, type_string) = bounds.add_for_parameter(env, func, par, async);
200+
let (to_glib_extra, callback_info) = bounds.add_for_parameter(env, func, par, async);
201201
if let Some(to_glib_extra) = to_glib_extra {
202202
to_glib_extras.insert(pos, to_glib_extra);
203203
}
204-
if let Some((callback_type, success_parameters, error_parameters, bound_name)) = type_string {
205-
// Checks for /*Ignored*/ or other error comments
206-
if callback_type.find("/*").is_some() {
207-
commented = true;
208-
}
209-
let func_name = func.c_identifier.as_ref().unwrap();
210-
let finish_func_name = finish_function_name(func_name);
211-
let mut output_params = vec![];
212-
let mut ffi_ret = None;
213-
if let Some(function) = find_function(env, &finish_func_name) {
214-
if use_function_return_for_result(env, function.ret.typ) {
215-
ffi_ret = Some(function.ret.clone());
216-
}
217-
218-
output_params.extend(function.parameters.clone());
219-
for param in &mut output_params {
220-
if nameutil::needs_mangling(&param.name) {
221-
param.name = nameutil::mangle_keywords(&*param.name).into_owned();
222-
}
223-
}
224-
}
225-
trampoline = Some(AsyncTrampoline {
226-
is_method: func.kind == FunctionKind::Method,
227-
name: format!("{}_trampoline", func.name),
228-
finish_func_name,
229-
callback_type,
230-
bound_name,
231-
output_params,
232-
ffi_ret,
233-
});
234-
235-
async_future = Some(AsyncFuture {
236-
is_method: func.kind == FunctionKind::Method,
237-
name: format!("{}_future", func.name),
238-
success_parameters,
239-
error_parameters,
240-
});
241-
}
204+
analyze_async(
205+
env,
206+
func,
207+
callback_info,
208+
&mut commented,
209+
&mut trampoline,
210+
&mut async_future,
211+
);
242212
let type_error =
243213
!(async && *env.library.type_(par.typ) == Type::Fundamental(library::Fundamental::Pointer)) &&
244214
parameter_rust_type(env, par.typ, par.direction, Nullable(false), RefMode::None)
@@ -376,6 +346,60 @@ pub fn is_carray_with_direct_elements(env: &Env, typ: library::TypeId) -> bool {
376346
}
377347
}
378348

349+
fn analyze_async(
350+
env: &Env,
351+
func: &library::Function,
352+
callback_info: Option<CallbackInfo>,
353+
commented: &mut bool,
354+
trampoline: &mut Option<AsyncTrampoline>,
355+
async_future: &mut Option<AsyncFuture>,
356+
) {
357+
if let Some(CallbackInfo {
358+
callback_type,
359+
success_parameters,
360+
error_parameters,
361+
bound_name,
362+
}) = callback_info
363+
{
364+
// Checks for /*Ignored*/ or other error comments
365+
if callback_type.find("/*").is_some() {
366+
*commented = true;
367+
}
368+
let func_name = func.c_identifier.as_ref().unwrap();
369+
let finish_func_name = finish_function_name(func_name);
370+
let mut output_params = vec![];
371+
let mut ffi_ret = None;
372+
if let Some(function) = find_function(env, &finish_func_name) {
373+
if use_function_return_for_result(env, function.ret.typ) {
374+
ffi_ret = Some(function.ret.clone());
375+
}
376+
377+
output_params.extend(function.parameters.clone());
378+
for param in &mut output_params {
379+
if nameutil::needs_mangling(&param.name) {
380+
param.name = nameutil::mangle_keywords(&*param.name).into_owned();
381+
}
382+
}
383+
}
384+
*trampoline = Some(AsyncTrampoline {
385+
is_method: func.kind == FunctionKind::Method,
386+
name: format!("{}_trampoline", func.name),
387+
finish_func_name,
388+
callback_type,
389+
bound_name,
390+
output_params,
391+
ffi_ret,
392+
});
393+
394+
*async_future = Some(AsyncFuture {
395+
is_method: func.kind == FunctionKind::Method,
396+
name: format!("{}_future", func.name),
397+
success_parameters,
398+
error_parameters,
399+
});
400+
}
401+
}
402+
379403
pub fn find_function<'a>(env: &'a Env, c_identifier: &str) -> Option<&'a Function> {
380404
let find = |functions: &'a [Function]| -> Option<&'a Function> {
381405
for function in functions {

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![cfg_attr(feature = "cargo-clippy", allow(match_same_arms))]
22
#![cfg_attr(feature = "cargo-clippy", allow(let_and_return))]
33
#![cfg_attr(feature = "cargo-clippy", allow(too_many_arguments))]
4+
#![cfg_attr(feature = "cargo-clippy", allow(write_literal))]
45

56
extern crate git2;
67
#[macro_use]

0 commit comments

Comments
 (0)