Skip to content

Commit c7e740d

Browse files
committed
Optimize resolve_prefix
1 parent 4c5fb95 commit c7e740d

File tree

1 file changed

+16
-29
lines changed

1 file changed

+16
-29
lines changed

src/name.rs

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -670,35 +670,22 @@ impl NamespaceResolver {
670670
}
671671

672672
fn resolve_prefix(&self, prefix: Option<Prefix>, use_default: bool) -> ResolveResult<'_> {
673-
self.bindings
674-
.iter()
675-
// Find the last defined binding that corresponds to the given prefix
676-
.rev()
677-
.find_map(|n| match (n.prefix(&self.buffer), prefix) {
678-
// This is default namespace definition and name has no explicit prefix
679-
(None, None) if use_default => Some(n.namespace(&self.buffer)),
680-
(None, None) => Some(ResolveResult::Unbound),
681-
682-
// One part has prefix but other is not -> skip
683-
(None, Some(_)) => None,
684-
(Some(_), None) => None,
685-
686-
// Prefixes does not match -> skip
687-
(Some(definition), Some(usage)) if definition != usage => None,
688-
689-
// Prefixes the same, entry defines binding reset (corresponds to `xmlns:p=""`)
690-
_ if n.value_len == 0 => Some(Self::maybe_unknown(prefix)),
691-
// Prefixes the same, returns corresponding namespace
692-
_ => Some(n.namespace(&self.buffer)),
693-
})
694-
.unwrap_or_else(|| Self::maybe_unknown(prefix))
695-
}
696-
697-
#[inline]
698-
fn maybe_unknown(prefix: Option<Prefix>) -> ResolveResult<'static> {
699-
match prefix {
700-
Some(p) => ResolveResult::Unknown(p.into_inner().to_vec()),
701-
None => ResolveResult::Unbound,
673+
// Find the last defined binding that corresponds to the given prefix
674+
let mut iter = self.bindings.iter().rev();
675+
match (prefix, use_default) {
676+
// Attribute name has no explicit prefix -> Unbound
677+
(None, false) => ResolveResult::Unbound,
678+
// Element name has no explicit prefix -> find nearest xmlns binding
679+
(None, true) => match iter.find(|n| n.prefix_len == 0) {
680+
Some(n) => n.namespace(&self.buffer),
681+
None => ResolveResult::Unbound,
682+
},
683+
// Attribute or element name with explicit prefix
684+
(Some(p), _) => match iter.find(|n| n.prefix(&self.buffer) == prefix) {
685+
Some(n) if n.value_len != 0 => n.namespace(&self.buffer),
686+
// Not found or binding reset (corresponds to `xmlns:p=""`)
687+
_ => ResolveResult::Unknown(p.into_inner().to_vec()),
688+
},
702689
}
703690
}
704691

0 commit comments

Comments
 (0)