@@ -3,7 +3,7 @@ use crate::tokens::{quote, to_ident, TokenStream};
33use crate :: { rdl, Error , Result , Tree } ;
44use metadata:: * ;
55
6- pub fn from_reader ( reader : & metadata:: Reader , mut config : std:: collections:: BTreeMap < & str , & str > , output : & str ) -> Result < ( ) > {
6+ pub fn from_reader ( reader : & ' static metadata:: Reader , mut config : std:: collections:: BTreeMap < & str , & str > , output : & str ) -> Result < ( ) > {
77 let dialect = match config. remove ( "type" ) {
88 Some ( "winrt" ) => Dialect :: WinRT ,
99 Some ( "win32" ) => Dialect :: Win32 ,
@@ -30,7 +30,7 @@ pub fn from_reader(reader: &metadata::Reader, mut config: std::collections::BTre
3030
3131fn gen_split ( writer : & Writer ) -> Result < ( ) > {
3232 let tree = Tree :: new ( writer. reader ) ;
33- let directory = crate :: directory ( writer. output ) ;
33+ let directory = crate :: directory ( & writer. output ) ;
3434
3535 // TODO: parallelize
3636 for tree in tree. flatten ( ) {
@@ -48,7 +48,7 @@ fn gen_split(writer: &Writer) -> Result<()> {
4848fn gen_file ( writer : & Writer ) -> Result < ( ) > {
4949 let tree = Tree :: new ( writer. reader ) ;
5050 let tokens = writer. tree ( & tree) ;
51- writer. write_to_file ( writer. output , tokens)
51+ writer. write_to_file ( & writer. output , tokens)
5252}
5353
5454#[ derive( Debug , Copy , Clone , PartialEq ) ]
@@ -57,21 +57,21 @@ enum Dialect {
5757 WinRT ,
5858}
5959
60- struct Writer < ' a > {
61- reader : & ' a metadata:: Reader ,
62- namespace : & ' a str ,
60+ struct Writer {
61+ reader : & ' static metadata:: Reader ,
62+ namespace : & ' static str ,
6363 dialect : Dialect ,
6464 split : bool ,
65- output : & ' a str ,
65+ output : String ,
6666}
6767
68- impl < ' a > Writer < ' a > {
69- fn new ( reader : & ' a metadata:: Reader , output : & ' a str , dialect : Dialect ) -> Self {
70- Self { reader, namespace : "" , output, dialect, split : false }
68+ impl Writer {
69+ fn new ( reader : & ' static metadata:: Reader , output : & str , dialect : Dialect ) -> Self {
70+ Self { reader, namespace : "" , output : output . to_string ( ) , dialect, split : false }
7171 }
7272
73- fn with_namespace ( & self , namespace : & ' a str ) -> Self {
74- Self { reader : self . reader , namespace, dialect : self . dialect , output : self . output , split : self . split }
73+ fn with_namespace ( & self , namespace : & ' static str ) -> Self {
74+ Self { reader : self . reader , namespace, dialect : self . dialect , output : self . output . clone ( ) , split : self . split }
7575 }
7676
7777 fn write_to_file ( & self , output : & str , tokens : TokenStream ) -> Result < ( ) > {
@@ -90,7 +90,7 @@ impl<'a> Writer<'a> {
9090 //crate::write_to_file(output, tokens.into_string())
9191 }
9292
93- fn tree ( & self , tree : & ' a Tree ) -> TokenStream {
93+ fn tree ( & self , tree : & Tree ) -> TokenStream {
9494 let items = self . items ( tree) ;
9595
9696 if self . split {
@@ -128,7 +128,7 @@ impl<'a> Writer<'a> {
128128 }
129129 }
130130
131- fn items ( & self , tree : & ' a Tree ) -> TokenStream {
131+ fn items ( & self , tree : & Tree ) -> TokenStream {
132132 let mut functions = vec ! [ ] ;
133133 let mut constants = vec ! [ ] ;
134134 let mut types = vec ! [ ] ;
@@ -286,12 +286,11 @@ impl<'a> Writer<'a> {
286286 // TODO: then list default interface first
287287 // Then everything else
288288
289- for imp in def. interface_impls ( ) {
290- let ty = imp. ty ( generics) ;
291- if imp. has_attribute ( "DefaultAttribute" ) {
292- types. insert ( 0 , self . ty ( & ty) ) ;
289+ for interface in type_def_interfaces ( def, generics) {
290+ if interface. kind == InterfaceKind :: Default {
291+ types. insert ( 0 , self . ty ( & interface. ty ) ) ;
293292 } else {
294- types. push ( self . ty ( & ty) ) ;
293+ types. push ( self . ty ( & interface . ty ) ) ;
295294 }
296295 }
297296
@@ -358,8 +357,7 @@ impl<'a> Writer<'a> {
358357 }
359358 }
360359
361- metadata:: Type :: TypeRef ( code) => {
362- let type_name = code. type_name ( ) ;
360+ metadata:: Type :: TypeRef ( type_name) => {
363361 let namespace = self . namespace ( type_name. namespace ) ;
364362 let name = to_ident ( type_name. name ) ;
365363 quote ! { #namespace #name }
0 commit comments