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 }