git.delta.rocks / jrsonnet / refs/commits / 86671948a995

difftreelog

source

crates/jrsonnet-macros/src/names.rs640 Bsourcehistory
1use proc_macro2::TokenStream;2use quote::quote;3use std::cell::RefCell;45#[derive(Default)]6pub struct Names {7	names: Vec<String>,8}910impl Names {11	pub fn intern(&mut self, s: impl AsRef<str>) -> usize {12		let s = s.as_ref();13		if let Some(pos) = self.names.iter().position(|v| v == s) {14			return pos;15		}16		let pos = self.names.len();17		self.names.push(s.to_owned());18		pos19	}2021	pub fn expand(&self) -> TokenStream {22		let len = self.names.len();23		let name = self.names.iter();24		quote! {25			thread_local! {26				static NAMES: [::jrsonnet_evaluator::IStr; #len] = [27					#(::jrsonnet_evaluator::IStr::from(#name),)*28				];29			}30		}31	}32}