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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
use faststr::FastStr;
use heck::{ToSnakeCase, ToUpperCamelCase};
use quote::{format_ident, IdentFragment};
use std::fmt::Display;
use std::ops::Deref;
crate::newtype_index! {
pub struct DefId { .. }
}
crate::newtype_index! {
pub struct TagId { .. }
}
#[derive(Hash, PartialEq, Eq, Clone, Debug)]
pub struct Symbol(pub FastStr);
impl std::borrow::Borrow<str> for Symbol {
fn borrow(&self) -> &str {
self
}
}
impl Deref for Symbol {
type Target = str;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<T> From<T> for Symbol
where
T: Into<FastStr>,
{
fn from(t: T) -> Self {
Symbol(t.into())
}
}
impl IdentFragment for Symbol {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{self}")
}
}
impl Display for Symbol {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f)
}
}
#[derive(Hash, PartialEq, Eq, Clone, Debug)]
pub struct Ident {
pub sym: Symbol,
}
impl Ident {
pub fn new(sym: Symbol) -> Self {
Ident { sym }
}
}
impl Deref for Ident {
type Target = Symbol;
fn deref(&self) -> &Self::Target {
&self.sym
}
}
impl IdentFragment for Ident {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
quote::IdentFragment::fmt(&self.sym, f)
}
}
impl Display for Ident {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(&self.sym, f)
}
}
impl<T> From<T> for Ident
where
T: Into<FastStr>,
{
fn from(t: T) -> Self {
Ident {
sym: Symbol(t.into()),
}
}
}
pub trait IdentName {
fn upper_camel_ident(&self) -> FastStr;
fn snake_ident(&self) -> FastStr;
fn as_syn_ident(&self) -> syn::Ident;
}
fn str2ident(s: &str) -> syn::Ident {
format_ident!("{}", s)
}
impl IdentName for &str {
fn upper_camel_ident(&self) -> FastStr {
self.to_upper_camel_case().into()
}
fn snake_ident(&self) -> FastStr {
self.to_snake_case().into()
}
fn as_syn_ident(&self) -> syn::Ident {
str2ident(self)
}
}
impl IdentName for FastStr {
fn upper_camel_ident(&self) -> FastStr {
(&**self).upper_camel_ident()
}
fn snake_ident(&self) -> FastStr {
(&**self).snake_ident()
}
fn as_syn_ident(&self) -> syn::Ident {
str2ident(self)
}
}