Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//! Extract common data from Function/Method/Constructor into Callable
use super::*;
pub fn pass(root: &mut Root) -> Result<()> {
root.visit_mut(|func: &mut Function| {
func.callable = Callable {
name: func.name.clone(),
is_async: func.is_async,
kind: CallableKind::Function,
arguments: func.inputs.clone(),
return_type: ReturnType {
ty: func.return_type.clone().map(|ty| TypeNode {
ty,
..TypeNode::default()
}),
},
throws_type: ThrowsType {
ty: func.throws.clone().map(|ty| TypeNode {
ty,
..TypeNode::default()
}),
},
checksum: func.checksum,
..Callable::default()
}
});
root.visit_mut(|module: &mut Module| {
let module_name = module.name.clone();
module.visit_mut(|int: &mut Interface| {
let interface_name = int.name.clone();
let interface_imp = int.imp.clone();
int.visit_mut(|cons: &mut Constructor| {
cons.callable = Callable {
name: cons.name.clone(),
is_async: cons.is_async,
kind: CallableKind::Constructor {
interface_name: interface_name.clone(),
primary: cons.name == "new",
},
arguments: cons.inputs.clone(),
return_type: ReturnType {
ty: Some(TypeNode {
ty: Type::Interface {
module_name: module_name.clone(),
name: interface_name.clone(),
imp: interface_imp.clone(),
},
..TypeNode::default()
}),
},
throws_type: ThrowsType {
ty: cons.throws.clone().map(|ty| TypeNode {
ty,
..TypeNode::default()
}),
},
checksum: cons.checksum,
..Callable::default()
}
});
int.visit_mut(|meth: &mut Method| {
meth.callable = Callable {
name: meth.name.clone(),
is_async: meth.is_async,
kind: CallableKind::Method {
interface_name: interface_name.clone(),
},
arguments: meth.inputs.clone(),
return_type: ReturnType {
ty: meth.return_type.clone().map(|ty| TypeNode {
ty,
..TypeNode::default()
}),
},
throws_type: ThrowsType {
ty: meth.throws.clone().map(|ty| TypeNode {
ty,
..TypeNode::default()
}),
},
checksum: meth.checksum,
..Callable::default()
}
});
});
});
root.visit_mut(|cbi: &mut CallbackInterface| {
let interface_name = cbi.name.clone();
cbi.visit_mut(|meth: &mut Method| {
meth.callable = Callable {
name: meth.name.clone(),
is_async: meth.is_async,
kind: CallableKind::Method {
interface_name: interface_name.clone(),
},
arguments: meth.inputs.clone(),
return_type: ReturnType {
ty: meth.return_type.clone().map(|ty| TypeNode {
ty,
..TypeNode::default()
}),
},
throws_type: ThrowsType {
ty: meth.throws.clone().map(|ty| TypeNode {
ty,
..TypeNode::default()
}),
},
checksum: meth.checksum,
..Callable::default()
}
});
});
Ok(())
}