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 }