mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-06-14 13:31:22 +00:00
Implement Deref
for all imported JS types
This commit implements the first half of [RFC #5] where the `Deref` trait is implemented for all imported types. The target of `Deref` is either the first entry of the list of `extends` attribute or `JsValue`. All examples using `.as_ref()` with various `web-sys` types have been updated to the more ergonomic deref casts now. Additionally the `web-sys` generation of the `extends` array has been fixed slightly to explicitly list implementatoins in the hierarchy order to ensure the correct target for `Deref` is chosen. [RFC #5]: https://github.com/rustwasm/rfcs/blob/master/text/005-structural-and-deref.md
This commit is contained in:
@ -735,11 +735,17 @@ impl<'src> FirstPass<'src, ()> for weedle::CallbackInterfaceDefinition<'src> {
|
||||
impl<'a> FirstPassRecord<'a> {
|
||||
pub fn all_superclasses<'me>(&'me self, interface: &str) -> impl Iterator<Item = String> + 'me {
|
||||
let mut set = BTreeSet::new();
|
||||
self.fill_superclasses(interface, &mut set);
|
||||
set.into_iter()
|
||||
let mut list = Vec::new();
|
||||
self.fill_superclasses(interface, &mut set, &mut list);
|
||||
list.into_iter()
|
||||
}
|
||||
|
||||
fn fill_superclasses(&self, interface: &str, set: &mut BTreeSet<String>) {
|
||||
fn fill_superclasses(
|
||||
&self,
|
||||
interface: &str,
|
||||
set: &mut BTreeSet<&'a str>,
|
||||
list: &mut Vec<String>,
|
||||
) {
|
||||
let data = match self.interfaces.get(interface) {
|
||||
Some(data) => data,
|
||||
None => return,
|
||||
@ -749,8 +755,9 @@ impl<'a> FirstPassRecord<'a> {
|
||||
None => return,
|
||||
};
|
||||
if self.interfaces.contains_key(superclass) {
|
||||
if set.insert(camel_case_ident(superclass)) {
|
||||
self.fill_superclasses(superclass, set);
|
||||
if set.insert(superclass) {
|
||||
list.push(camel_case_ident(superclass));
|
||||
self.fill_superclasses(superclass, set, list);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user