1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
use erl_pp::{self, MacroDef}; use erl_tokenize::{Lexer, LexicalToken}; pub trait Preprocessor { fn define_macro(&mut self, name: &str, replacement: Vec<LexicalToken>); fn undef_macro(&mut self, name: &str); } impl<'a> Preprocessor for &'a mut Preprocessor { fn define_macro(&mut self, name: &str, replacement: Vec<LexicalToken>) { (*self).define_macro(name, replacement); } fn undef_macro(&mut self, name: &str) { (*self).undef_macro(name); } } impl<'a, T, E> Preprocessor for &'a mut erl_pp::Preprocessor<T, E> { fn define_macro(&mut self, name: &str, replacement: Vec<LexicalToken>) { (*self).define_macro(name, replacement); } fn undef_macro(&mut self, name: &str) { (*self).undef_macro(name); } } impl<T, E> Preprocessor for erl_pp::Preprocessor<T, E> { fn define_macro(&mut self, name: &str, replacement: Vec<LexicalToken>) { self.macros_mut().insert( name.to_string(), MacroDef::Dynamic(replacement), ); } fn undef_macro(&mut self, name: &str) { self.macros_mut().remove(name); } } impl<T> Preprocessor for Lexer<T> { fn define_macro(&mut self, _name: &str, _replacement: Vec<LexicalToken>) {} fn undef_macro(&mut self, _name: &str) {} }