Push updates - still WIP

This commit is contained in:
Richard Dodd
2018-08-09 21:38:37 +01:00
parent 1e02ca7eab
commit 615f8fbc4d
4 changed files with 71 additions and 35 deletions

View File

@ -1,3 +1,4 @@
use std::collections::HashMap;
use proc_macro2::{Ident, Span};
use shared;
use syn;
@ -20,18 +21,7 @@ pub struct Program {
/// rust consts
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>,
pub modules: HashMap<Ident, Module>,
}
/// A rust to js interface. Allows interaction with rust objects/functions
@ -233,6 +223,15 @@ pub enum ConstValue {
Null,
}
/// 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 {
/// js -> rust interfaces
pub imports: Vec<Import>,
}
impl Program {
pub(crate) fn shared(&self) -> Result<shared::Program, Diagnostic> {
Ok(shared::Program {
@ -241,7 +240,7 @@ impl Program {
enums: self.enums.iter().map(|a| a.shared()).collect(),
imports: self.imports.iter()
// add in imports from inside modules
.chain(self.modules.iter().flat_map(|m| m.imports.iter()))
.chain(self.modules.values().flat_map(|m| m.imports.iter()))
.map(|a| a.shared())
.collect::<Result<_, Diagnostic>>()?,
version: shared::version(),

View File

@ -64,7 +64,7 @@ impl TryToTokens for ast::Program {
}
}
for m in self.modules.iter() {
if let Err(e) = m.try_to_tokens(tokens) {
if let Err(e) = ModuleInIter::from(m).try_to_tokens(tokens) {
errors.push(e);
}
}
@ -1111,15 +1111,28 @@ impl ToTokens for ast::Const {
}
}
impl TryToTokens for ast::Module {
/// Struct to help implementing TryToTokens over the key/value pairs from the hashmap.
struct ModuleInIter<'a> {
name: &'a Ident,
module: &'a ast::Module
}
impl<'a> From<(&'a Ident, &'a ast::Module)> for ModuleInIter<'a> {
fn from((name, module): (&'a Ident, &'a ast::Module)) -> ModuleInIter<'a> {
ModuleInIter { name, module }
}
}
impl<'a> TryToTokens for ModuleInIter<'a> {
fn try_to_tokens(&self, tokens: &mut TokenStream) -> Result<(), Diagnostic> {
let name = &self.name;
let imports = &self.module.imports;
let mut errors = Vec::new();
for i in self.imports.iter() {
for i in imports.iter() {
DescribeImport(&i.kind).to_tokens(tokens);
}
let name = &self.name;
let mut body = TokenStream::new();
for i in self.imports.iter() {
for i in imports.iter() {
if let Err(e) = i.kind.try_to_tokens(&mut body) {
errors.push(e);
}