Navigation Menu

Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve gir errors a bit #766

Merged
merged 2 commits into from May 16, 2019
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
105 changes: 76 additions & 29 deletions src/parser.rs
Expand Up @@ -700,15 +700,19 @@ impl Library {
parser.elements(|parser, elem| match elem.name() {
"type" | "array" => {
if inner.is_some() {
return Err(parser.fail("Too many <type> elements"));
return Err(parser.fail_with_position(
"Too many <type> inner elements in <constant> element",
elem.position(),
));
}
let (typ, c_type, array_length) = self.read_type(parser, ns_id, elem)?;
if let Some(c_type) = c_type {
inner = Some((typ, c_type, array_length));
} else {
return Err(
parser.fail_with_position("Missing constant's c:type", elem.position())
);
return Err(parser.fail_with_position(
"Missing <constant> element's c:type",
elem.position(),
));
}
Ok(())
}
Expand All @@ -735,7 +739,10 @@ impl Library {
);
Ok(())
} else {
Err(parser.fail("Missing <type> element"))
Err(parser.fail_with_position(
"Missing <type> element inside <constant> element",
elem.position(),
))
}
}

Expand All @@ -755,13 +762,16 @@ impl Library {
"source-position" => parser.ignore_element(),
"type" | "array" => {
if inner.is_some() {
return Err(parser.fail("Too many <type> elements"));
return Err(parser.fail_with_position(
"Too many <type> inner elements in <alias> element",
elem.position(),
));
}
let (typ, c_type, array_length) = self.read_type(parser, ns_id, elem)?;
if let Some(c_type) = c_type {
inner = Some((typ, c_type, array_length));
} else {
return Err(parser.fail("Missing alias target's c:type"));
return Err(parser.fail("Missing <alias> target's c:type"));
}
Ok(())
}
Expand All @@ -780,7 +790,10 @@ impl Library {
self.add_type(ns_id, alias_name, typ);
Ok(())
} else {
Err(parser.fail("Missing <type> element"))
Err(parser.fail_with_position(
"Missing <type> element inside <alias> element",
elem.position(),
))
}
}

Expand Down Expand Up @@ -829,7 +842,10 @@ impl Library {
.map(|mut ps| params.append(&mut ps)),
"return-value" => {
if ret.is_some() {
return Err(parser.fail("Too many <return-value> elements"));
return Err(parser.fail_with_position(
"Too many <return-value> elements inside <function> element",
elem.position(),
));
}
ret = Some(self.read_parameter(parser, ns_id, elem, false, is_method)?);
Ok(())
Expand Down Expand Up @@ -875,7 +891,10 @@ impl Library {
doc_deprecated,
})
} else {
Err(parser.fail("Missing <return-value> element"))
Err(parser.fail_with_position(
"Missing <return-value> element in <function> element",
elem.position(),
))
}
}

Expand Down Expand Up @@ -905,8 +924,13 @@ impl Library {
self.read_function(parser, ns_id, kind_str, elem)
.and_then(|f| {
if f.c_identifier.is_none() {
return Err(parser
.fail_with_position("Missing c:identifier attribute", elem.position()));
return Err(parser.fail_with_position(
&format!(
"Missing c:identifier attribute in <{}> element",
elem.name()
),
elem.position(),
));
}
Ok(Some(f))
})
Expand Down Expand Up @@ -934,7 +958,10 @@ impl Library {
.map(|mut ps| params.append(&mut ps)),
"return-value" => {
if ret.is_some() {
return Err(parser.fail("Too many <return-value> elements"));
return Err(parser.fail_with_position(
"Too many <return-value> elements in <signal> element",
elem.position(),
));
}
self.read_parameter(parser, ns_id, elem, true, false)
.map(|p| ret = Some(p))
Expand All @@ -955,7 +982,10 @@ impl Library {
doc_deprecated,
})
} else {
Err(parser.fail("Missing <return-value> element"))
Err(parser.fail_with_position(
"Missing <return-value> element in <signal> element",
elem.position(),
))
}
}

Expand Down Expand Up @@ -997,7 +1027,7 @@ impl Library {
Ok(ParameterDirection::Return)
} else {
ParameterDirection::from_str(elem.attr("direction").unwrap_or("in"))
.or_else(|why| Err(parser.fail(&why)))
.or_else(|why| Err(parser.fail_with_position(&why, elem.position())))
}?;

let mut typ = None;
Expand All @@ -1007,18 +1037,20 @@ impl Library {
parser.elements(|parser, elem| match elem.name() {
"type" | "array" => {
if typ.is_some() {
return Err(
parser.fail_with_position("Too many <type> elements", elem.position())
);
return Err(parser.fail_with_position(
&format!("Too many <type> elements in <{}> element", elem.name()),
elem.position(),
));
}
typ = Some(self.read_type(parser, ns_id, elem)?);
if let Some((tid, None, _)) = typ {
if allow_no_ctype {
typ = Some((tid, Some(EMPTY_CTYPE.to_owned()), None));
} else {
return Err(
parser.fail_with_position("Missing c:type attribute", elem.position())
);
return Err(parser.fail_with_position(
&format!("Missing c:type attribute in <{}> element", elem.name()),
elem.position(),
));
}
}
Ok(())
Expand Down Expand Up @@ -1071,7 +1103,10 @@ impl Library {
destroy,
})
} else {
Err(parser.fail("Missing <type> element"))
Err(parser.fail_with_position(
&format!("Missing <type> element in <{}> element", elem.name()),
elem.position(),
))
}
}

Expand All @@ -1087,7 +1122,7 @@ impl Library {
let construct = elem.attr_bool("construct", false);
let construct_only = elem.attr_bool("construct-only", false);
let transfer = Transfer::from_str(elem.attr("transfer-ownership").unwrap_or("none"))
.or_else(|why| Err(parser.fail(&why)))?;
.or_else(|why| Err(parser.fail_with_position(&why, elem.position())))?;

let version = self.read_version(parser, ns_id, elem)?;
let deprecated_version = self.read_deprecated_version(parser, ns_id, elem)?;
Expand All @@ -1099,9 +1134,10 @@ impl Library {
parser.elements(|parser, elem| match elem.name() {
"type" | "array" => {
if typ.is_some() {
return Err(
parser.fail_with_position("Too many <type> elements", elem.position())
);
return Err(parser.fail_with_position(
"Too many <type> elements in <property> element",
elem.position(),
));
}
if !elem.has_attrs() && elem.name() == "type" {
// defend from <type/>
Expand Down Expand Up @@ -1139,7 +1175,10 @@ impl Library {
doc_deprecated,
}))
} else {
Err(parser.fail("Missing <type> element"))
Err(parser.fail_with_position(
"Missing <type> element in <property> element",
elem.position(),
))
}
}

Expand All @@ -1158,7 +1197,12 @@ impl Library {
None
}
})
.ok_or_else(|| parser.fail_with_position("Missing type name", elem.position()))?;
.ok_or_else(|| {
parser.fail_with_position(
"<type> element is missing a name attribute",
elem.position(),
)
})?;
let c_type = elem.attr("type").map(|s| s.into());
let array_length = elem.attr("length").and_then(|s| s.parse().ok());

Expand All @@ -1169,7 +1213,10 @@ impl Library {

if inner.is_empty() || type_name == "GLib.ByteArray" {
if type_name == "array" {
Err(parser.fail_with_position("Missing element type", elem.position()))
Err(parser.fail_with_position(
"<type> element is missing an inner element type",
elem.position(),
))
} else {
Ok((
self.find_or_stub_type(ns_id, type_name),
Expand Down
8 changes: 7 additions & 1 deletion src/xmlparser.rs
Expand Up @@ -37,7 +37,13 @@ struct ErrorEmitter {
impl ErrorEmitter {
pub fn emit(&self, message: &str, position: TextPosition) -> String {
let enriched = match self.path {
Some(ref path) => format!("{}:{}: {}", path.display(), position, message),
Some(ref path) => format!(
"{} at line {}:{}: {}",
path.display(),
position.row,
position.column,
message
),
None => format!("{} {}", position, message),
};
format!("GirXml: {}", enriched)
Expand Down