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