mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-05-09 20:42:20 +00:00
Add support for modules to the backend.
This commit is contained in:
parent
f85fd0e2ad
commit
1e02ca7eab
@ -19,6 +19,19 @@ pub struct Program {
|
|||||||
pub structs: Vec<Struct>,
|
pub structs: Vec<Struct>,
|
||||||
/// rust consts
|
/// rust consts
|
||||||
pub consts: Vec<Const>,
|
pub consts: Vec<Const>,
|
||||||
|
/// rust submodules
|
||||||
|
pub modules: Vec<Module>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A rust module
|
||||||
|
///
|
||||||
|
/// This exists to give the ability to namespace js imports.
|
||||||
|
#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq))]
|
||||||
|
pub struct Module {
|
||||||
|
/// module name
|
||||||
|
pub name: String,
|
||||||
|
/// js -> rust interfaces
|
||||||
|
pub imports: Vec<Import>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A rust to js interface. Allows interaction with rust objects/functions
|
/// A rust to js interface. Allows interaction with rust objects/functions
|
||||||
@ -227,6 +240,8 @@ impl Program {
|
|||||||
structs: self.structs.iter().map(|a| a.shared()).collect(),
|
structs: self.structs.iter().map(|a| a.shared()).collect(),
|
||||||
enums: self.enums.iter().map(|a| a.shared()).collect(),
|
enums: self.enums.iter().map(|a| a.shared()).collect(),
|
||||||
imports: self.imports.iter()
|
imports: self.imports.iter()
|
||||||
|
// add in imports from inside modules
|
||||||
|
.chain(self.modules.iter().flat_map(|m| m.imports.iter()))
|
||||||
.map(|a| a.shared())
|
.map(|a| a.shared())
|
||||||
.collect::<Result<_, Diagnostic>>()?,
|
.collect::<Result<_, Diagnostic>>()?,
|
||||||
version: shared::version(),
|
version: shared::version(),
|
||||||
|
@ -43,6 +43,8 @@ impl TryToTokens for ast::Program {
|
|||||||
for i in self.imports.iter() {
|
for i in self.imports.iter() {
|
||||||
DescribeImport(&i.kind).to_tokens(tokens);
|
DescribeImport(&i.kind).to_tokens(tokens);
|
||||||
|
|
||||||
|
// If there is a js namespace, check that name isn't a type. If it is,
|
||||||
|
// this import might be a method on that type.
|
||||||
if let Some(ns) = &i.js_namespace {
|
if let Some(ns) = &i.js_namespace {
|
||||||
if types.contains(ns) && i.kind.fits_on_impl() {
|
if types.contains(ns) && i.kind.fits_on_impl() {
|
||||||
let kind = match i.kind.try_to_token_stream() {
|
let kind = match i.kind.try_to_token_stream() {
|
||||||
@ -61,6 +63,11 @@ impl TryToTokens for ast::Program {
|
|||||||
errors.push(e);
|
errors.push(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for m in self.modules.iter() {
|
||||||
|
if let Err(e) = m.try_to_tokens(tokens) {
|
||||||
|
errors.push(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
for e in self.enums.iter() {
|
for e in self.enums.iter() {
|
||||||
e.to_tokens(tokens);
|
e.to_tokens(tokens);
|
||||||
}
|
}
|
||||||
@ -87,6 +94,7 @@ impl TryToTokens for ast::Program {
|
|||||||
// Each JSON blob is prepended with the length of the JSON blob so when
|
// Each JSON blob is prepended with the length of the JSON blob so when
|
||||||
// all these sections are concatenated in the final wasm file we know
|
// all these sections are concatenated in the final wasm file we know
|
||||||
// how to extract all the JSON pieces, so insert the byte length here.
|
// how to extract all the JSON pieces, so insert the byte length here.
|
||||||
|
// The value is little-endian.
|
||||||
let generated_static_length = description.len() + 4;
|
let generated_static_length = description.len() + 4;
|
||||||
let mut bytes = vec![
|
let mut bytes = vec![
|
||||||
(description.len() >> 0) as u8,
|
(description.len() >> 0) as u8,
|
||||||
@ -1103,6 +1111,29 @@ impl ToTokens for ast::Const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl TryToTokens for ast::Module {
|
||||||
|
fn try_to_tokens(&self, tokens: &mut TokenStream) -> Result<(), Diagnostic> {
|
||||||
|
let mut errors = Vec::new();
|
||||||
|
for i in self.imports.iter() {
|
||||||
|
DescribeImport(&i.kind).to_tokens(tokens);
|
||||||
|
}
|
||||||
|
let name = &self.name;
|
||||||
|
let mut body = TokenStream::new();
|
||||||
|
for i in self.imports.iter() {
|
||||||
|
if let Err(e) = i.kind.try_to_tokens(&mut body) {
|
||||||
|
errors.push(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Diagnostic::from_vec(errors)?;
|
||||||
|
(quote!{
|
||||||
|
pub mod #name {
|
||||||
|
#body
|
||||||
|
}
|
||||||
|
}).to_tokens(tokens);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Emits the necessary glue tokens for "descriptor", generating an appropriate
|
/// Emits the necessary glue tokens for "descriptor", generating an appropriate
|
||||||
/// symbol name as well as attributes around the descriptor function itself.
|
/// symbol name as well as attributes around the descriptor function itself.
|
||||||
struct Descriptor<'a, T>(&'a Ident, T);
|
struct Descriptor<'a, T>(&'a Ident, T);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user