return Check_Return_To_Symres;
}
- if (!type_is_structlike(field->expr->type)) {
- ERROR_(field->token->pos,
- "Cannot access field '%b' on '%s'. Type is not a struct.",
- field->token->text,
- field->token->length,
- node_get_type_name(field->expr));
- }
-
// Optimization for (*foo).member.
if (field->expr->kind == Ast_Kind_Dereference) {
field->expr = ((AstDereference *) field->expr)->expr;
}
}
+ if (!type_is_structlike(field->expr->type)) {
+ /*ERROR_(field->token->pos,
+ "Cannot access field '%b' on '%s'. Type is not a struct.",
+ field->token->text,
+ field->token->length,
+ node_get_type_name(field->expr));*/
+ goto try_resolve_from_type;
+ }
+
StructMember smem;
if (!type_lookup_member(field->expr->type, field->field, &smem)) {
if (field->expr->type->kind == Type_Kind_Array) {
}
}
- AstNode* n = try_symbol_raw_resolve_from_type(field->expr->type, field->field);
-
- AstType* type_node = field->expr->type->ast_type;
- if (!n) n = try_symbol_raw_resolve_from_node((AstNode *) type_node, field->field);
-
- if (n) {
- *pfield = (AstFieldAccess *) n;
- return Check_Success;
- }
-
- if (!type_node) goto closest_not_found;
-
- char* closest = find_closest_symbol_in_node((AstNode *) type_node, field->field);
- if (closest) {
- ERROR_(field->token->pos, "Field '%s' does not exists on '%s'. Did you mean '%s'?", field->field, node_get_type_name(field->expr), closest);
- }
-
- closest_not_found:
- ERROR_(field->token->pos, "Field '%s' does not exists on '%s'.", field->field, node_get_type_name(field->expr));
+ goto try_resolve_from_type;
}
// NOTE: If this member was included into the structure through a "use x: ^T" kind of statement,
field->type = smem.type;
field->flags |= Ast_Flag_Has_Been_Checked;
return Check_Success;
+
+ // TODO: DOCUMENT THIS WEIRD CASE
+ try_resolve_from_type:
+ AstNode* n = try_symbol_raw_resolve_from_type(field->expr->type, field->field);
+
+ AstType* type_node = field->expr->type->ast_type;
+ if (!n) n = try_symbol_raw_resolve_from_node((AstNode *) type_node, field->field);
+
+ if (n) {
+ *pfield = (AstFieldAccess *) n;
+ return Check_Success;
+ }
+
+ if (!type_node) goto closest_not_found;
+
+ char* closest = find_closest_symbol_in_node((AstNode *) type_node, field->field);
+ if (closest) {
+ ERROR_(field->token->pos, "Field '%s' does not exists on '%s'. Did you mean '%s'?", field->field, node_get_type_name(field->expr), closest);
+ }
+
+ closest_not_found:
+ ERROR_(field->token->pos, "Field '%s' does not exists on '%s'.", field->field, node_get_type_name(field->expr));
}
CheckStatus check_method_call(AstBinaryOp** pmcall) {
}
AstNode* try_symbol_raw_resolve_from_node(AstNode* node, char* symbol) {
+ // CLEANUP: I think this has a lot of duplication from get_scope_from_node.
+ // There are some additional cases handled here, but I think the majority
+ // of this code could be rewritten in terms of get_scope_from_node.
+
b32 used_pointer = 0;
while (1) {
return symbol_raw_resolve(fb->scope, symbol);
}
+ case Ast_Kind_Basic_Type: {
+ AstBasicType *bt = (AstBasicType *) node;
+
+ if (bt->scope == NULL)
+ return NULL;
+
+ return symbol_raw_resolve(bt->scope, symbol);
+ }
+
case Ast_Kind_Enum_Type: {
AstEnumType* etype = (AstEnumType *) node;
return symbol_raw_resolve(etype->scope, symbol);
// return and not continue because if the overload that didn't have a type will
// work in the future, then it has to take precedence over the other options available.
+ bh_imap_free(&all_overloads);
+ bh_arr_free(args.values);
return (AstTyped *) &node_that_signals_a_yield;
}
assert(overload->type->kind == Type_Kind_Function);
}
if (tm == TYPE_MATCH_YIELD) {
+ bh_imap_free(&all_overloads);
+ bh_arr_free(args.values);
return (AstTyped *) &node_that_signals_a_yield;
}
}
return &package->package->scope;
}
+ case Ast_Kind_Basic_Type: {
+ AstBasicType* btype = (AstBasicType *) node;
+ return &btype->scope;
+ }
+
case Ast_Kind_Enum_Type: {
AstEnumType* etype = (AstEnumType *) node;
return &etype->scope;
// is used in other parts of the compiler for struct/enum
// scopes?
if (!*pscope) {
- assert(node->token);
- *pscope = scope_create(context.ast_alloc, NULL, node->token->pos);
+ OnyxFilePos pos = {0};
+ if (node->token) pos = node->token->pos;
+
+ *pscope = scope_create(context.ast_alloc, NULL, pos);
}
return *pscope;