19 std::vector<std::string> qualifications;
21 size_t namespace_delimiter_index = qualified_name.find(
"::");
22 if (namespace_delimiter_index == std::string::npos)
break;
23 qualifications.push_back(
24 qualified_name.substr(0, namespace_delimiter_index));
25 qualified_name = qualified_name.substr(namespace_delimiter_index + 2);
27 return QualifiedName(std::move(qualifications), qualified_name);
31 for (
const std::string& qualifier : name.namespace_qualification) {
32 os << qualifier <<
"::";
34 return os << name.name;
38 os <<
"callable " <<
m.ReadableName() <<
"(";
39 if (
m.signature().implicit_count != 0) {
42 m.signature().parameter_types.types.begin(),
43 m.signature().parameter_types.types.begin() +
44 m.signature().implicit_count);
45 os << implicit_parameter_types <<
")(";
47 m.signature().parameter_types.types.begin() +
48 m.signature().implicit_count,
49 m.signature().parameter_types.types.end());
50 os << explicit_parameter_types;
52 os <<
m.signature().parameter_types;
54 os <<
"): " << *
m.signature().return_type;
65 os <<
"runtime function " << *b.
signature().return_type <<
" "
71 os <<
"generic " << g.
name() <<
"<";
74 return identifier.name->value;
82 Scope* s, std::string name)
86 while (s && s->GetSpecializationRequester().IsNone()) s = s->ParentScope();
91 if (!name.namespace_qualification.empty() &&
92 name.namespace_qualification[0].empty()) {
94 name.DropFirstNamespaceQualification());
96 std::vector<Declarable*>
result;
101 result.push_back(declarable);
108 if (type->IsTopType()) {
109 return TopType::cast(type)->reason();
119 const std::vector<const Type*>& types,
120 const std::vector<TypeConstraint>& constraints) {
121 DCHECK_EQ(constraints.size(), types.size());
122 for (
size_t i = 0;
i < types.size(); ++
i) {
123 if (
auto violation = constraints[
i].IsViolated(types[
i])) {
124 return {
"Could not instantiate generic, " + *violation +
"."};
132 CurrentScope::Scope scope_scope(scope);
133 std::vector<TypeConstraint>
result;
135 if (parameter.constraint) {
146 const TypeVector& explicit_specialization_types,
147 const std::vector<std::optional<const Type*>>& arguments) {
148 const std::vector<TypeExpression*>& parameters =
152 explicit_specialization_types, parameters,
157 inference.
Fail(*violation);
164 if (
auto* macro_decl = TorqueMacroDeclaration::DynamicCast(
declaration())) {
165 return macro_decl->body;
166 }
else if (
auto* builtin_decl =
167 TorqueBuiltinDeclaration::DynamicCast(
declaration())) {
168 return builtin_decl->body;
182 CurrentScope::Scope scope_activator(
ParentScope());
183 CurrentSourcePosition::Scope position_activator(
Position());
187 s <<
"Cannot create type " << decl->
name->
value
188 <<
" due to circular dependencies.";
const Signature & signature() const
const std::string & ReadableName() const
Scope * ParentScope() const
SourcePosition Position() const
TypeArgumentInference InferSpecializationTypes(const TypeVector &explicit_specialization_types, const std::vector< std::optional< const Type * > > &arguments)
std::optional< Statement * > CallableBody()
const std::string & name() const
const std::vector< TypeConstraint > & Constraints()
const GenericParameters & generic_parameters() const
static Namespace * GetDefaultNamespace()
bool IsDefaultNamespace() const
const std::string & name() const
bool IsTestNamespace() const
std::vector< Declarable * > LookupShallow(const QualifiedName &name)
std::vector< Declarable * > Lookup(const QualifiedName &name)
std::optional< TypeDeclaration * > delayed_
const Type * Resolve() const
std::optional< const Type * > type_
TypeVector GetResult() const
void Fail(std::string reason)
static TypeConstraint SubtypeConstraint(const Type *upper_bound)
std::optional< const Type * > upper_bound
static TypeConstraint Unconstrained()
std::optional< std::string > IsViolated(const Type *) const
static const Type * ComputeType(TypeExpression *type_expression)
ZoneVector< RpoNumber > & result
std::ostream & operator<<(std::ostream &os, Identifier *id)
void ReportError(Args &&... args)
std::string ToString(Args &&... args)
std::vector< GenericParameter > GenericParameters
std::vector< const Type * > TypeVector
std::optional< std::string > FindConstraintViolation(const std::vector< const Type * > &types, const std::vector< TypeConstraint > &constraints)
std::vector< TypeConstraint > ComputeConstraints(Scope *scope, const GenericParameters ¶meters)
void PrintCommaSeparatedList(std::ostream &os, const T &list, C &&transform)
static const char *const kTestNamespaceName
#define DCHECK_EQ(v1, v2)
QualifiedName(std::vector< std::string > namespace_qualification, std::string name)
static QualifiedName Parse(std::string qualified_name)
SpecializationRequester(SourcePosition position, Scope *scope, std::string name)