Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/analysis/namespaces.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ pub struct Namespace {
pub crate_name: String,
pub sys_crate_name: String,
pub higher_crate_name: String,
pub package_name: Option<String>,
pub package_names: Vec<String>,
pub symbol_prefixes: Vec<String>,
pub shared_libs: Vec<String>,
pub versions: Vec<Version>,
Expand Down Expand Up @@ -55,7 +55,7 @@ pub fn run(gir: &library::Library) -> Info {
crate_name,
sys_crate_name,
higher_crate_name,
package_name: ns.package_name.clone(),
package_names: ns.package_names.clone(),
symbol_prefixes: ns.symbol_prefixes.clone(),
shared_libs: ns.shared_library.clone(),
versions: ns.versions.iter().copied().collect(),
Expand Down
2 changes: 1 addition & 1 deletion src/codegen/sys/cargo_toml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ fn fill_in(root: &mut Table, env: &Env) {
let meta = upsert_table(meta, "system-deps");

let ns = env.namespaces.main();
let lib_name = ns.package_name.as_ref().unwrap();
let lib_name = ns.package_names.first().unwrap();

let meta = upsert_table(meta, nameutil::lib_name_to_toml(lib_name));
// Allow both the name and version of a system dep to be overridden by hand
Expand Down
17 changes: 12 additions & 5 deletions src/codegen/sys/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,11 @@ fn prepare_cconsts(env: &Env) -> Vec<CConstant> {
// see the GValue machinery around them for example
constants.push(CConstant {
name: format!("(guint) {}", member.c_identifier),
value: member.value.clone(),
value: member
.value
.parse::<i32>()
.map(|i| (i as u32).to_string())
.unwrap_or_else(|_| member.value.clone()),
});
}
}
Expand Down Expand Up @@ -289,11 +293,16 @@ fn generate_abi_rs(
cconsts: &[CConstant],
) -> io::Result<()> {
let ns = env.library.namespace(MAIN_NAMESPACE);
let package_name = ns.package_name.as_ref().expect("Missing package name");
let mut package_names = ns.package_names.join("\", \"");
if !package_names.is_empty() {
package_names = format!("\"{}\"", package_names);
}

info!("Generating file {:?}", path);
general::start_comments(w, &env.config)?;
writeln!(w)?;
writeln!(w, "#![cfg(target_os = \"linux\")]")?;
writeln!(w)?;

if !ctypes.is_empty() {
writeln!(w, "use {}::*;", crate_name)?;
Expand All @@ -308,7 +317,7 @@ fn generate_abi_rs(
writeln!(w, "use std::str;")?;
writeln!(w, "use tempfile::Builder;")?;
writeln!(w)?;
writeln!(w, "static PACKAGES: &[&str] = &[\"{}\"];", package_name)?;
writeln!(w, "static PACKAGES: &[&str] = &[{}];", package_names)?;
writeln!(
w,
"{}",
Expand Down Expand Up @@ -411,7 +420,6 @@ impl Results {
}

#[test]
#[cfg(target_os = "linux")]
fn cross_validate_constants_with_c() {
let mut c_constants: Vec<(String, String)> = Vec::new();

Expand Down Expand Up @@ -446,7 +454,6 @@ fn cross_validate_constants_with_c() {
}

#[test]
#[cfg(target_os = "linux")]
fn cross_validate_layout_with_c() {
let mut c_layouts = Vec::new();

Expand Down
2 changes: 1 addition & 1 deletion src/library.rs
Original file line number Diff line number Diff line change
Expand Up @@ -973,7 +973,7 @@ pub struct Namespace {
pub glib_name_index: HashMap<String, u32>,
pub constants: Vec<Constant>,
pub functions: Vec<Function>,
pub package_name: Option<String>,
pub package_names: Vec<String>,
pub versions: BTreeSet<Version>,
pub doc: Option<String>,
pub doc_deprecated: Option<String>,
Expand Down
22 changes: 11 additions & 11 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ impl Library {
parser: &mut XmlParser<'_>,
libs: &mut Vec<String>,
) -> Result<(), String> {
let mut package = None;
let mut packages = Vec::new();
let mut includes = Vec::new();
parser.elements(|parser, elem| match elem.name() {
"include" => {
Expand All @@ -69,16 +69,16 @@ impl Library {
Ok(())
}
"package" => {
// Take the first package element and ignore any other ones.
if package.is_none() {
let name = elem.attr_required("name")?;
package = Some(name.to_owned());
}
let name = elem.attr_required("name")?;
packages.push(name.to_owned());
Ok(())
}
"namespace" => {
self.read_namespace(parser, elem, package.take(), std::mem::take(&mut includes))
}
"namespace" => self.read_namespace(
parser,
elem,
std::mem::take(&mut packages),
std::mem::take(&mut includes),
),
"attribute" => parser.ignore_element(),
_ => Err(parser.unexpected_element(elem)),
})?;
Expand All @@ -89,15 +89,15 @@ impl Library {
&mut self,
parser: &mut XmlParser<'_>,
elem: &Element,
package: Option<String>,
packages: Vec<String>,
c_includes: Vec<String>,
) -> Result<(), String> {
let ns_name = elem.attr_required("name")?;
let ns_id = self.add_namespace(ns_name);

{
let ns = self.namespace_mut(ns_id);
ns.package_name = package;
ns.package_names = packages;
ns.c_includes = c_includes;
if let Some(s) = elem.attr("shared-library") {
ns.shared_library = s.split(',').map(String::from).collect();
Expand Down