1 module dsymbol.builtin.symbols;
2 
3 import containers.hashset;
4 import containers.ttree;
5 import dparse.rollback_allocator;
6 import dsymbol.builtin.names;
7 import dsymbol.string_interning;
8 import dsymbol.symbol;
9 import stdx.allocator.mallocator : Mallocator;
10 
11 alias SymbolsAllocator = Mallocator;
12 
13 /**
14  * Symbols for the built in types
15  */
16 TTree!(DSymbol*, SymbolsAllocator, true, "a < b") builtinSymbols;
17 
18 /**
19  * Array properties
20  */
21 TTree!(DSymbol*, SymbolsAllocator, true, "a < b") arraySymbols;
22 
23 /**
24  * Associative array properties
25  */
26 TTree!(DSymbol*, SymbolsAllocator, true, "a < b") assocArraySymbols;
27 
28 /**
29  * Struct, enum, union, class, and interface properties
30  */
31 TTree!(DSymbol*, SymbolsAllocator, true, "a < b") aggregateSymbols;
32 
33 /**
34  * Class properties
35  */
36 TTree!(DSymbol*, SymbolsAllocator, true, "a < b") classSymbols;
37 
38 /**
39  * Enum properties
40  */
41 TTree!(DSymbol*, SymbolsAllocator, true, "a < b") enumSymbols;
42 
43 /**
44  * Variadic template parameters properties
45  */
46 DSymbol* variadicTmpParamSymbol;
47 
48 /**
49  * Type template parameters properties (when no colon constraint)
50  */
51 DSymbol* typeTmpParamSymbol;
52 
53 static this()
54 {
55 	auto bool_ = makeSymbol(builtinTypeNames[13], CompletionKind.keyword);
56 	auto int_ = makeSymbol(builtinTypeNames[0], CompletionKind.keyword);
57 	auto long_ = makeSymbol(builtinTypeNames[8], CompletionKind.keyword);
58 	auto byte_ = makeSymbol(builtinTypeNames[19], CompletionKind.keyword);
59 	auto char_ = makeSymbol(builtinTypeNames[10], CompletionKind.keyword);
60 	auto dchar_ = makeSymbol(builtinTypeNames[12], CompletionKind.keyword);
61 	auto short_ = makeSymbol(builtinTypeNames[6], CompletionKind.keyword);
62 	auto ubyte_ = makeSymbol(builtinTypeNames[20], CompletionKind.keyword);
63 	auto uint_ = makeSymbol(builtinTypeNames[1], CompletionKind.keyword);
64 	auto ulong_ = makeSymbol(builtinTypeNames[9], CompletionKind.keyword);
65 	auto ushort_ = makeSymbol(builtinTypeNames[7], CompletionKind.keyword);
66 	auto wchar_ = makeSymbol(builtinTypeNames[11], CompletionKind.keyword);
67 
68 	auto alignof_ = makeSymbol("alignof", CompletionKind.keyword);
69 	auto mangleof_ = makeSymbol("mangleof", CompletionKind.keyword);
70 	auto sizeof_ = makeSymbol("sizeof", CompletionKind.keyword);
71 	auto stringof_ = makeSymbol("stringof", CompletionKind.keyword);
72 	auto init = makeSymbol("init", CompletionKind.keyword);
73 	auto min = makeSymbol("min", CompletionKind.keyword);
74 	auto max = makeSymbol("max", CompletionKind.keyword);
75 	auto dup = makeSymbol("dup", CompletionKind.keyword);
76 	auto length = makeSymbol("length", CompletionKind.keyword, ulong_);
77 	auto tupleof = makeSymbol("tupleof", CompletionKind.keyword);
78 
79 	variadicTmpParamSymbol = makeSymbol("variadicTmpParam", CompletionKind.keyword);
80 	variadicTmpParamSymbol.addChild(init, false);
81 	variadicTmpParamSymbol.addChild(length, false);
82 	variadicTmpParamSymbol.addChild(stringof_, false);
83 
84 	typeTmpParamSymbol = makeSymbol("typeTmpParam", CompletionKind.keyword);
85 	typeTmpParamSymbol.addChild(alignof_, false);
86 	typeTmpParamSymbol.addChild(init, false);
87 	typeTmpParamSymbol.addChild(mangleof_, false);
88 	typeTmpParamSymbol.addChild(sizeof_, false);
89 	typeTmpParamSymbol.addChild(stringof_, false);
90 
91 	arraySymbols.insert(alignof_);
92 	arraySymbols.insert(dup);
93 	arraySymbols.insert(makeSymbol("idup", CompletionKind.keyword));
94 	arraySymbols.insert(init);
95 	arraySymbols.insert(length);
96 	arraySymbols.insert(mangleof_);
97 	arraySymbols.insert(makeSymbol("ptr", CompletionKind.keyword));
98 	arraySymbols.insert(sizeof_);
99 	arraySymbols.insert(stringof_);
100 
101 	assocArraySymbols.insert(alignof_);
102 	assocArraySymbols.insert(makeSymbol("byKey", CompletionKind.keyword));
103 	assocArraySymbols.insert(makeSymbol("byValue", CompletionKind.keyword));
104 	assocArraySymbols.insert(makeSymbol("clear", CompletionKind.keyword));
105 	assocArraySymbols.insert(dup);
106 	assocArraySymbols.insert(makeSymbol("get", CompletionKind.keyword));
107 	assocArraySymbols.insert(init);
108 	assocArraySymbols.insert(makeSymbol("keys", CompletionKind.keyword));
109 	assocArraySymbols.insert(length);
110 	assocArraySymbols.insert(mangleof_);
111 	assocArraySymbols.insert(makeSymbol("rehash", CompletionKind.keyword));
112 	assocArraySymbols.insert(sizeof_);
113 	assocArraySymbols.insert(stringof_);
114 	assocArraySymbols.insert(init);
115 	assocArraySymbols.insert(makeSymbol("values", CompletionKind.keyword));
116 
117 	DSymbol*[12] integralTypeArray;
118 	integralTypeArray[0] = bool_;
119 	integralTypeArray[1] = int_;
120 	integralTypeArray[2] = long_;
121 	integralTypeArray[3] = byte_;
122 	integralTypeArray[4] = char_;
123 	integralTypeArray[5] = dchar_;
124 	integralTypeArray[6] = short_;
125 	integralTypeArray[7] = ubyte_;
126 	integralTypeArray[8] = uint_;
127 	integralTypeArray[9] = ulong_;
128 	integralTypeArray[10] = ushort_;
129 	integralTypeArray[11] = wchar_;
130 
131 	foreach (s; integralTypeArray)
132 	{
133 		s.addChild(makeSymbol("init", CompletionKind.keyword, s), false);
134 		s.addChild(makeSymbol("min", CompletionKind.keyword, s), false);
135 		s.addChild(makeSymbol("max", CompletionKind.keyword, s), false);
136 		s.addChild(alignof_, false);
137 		s.addChild(sizeof_, false);
138 		s.addChild(stringof_, false);
139 		s.addChild(mangleof_, false);
140 	}
141 
142 	auto cdouble_ = makeSymbol(builtinTypeNames[21], CompletionKind.keyword);
143 	auto cent_ = makeSymbol(builtinTypeNames[15], CompletionKind.keyword);
144 	auto cfloat_ = makeSymbol(builtinTypeNames[22], CompletionKind.keyword);
145 	auto creal_ = makeSymbol(builtinTypeNames[23], CompletionKind.keyword);
146 	auto double_ = makeSymbol(builtinTypeNames[2], CompletionKind.keyword);
147 	auto float_ = makeSymbol(builtinTypeNames[4], CompletionKind.keyword);
148 	auto idouble_ = makeSymbol(builtinTypeNames[3], CompletionKind.keyword);
149 	auto ifloat_ = makeSymbol(builtinTypeNames[5], CompletionKind.keyword);
150 	auto ireal_ = makeSymbol(builtinTypeNames[18], CompletionKind.keyword);
151 	auto real_ = makeSymbol(builtinTypeNames[17], CompletionKind.keyword);
152 	auto ucent_ = makeSymbol(builtinTypeNames[16], CompletionKind.keyword);
153 
154 	DSymbol*[11] floatTypeArray;
155 	floatTypeArray[0] = cdouble_;
156 	floatTypeArray[1] = cent_;
157 	floatTypeArray[2] = cfloat_;
158 	floatTypeArray[3] = creal_;
159 	floatTypeArray[4] = double_;
160 	floatTypeArray[5] = float_;
161 	floatTypeArray[6] = idouble_;
162 	floatTypeArray[7] = ifloat_;
163 	floatTypeArray[8] = ireal_;
164 	floatTypeArray[9] = real_;
165 	floatTypeArray[10] = ucent_;
166 
167 	foreach (s; floatTypeArray)
168 	{
169 		s.addChild(alignof_, false);
170 		s.addChild(makeSymbol("dig", CompletionKind.keyword, s), false);
171 		s.addChild(makeSymbol("epsilon", CompletionKind.keyword, s), false);
172 		s.addChild(makeSymbol("infinity", CompletionKind.keyword, s), false);
173 		s.addChild(makeSymbol("init", CompletionKind.keyword, s), false);
174 		s.addChild(mangleof_, false);
175 		s.addChild(makeSymbol("mant_dig", CompletionKind.keyword, int_), false);
176 		s.addChild(makeSymbol("max", CompletionKind.keyword, s), false);
177 		s.addChild(makeSymbol("max_10_exp", CompletionKind.keyword, int_), false);
178 		s.addChild(makeSymbol("max_exp", CompletionKind.keyword, int_), false);
179 		s.addChild(makeSymbol("min_exp", CompletionKind.keyword, int_), false);
180 		s.addChild(makeSymbol("min_10_exp", CompletionKind.keyword, int_), false);
181 		s.addChild(makeSymbol("min_normal", CompletionKind.keyword, s), false);
182 		s.addChild(makeSymbol("nan", CompletionKind.keyword, s), false);
183 		s.addChild(sizeof_, false);
184 		s.addChild(stringof_, false);
185 	}
186 
187 	aggregateSymbols.insert(tupleof);
188 	aggregateSymbols.insert(mangleof_);
189 	aggregateSymbols.insert(alignof_);
190 	aggregateSymbols.insert(sizeof_);
191 	aggregateSymbols.insert(stringof_);
192 	aggregateSymbols.insert(init);
193 
194 	classSymbols.insert(makeSymbol("classinfo", CompletionKind.variableName));
195 	classSymbols.insert(tupleof);
196 	classSymbols.insert(makeSymbol("__vptr", CompletionKind.variableName));
197 	classSymbols.insert(makeSymbol("__monitor", CompletionKind.variableName));
198 	classSymbols.insert(mangleof_);
199 	classSymbols.insert(alignof_);
200 	classSymbols.insert(sizeof_);
201 	classSymbols.insert(stringof_);
202 	classSymbols.insert(init);
203 
204 	enumSymbols.insert(init);
205 	enumSymbols.insert(sizeof_);
206 	enumSymbols.insert(alignof_);
207 	enumSymbols.insert(mangleof_);
208 	enumSymbols.insert(stringof_);
209 	enumSymbols.insert(min);
210 	enumSymbols.insert(max);
211 
212 
213 	ireal_.addChild(makeSymbol("im", CompletionKind.keyword, real_), false);
214 	ifloat_.addChild(makeSymbol("im", CompletionKind.keyword, float_), false);
215 	idouble_.addChild(makeSymbol("im", CompletionKind.keyword, double_), false);
216 	ireal_.addChild(makeSymbol("re", CompletionKind.keyword, real_), false);
217 	ifloat_.addChild(makeSymbol("re", CompletionKind.keyword, float_), false);
218 	idouble_.addChild(makeSymbol("re", CompletionKind.keyword, double_), false);
219 
220 	auto void_ = makeSymbol(builtinTypeNames[14], CompletionKind.keyword);
221 
222 	builtinSymbols.insert(bool_);
223 	bool_.type = bool_;
224 	builtinSymbols.insert(int_);
225 	int_.type = int_;
226 	builtinSymbols.insert(long_);
227 	long_.type = long_;
228 	builtinSymbols.insert(byte_);
229 	byte_.type = byte_;
230 	builtinSymbols.insert(char_);
231 	char_.type = char_;
232 	builtinSymbols.insert(dchar_);
233 	dchar_.type = dchar_;
234 	builtinSymbols.insert(short_);
235 	short_.type = short_;
236 	builtinSymbols.insert(ubyte_);
237 	ubyte_.type = ubyte_;
238 	builtinSymbols.insert(uint_);
239 	uint_.type = uint_;
240 	builtinSymbols.insert(ulong_);
241 	ulong_.type = ulong_;
242 	builtinSymbols.insert(ushort_);
243 	ushort_.type = ushort_;
244 	builtinSymbols.insert(wchar_);
245 	wchar_.type = wchar_;
246 	builtinSymbols.insert(cdouble_);
247 	cdouble_.type = cdouble_;
248 	builtinSymbols.insert(cent_);
249 	cent_.type = cent_;
250 	builtinSymbols.insert(cfloat_);
251 	cfloat_.type = cfloat_;
252 	builtinSymbols.insert(creal_);
253 	creal_.type = creal_;
254 	builtinSymbols.insert(double_);
255 	double_.type = double_;
256 	builtinSymbols.insert(float_);
257 	float_.type = float_;
258 	builtinSymbols.insert(idouble_);
259 	idouble_.type = idouble_;
260 	builtinSymbols.insert(ifloat_);
261 	ifloat_.type = ifloat_;
262 	builtinSymbols.insert(ireal_);
263 	ireal_.type = ireal_;
264 	builtinSymbols.insert(real_);
265 	real_.type = real_;
266 	builtinSymbols.insert(ucent_);
267 	ucent_.type = ucent_;
268 	builtinSymbols.insert(void_);
269 	void_.type = void_;
270 
271 
272 	foreach (s; ["__DATE__", "__EOF__", "__TIME__", "__TIMESTAMP__", "__VENDOR__",
273 			"__VERSION__", "__FUNCTION__", "__PRETTY_FUNCTION__", "__MODULE__",
274 			"__FILE__", "__LINE__", "__FILE_FULL_PATH__"])
275 		builtinSymbols.insert(makeSymbol(s, CompletionKind.keyword));
276 }
277 
278 static ~this()
279 {
280 	destroy(builtinSymbols);
281 	destroy(arraySymbols);
282 	destroy(assocArraySymbols);
283 	destroy(aggregateSymbols);
284 	destroy(classSymbols);
285 	destroy(enumSymbols);
286 
287 	foreach (sym; symbolsMadeHere[])
288 		destroy(*sym);
289 
290 	destroy(symbolsMadeHere);
291 	destroy(rba);
292 }
293 
294 private RollbackAllocator rba;
295 private HashSet!(DSymbol*) symbolsMadeHere;
296 
297 private DSymbol* makeSymbol(string s, CompletionKind kind, DSymbol* type = null)
298 {
299 	auto sym = rba.make!DSymbol(istring(s), kind, type);
300 	sym.ownType = false;
301 	symbolsMadeHere.insert(sym);
302 	return sym;
303 }
304 private DSymbol* makeSymbol(istring s, CompletionKind kind, DSymbol* type = null)
305 {
306 	auto sym = rba.make!DSymbol(s, kind, type);
307 	sym.ownType = false;
308 	symbolsMadeHere.insert(sym);
309 	return sym;
310 }