From b8235404fcde4c3c581b56a0db8562282859fc26 Mon Sep 17 00:00:00 2001 From: Rafael Caricio Date: Sat, 22 May 2021 23:51:19 +0200 Subject: [PATCH 1/4] Use `S: AsRef`, `&[S]` instead of `&[&str]` --- src/analysis/bounds.rs | 1 + src/analysis/rust_type.rs | 6 +++++- src/codegen/parameter.rs | 14 +++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/analysis/bounds.rs b/src/analysis/bounds.rs index 910d0f58a..863af71be 100644 --- a/src/analysis/bounds.rs +++ b/src/analysis/bounds.rs @@ -186,6 +186,7 @@ impl Bounds { } } Type::Interface(..) => Some(IsA(None)), + Type::CArray(t) if t == TypeId::tid_utf8() => Some(AsRef(None)), Type::List(_) | Type::SList(_) | Type::CArray(_) => None, Type::Fundamental(_) if *nullable => None, Type::Function(_) => Some(NoWrapper), diff --git a/src/analysis/rust_type.rs b/src/analysis/rust_type.rs index 24451150f..4572558f0 100644 --- a/src/analysis/rust_type.rs +++ b/src/analysis/rust_type.rs @@ -349,7 +349,11 @@ impl<'env> RustTypeBuilder<'env> { .map_any(|rust_type| { rust_type.alter_type(|typ| { if self.ref_mode.is_ref() { - format!("[{}]", typ) + if inner_tid == library::TypeId::tid_utf8() { + format!("{}", typ) + } else { + format!("[{}]", typ) + } } else { format!("Vec<{}>", typ) } diff --git a/src/codegen/parameter.rs b/src/codegen/parameter.rs index e1278f217..6ebca08d0 100644 --- a/src/codegen/parameter.rs +++ b/src/codegen/parameter.rs @@ -7,6 +7,7 @@ use crate::{ rust_type::RustType, }, env::Env, + library::{Type, TypeId}, traits::*, }; @@ -32,7 +33,18 @@ impl ToParameter for CParameter { type_str = format!("Option<{}{}>", ref_str, t) } BoundType::IsA(_) => type_str = format!("{}{}", ref_str, t), - BoundType::AsRef(_) => type_str = t.to_string(), + BoundType::AsRef(_) => { + let type_ = env.library.type_(self.typ); + type_str = match *type_ { + Type::CArray(inner_tid) + if inner_tid == TypeId::tid_utf8() + && self.ref_mode == RefMode::ByRef => + { + format!("&[{}]", t) + } + _ => t.to_string(), + } + } }, None => { let type_name = RustType::builder(env, self.typ) From 7e71aa5fb97744eb455288978120e9529b368cc5 Mon Sep 17 00:00:00 2001 From: Rafael Caricio Date: Sun, 23 May 2021 00:36:45 +0200 Subject: [PATCH 2/4] Also applies to List of utf8 --- src/analysis/bounds.rs | 2 +- src/codegen/parameter.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/analysis/bounds.rs b/src/analysis/bounds.rs index 863af71be..6323f10a6 100644 --- a/src/analysis/bounds.rs +++ b/src/analysis/bounds.rs @@ -186,7 +186,7 @@ impl Bounds { } } Type::Interface(..) => Some(IsA(None)), - Type::CArray(t) if t == TypeId::tid_utf8() => Some(AsRef(None)), + Type::List(t) | Type::CArray(t) if t == TypeId::tid_utf8() => Some(AsRef(None)), Type::List(_) | Type::SList(_) | Type::CArray(_) => None, Type::Fundamental(_) if *nullable => None, Type::Function(_) => Some(NoWrapper), diff --git a/src/codegen/parameter.rs b/src/codegen/parameter.rs index 6ebca08d0..09c5799ce 100644 --- a/src/codegen/parameter.rs +++ b/src/codegen/parameter.rs @@ -36,7 +36,7 @@ impl ToParameter for CParameter { BoundType::AsRef(_) => { let type_ = env.library.type_(self.typ); type_str = match *type_ { - Type::CArray(inner_tid) + Type::CArray(inner_tid) | Type::List(inner_tid) if inner_tid == TypeId::tid_utf8() && self.ref_mode == RefMode::ByRef => { From 61a73ee57b2a6388c6a529cda13b8e33cadd8995 Mon Sep 17 00:00:00 2001 From: Rafael Caricio Date: Sun, 23 May 2021 15:30:28 +0200 Subject: [PATCH 3/4] Do not import str --- src/analysis/bounds.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/analysis/bounds.rs b/src/analysis/bounds.rs index 6323f10a6..ee0bc3468 100644 --- a/src/analysis/bounds.rs +++ b/src/analysis/bounds.rs @@ -279,6 +279,7 @@ impl Bounds { match used.bound_type { NoWrapper => (), IsA(_) => imports.add("glib::object::IsA"), + AsRef(_) if &used.type_str == "str" => continue, AsRef(_) => imports.add_used_type(&used.type_str), } } From c8123e11df2b806fa37a12b83938731c3f4fa073 Mon Sep 17 00:00:00 2001 From: Rafael Caricio Date: Mon, 24 May 2021 14:49:07 +0200 Subject: [PATCH 4/4] Use impl AsRef --- src/analysis/bounds.rs | 2 -- src/analysis/rust_type.rs | 3 ++- src/codegen/parameter.rs | 14 +------------- 3 files changed, 3 insertions(+), 16 deletions(-) diff --git a/src/analysis/bounds.rs b/src/analysis/bounds.rs index ee0bc3468..910d0f58a 100644 --- a/src/analysis/bounds.rs +++ b/src/analysis/bounds.rs @@ -186,7 +186,6 @@ impl Bounds { } } Type::Interface(..) => Some(IsA(None)), - Type::List(t) | Type::CArray(t) if t == TypeId::tid_utf8() => Some(AsRef(None)), Type::List(_) | Type::SList(_) | Type::CArray(_) => None, Type::Fundamental(_) if *nullable => None, Type::Function(_) => Some(NoWrapper), @@ -279,7 +278,6 @@ impl Bounds { match used.bound_type { NoWrapper => (), IsA(_) => imports.add("glib::object::IsA"), - AsRef(_) if &used.type_str == "str" => continue, AsRef(_) => imports.add_used_type(&used.type_str), } } diff --git a/src/analysis/rust_type.rs b/src/analysis/rust_type.rs index 4572558f0..fb173fe50 100644 --- a/src/analysis/rust_type.rs +++ b/src/analysis/rust_type.rs @@ -339,6 +339,7 @@ impl<'env> RustTypeBuilder<'env> { skip_option = true; let inner_ref_mode = match *self.env.library.type_(inner_tid) { Class(..) | Interface(..) => RefMode::None, + _ if self.ref_mode.is_ref() && inner_tid == library::TypeId::tid_utf8() => RefMode::ByRefFake, _ => self.ref_mode, }; RustType::builder(&self.env, inner_tid) @@ -350,7 +351,7 @@ impl<'env> RustTypeBuilder<'env> { rust_type.alter_type(|typ| { if self.ref_mode.is_ref() { if inner_tid == library::TypeId::tid_utf8() { - format!("{}", typ) + format!("[impl AsRef<{}>]", typ) } else { format!("[{}]", typ) } diff --git a/src/codegen/parameter.rs b/src/codegen/parameter.rs index 09c5799ce..e1278f217 100644 --- a/src/codegen/parameter.rs +++ b/src/codegen/parameter.rs @@ -7,7 +7,6 @@ use crate::{ rust_type::RustType, }, env::Env, - library::{Type, TypeId}, traits::*, }; @@ -33,18 +32,7 @@ impl ToParameter for CParameter { type_str = format!("Option<{}{}>", ref_str, t) } BoundType::IsA(_) => type_str = format!("{}{}", ref_str, t), - BoundType::AsRef(_) => { - let type_ = env.library.type_(self.typ); - type_str = match *type_ { - Type::CArray(inner_tid) | Type::List(inner_tid) - if inner_tid == TypeId::tid_utf8() - && self.ref_mode == RefMode::ByRef => - { - format!("&[{}]", t) - } - _ => t.to_string(), - } - } + BoundType::AsRef(_) => type_str = t.to_string(), }, None => { let type_name = RustType::builder(env, self.typ)