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}