proc_macro
Version:
A JavaScript implementation of proc_macros.
25 lines (19 loc) • 905 B
text/typescript
import TokenStream from "./token_stream";
export type ParsingFunction = (tokenString: TokenStream) => TokenStream | string;
export type TaggedTemplateFunction = (strings: readonly string[], ...keys: string[]) => string;
/**
* Wrapper function to create the proc_macro tagged template function.
* @param parsingFunction Function used to parse input.
*/
export default function proc_macro(parsingFunction: ParsingFunction): TaggedTemplateFunction {
return function (strings: readonly string[], ...keys: string[]) {
let tokenString = strings.map((str, i) => str + (keys[i] || '')).join('');
try {
let tokenStream = TokenStream.tokenize(tokenString);
let parseOutput = parsingFunction(tokenStream);
return (typeof parseOutput === 'string') ? parseOutput : parseOutput.toJavaScript();
} catch(e) {
throw e;
}
};
}