@ -14,11 +14,13 @@ pub enum Type {
 
			
		
	
		
			
				
					     Float ( u32 ) ,  
			
		
	
		
			
				
					     Int ( u32 ) ,  
			
		
	
		
			
				
					     Unsigned ( u32 ) ,  
			
		
	
		
			
				
					     Void ,  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					impl   fmt ::Display   for   Type   {  
			
		
	
		
			
				
					     fn  fmt ( & self ,   f : & mut   fmt ::Formatter )   -> fmt ::Result   {  
			
		
	
		
			
				
					         match   self   {  
			
		
	
		
			
				
					             Type ::Void   = >   write! ( f ,   "<>" ) ,  
			
		
	
		
			
				
					             Type ::Pointer ( typ ,   storage_class )   = >   match   storage_class   {  
			
		
	
		
			
				
					                 StorageClass ::Input   = >   write! ( f ,   "*{}i" ,   typ ) ,  
			
		
	
		
			
				
					                 StorageClass ::Output   = >   write! ( f ,   "*{}o" ,   typ ) ,  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -42,6 +44,10 @@ pub fn parse_type(typ: &String) -> Type {
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					     let   c   =   typ . chars ( ) . next ( ) . unwrap ( ) ;  
			
		
	
		
			
				
					     match   c   {  
			
		
	
		
			
				
					         '<'   = >   {  
			
		
	
		
			
				
					             assert_eq! ( typ . as_str ( ) ,   "<>" ) ;  
			
		
	
		
			
				
					             Type ::Void  
			
		
	
		
			
				
					         }  
			
		
	
		
			
				
					         '*'   = >   {  
			
		
	
		
			
				
					             let   mut   chars   =   typ . chars ( ) ;  
			
		
	
		
			
				
					             chars . next ( ) ;  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -79,6 +85,9 @@ pub fn parse_type(typ: &String) -> Type {
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					fn  emit_type ( typ : Type ,   ops : & mut   Vec < ( String ,   String ) > )   {  
			
		
	
		
			
				
					     match   & typ   {  
			
		
	
		
			
				
					         Type ::Void   = >   {  
			
		
	
		
			
				
					             ops . push ( ( "%void" . to_string ( ) ,   "OpTypeVoid" . to_string ( ) ) ) ;  
			
		
	
		
			
				
					         }  
			
		
	
		
			
				
					         Type ::Unsigned ( size )   = >   {  
			
		
	
		
			
				
					             ops . push ( (  
			
		
	
		
			
				
					                 format! ( "%u{}" ,   size ) . to_string ( ) ,  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -129,7 +138,13 @@ fn emit_type(typ: Type, ops: &mut Vec<(String, String)>) {
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					fn  fix_name ( name : & String )   -> String  {  
			
		
	
		
			
				
					     format! ( "%{}" ,   name . clone ( ) . replace ( "-" ,   "_" ) . replace ( "*" ,   "p" ) )  
			
		
	
		
			
				
					     format! (  
			
		
	
		
			
				
					         "%{}" ,  
			
		
	
		
			
				
					         name . clone ( )  
			
		
	
		
			
				
					             . replace ( "-" ,   "_" )  
			
		
	
		
			
				
					             . replace ( "*" ,   "p" )  
			
		
	
		
			
				
					             . replace ( "<>" ,   "void" )  
			
		
	
		
			
				
					     )  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					fn  has_id ( name : String ,   ops : & Vec < ( Option < String > ,   Vec < String > ) > )   -> bool  {  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -248,6 +263,24 @@ pub fn spirv_meta(module: Module) -> String {
 
			
		
	
		
			
				
					         }  
			
		
	
		
			
				
					     }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					     for   fun   in   module . functions   {  
			
		
	
		
			
				
					         let   name   =   fix_name ( & fun . name ) ;  
			
		
	
		
			
				
					         let   return_type   =   fix_name ( & fun . return_type ) ;  
			
		
	
		
			
				
					         let   mut   type_ops   =   Vec ::new ( ) ;  
			
		
	
		
			
				
					         emit_type ( parse_type ( & fun . return_type ) ,   & mut   type_ops ) ;  
			
		
	
		
			
				
					         for   op   in   type_ops   {  
			
		
	
		
			
				
					             if   has_id ( op . 0. clone ( ) ,   & ops )   {  
			
		
	
		
			
				
					                 continue ;  
			
		
	
		
			
				
					             }  
			
		
	
		
			
				
					             ops . push ( ( Some ( op . 0 ) ,   vec! [ op . 1 ] ) ) ;  
			
		
	
		
			
				
					         }  
			
		
	
		
			
				
					         // Push OpFunctionType
  
			
		
	
		
			
				
					         ops . push ( (  
			
		
	
		
			
				
					             Some ( name . clone ( ) ) ,  
			
		
	
		
			
				
					             vec! [ "OpTypeFunction" . to_string ( ) ,   return_type . clone ( ) ] ,  
			
		
	
		
			
				
					         ) ) ;  
			
		
	
		
			
				
					     }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					     for   op   in   ops   {  
			
		
	
		
			
				
					         if   op . 0. is_some ( )   {  
			
		
	
		
			
				
					             write! ( spirv_asm ,   "{} = " ,   op . 0. unwrap ( ) ) . unwrap ( ) ;