| 267 | } |
| 268 | |
| 269 | TypeConstructor TypeSystem::declareTypeConstructor(std::string _name, std::string _canonicalName, size_t _arguments, Declaration const* _declaration) |
| 270 | { |
| 271 | solAssert(m_canonicalTypeNames.insert(_canonicalName).second, "Duplicate canonical type name."); |
| 272 | Sort baseSort{{primitiveClass(PrimitiveClass::Type)}}; |
| 273 | size_t index = m_typeConstructors.size(); |
| 274 | m_typeConstructors.emplace_back(TypeConstructorInfo{ |
| 275 | _name, |
| 276 | _canonicalName, |
| 277 | {Arity{std::vector<Sort>{_arguments, baseSort}, primitiveClass(PrimitiveClass::Type)}}, |
| 278 | _declaration |
| 279 | }); |
| 280 | TypeConstructor constructor{index}; |
| 281 | if (_arguments) |
| 282 | { |
| 283 | std::vector<Sort> argumentSorts; |
| 284 | std::generate_n(std::back_inserter(argumentSorts), _arguments, [&](){ return Sort{{primitiveClass(PrimitiveClass::Type)}}; }); |
| 285 | std::vector<Type> argumentTypes; |
| 286 | std::generate_n(std::back_inserter(argumentTypes), _arguments, [&](){ return freshVariable({}); }); |
| 287 | m_globalTypeEnvironment.fixTypeVars(argumentTypes); |
| 288 | auto error = instantiateClass(type(constructor, argumentTypes), Arity{argumentSorts, primitiveClass(PrimitiveClass::Type)}); |
| 289 | solAssert(!error, *error); |
| 290 | } |
| 291 | else |
| 292 | { |
| 293 | auto error = instantiateClass(type(constructor, {}), Arity{{}, primitiveClass(PrimitiveClass::Type)}); |
| 294 | solAssert(!error, *error); |
| 295 | } |
| 296 | return constructor; |
| 297 | } |
| 298 | |
| 299 | std::variant<TypeClass, std::string> TypeSystem::declareTypeClass(std::string _name, Declaration const* _declaration, bool _primitive) |
| 300 | { |