Make global identifier for macro-generated globals better
This commit is contained in:
		
							parent
							
								
									baa7bafafc
								
							
						
					
					
						commit
						f5f55079a9
					
				| @ -1,11 +1,15 @@ | |||||||
| use std::collections::HashMap; | use std::{cell::RefCell, collections::HashMap, rc::Rc}; | ||||||
| 
 | 
 | ||||||
| use crate::mir::{self, FunctionCall, GlobalKind, GlobalValue, IfExpression, Literal, TypeKind, WhileStatement}; | use crate::mir::{self, FunctionCall, GlobalKind, GlobalValue, IfExpression, Literal, TypeKind, WhileStatement}; | ||||||
| 
 | 
 | ||||||
| use super::pass::{Pass, PassResult, PassState}; | use super::pass::{Pass, PassResult, PassState}; | ||||||
| 
 | 
 | ||||||
| pub trait MacroFunction: std::fmt::Debug { | pub trait MacroFunction: std::fmt::Debug { | ||||||
|     fn generate<'ctx, 'a>(&self, params: &[mir::Literal]) -> Result<(Vec<GlobalValue>, mir::ExprKind), ErrorKind>; |     fn generate<'ctx, 'a>( | ||||||
|  |         &self, | ||||||
|  |         params: &[mir::Literal], | ||||||
|  |         prefix: String, | ||||||
|  |     ) -> Result<(Vec<GlobalValue>, mir::ExprKind), ErrorKind>; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(thiserror::Error, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] | #[derive(thiserror::Error, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] | ||||||
| @ -30,6 +34,8 @@ pub struct MacroPass { | |||||||
|     pub(crate) macros: HashMap<String, Box<dyn MacroFunction>>, |     pub(crate) macros: HashMap<String, Box<dyn MacroFunction>>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | pub struct MacroData {} | ||||||
|  | 
 | ||||||
| type MacroPassState<'st, 'sc> = PassState<'st, 'sc, (), ErrorKind>; | type MacroPassState<'st, 'sc> = PassState<'st, 'sc, (), ErrorKind>; | ||||||
| 
 | 
 | ||||||
| impl Pass for MacroPass { | impl Pass for MacroPass { | ||||||
| @ -106,7 +112,13 @@ impl mir::Expression { | |||||||
|                         } |                         } | ||||||
|                         let (generated_globals, expr) = state.or_else( |                         let (generated_globals, expr) = state.or_else( | ||||||
|                             existing_macro |                             existing_macro | ||||||
|                                 .generate(&literals) |                                 .generate( | ||||||
|  |                                     &literals, | ||||||
|  |                                     format!( | ||||||
|  |                                         "macro.{}.{}.{}", | ||||||
|  |                                         function_call.name, self.1.range.start, self.1.range.end | ||||||
|  |                                     ), | ||||||
|  |                                 ) | ||||||
|                                 .map(|(globals, kind)| (globals, mir::Expression(kind, self.1))), |                                 .map(|(globals, kind)| (globals, mir::Expression(kind, self.1))), | ||||||
|                             (Vec::new(), self.clone()), |                             (Vec::new(), self.clone()), | ||||||
|                             self.1, |                             self.1, | ||||||
| @ -190,7 +202,11 @@ pub fn form_macros() -> HashMap<String, Box<dyn MacroFunction>> { | |||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub struct TestMacro; | pub struct TestMacro; | ||||||
| impl MacroFunction for TestMacro { | impl MacroFunction for TestMacro { | ||||||
|     fn generate<'ctx, 'a>(&self, literals: &[mir::Literal]) -> Result<(Vec<GlobalValue>, mir::ExprKind), ErrorKind> { |     fn generate<'ctx, 'a>( | ||||||
|  |         &self, | ||||||
|  |         literals: &[mir::Literal], | ||||||
|  |         global_name: String, | ||||||
|  |     ) -> Result<(Vec<GlobalValue>, mir::ExprKind), ErrorKind> { | ||||||
|         if literals.len() != 1 { |         if literals.len() != 1 { | ||||||
|             return Err(ErrorKind::InvalidAmountOfParams(literals.len() as u32, 1)); |             return Err(ErrorKind::InvalidAmountOfParams(literals.len() as u32, 1)); | ||||||
|         } |         } | ||||||
| @ -214,7 +230,6 @@ impl MacroFunction for TestMacro { | |||||||
| 
 | 
 | ||||||
|         let len = literals.len(); |         let len = literals.len(); | ||||||
| 
 | 
 | ||||||
|         let global_name = "sometestglobalvalue".to_owned(); |  | ||||||
|         let global = GlobalValue { |         let global = GlobalValue { | ||||||
|             name: global_name.clone(), |             name: global_name.clone(), | ||||||
|             kind: GlobalKind::Array(literals), |             kind: GlobalKind::Array(literals), | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user