Skip to content

Commit 93fbf94

Browse files
committed
Make structs work again
1 parent a069ee4 commit 93fbf94

File tree

1 file changed

+38
-38
lines changed

1 file changed

+38
-38
lines changed

src/typechecking.pr

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -293,37 +293,37 @@ export def resolve(typeref: &TypeRef, scpe: &Scope, error_on_fail: bool = true)
293293
return typeref.tpe
294294
}
295295
if typeref.name {
296-
let id = scope::get_type_id(scpe, parser::make_identifier(typeref.name), error_on_fail = error_on_fail)
296+
let id = scope::get_type_id(scpe, parser::identifier_from_str(typeref.name), error_on_fail)
297297
typeref.tpe = id
298298
return id
299299
}
300300
if typeref.pattern {
301-
let id = resolve_generic(typeref.pattern, scpe)
301+
let id = resolve_generic(typeref.pattern, scpe, error_on_fail)
302302
typeref.tpe = id
303303
return id
304304
}
305305
}
306306

307-
def resolve_generic(generic: &Pattern, scpe: &Scope) -> TypeId {
307+
def resolve_generic(generic: &Pattern, scpe: &Scope, error_on_fail: bool = true) -> TypeId {
308308
switch generic.kind {
309309
case TypeKind::ARRAY
310-
return array(resolve(generic.tpe, scpe))
310+
return array(resolve(generic.tpe, scpe, error_on_fail))
311311
case TypeKind::STATIC_ARRAY
312-
return static_array(resolve(generic.tpe, scpe), generic.length, generic.kw)
312+
return static_array(resolve(generic.tpe, scpe, error_on_fail), generic.length, generic.kw)
313313
case TypeKind::POINTER
314-
return pointer(resolve(generic.tpe, scpe), generic.kw)
314+
return pointer(resolve(generic.tpe, scpe, error_on_fail), generic.kw)
315315
case TypeKind::REFERENCE
316-
return reference(resolve(generic.tpe, scpe), generic.kw)
316+
return reference(resolve(generic.tpe, scpe, error_on_fail), generic.kw)
317317
case TypeKind::WEAK_REF
318-
return weak_reference(resolve(generic.tpe, scpe), generic.kw)
318+
return weak_reference(resolve(generic.tpe, scpe, error_on_fail), generic.kw)
319319
case TypeKind::FUNCTION, TypeKind::CLOSURE
320320
var params: &Vector(NamedParameter) = vector::make(NamedParameter)
321321
for var param in generic.parameter_t {
322-
vector::push(params, [tpe = resolve(param.tpe, scpe)] !NamedParameter)
322+
vector::push(params, [tpe = resolve(param.tpe, scpe, error_on_fail)] !NamedParameter)
323323
}
324324
var return_ids: &Vector(TypeId) = vector::make(TypeId)
325325
for var ret in generic.return_t {
326-
vector::push(return_ids, resolve(ret, scpe))
326+
vector::push(return_ids, resolve(ret, scpe, error_on_fail))
327327
}
328328
if generic.kind == TypeKind::CLOSURE {
329329
return closure(params, return_ids)
@@ -333,7 +333,7 @@ def resolve_generic(generic: &Pattern, scpe: &Scope) -> TypeId {
333333
case TypeKind::TUPLE, TypeKind::TUNION
334334
var param_ids: &Vector(TypeId) = vector::make(TypeId)
335335
for var param in generic.parameter_t {
336-
vector::push(param_ids, resolve(param.tpe, scpe))
336+
vector::push(param_ids, resolve(param.tpe, scpe, error_on_fail))
337337
}
338338
if generic.kind == TypeKind::TUPLE {
339339
return tuple(param_ids)
@@ -345,15 +345,15 @@ def resolve_generic(generic: &Pattern, scpe: &Scope) -> TypeId {
345345
for var field in generic.fields {
346346
vector::push(fields, [
347347
name = field.name,
348-
tpe = resolve(field.tpe, scpe),
348+
tpe = resolve(field.tpe, scpe, error_on_fail),
349349
properties = field.properties
350350
] !StructMember)
351351
}
352352
var const_fields: &Vector(StructMember) = vector::make(StructMember)
353353
for var field in generic.const_fields {
354354
vector::push(const_fields, [
355355
name = field.name,
356-
tpe = resolve(field.tpe, scpe),
356+
tpe = resolve(field.tpe, scpe, error_on_fail),
357357
properties = field.properties
358358
] !StructMember)
359359
}
@@ -2347,7 +2347,7 @@ export def convert_type_score(a: &TypeRef, b: &Type, scpe: &scope::Scope, impl:
23472347
if a.pattern {
23482348
return convert_type_score(a.pattern, b, scpe, impl)
23492349
} else if a.name {
2350-
if scope::get_type(scpe, parser::make_identifier(a.name)) { return 1 }
2350+
if scope::get_type(scpe, parser::identifier_from_str(a.name)) { return 1 }
23512351
} else {
23522352
return convert_type_score(a.resolve(scpe), b, scpe, impl)
23532353
}
@@ -2360,7 +2360,7 @@ export def convert_type_score(a: &Pattern, b: &Type, scpe: &scope::Scope, impl:
23602360
return 1
23612361
} else { return -1 }
23622362
} else if a.name {
2363-
scope::create_type(scpe, parser::make_identifier(a.name), parser::ShareMarker::NONE, make_type_ref(b.id))
2363+
scope::create_type(scpe, parser::identifier_from_str(a.name), parser::ShareMarker::NONE, make_type_ref(b.id))
23642364
}
23652365
return 1
23662366
}
@@ -3428,9 +3428,9 @@ def do_type_lookup(node: &parser::Node, state: &State, is_type: bool = false) ->
34283428
} else /*if not lookup_default*/ {
34293429
let value = scope::get(state.scope, node)
34303430
if not value {
3431-
errors::errorn(node, "Unknown identifier `", name, "`")
3431+
//errors::errorn(node, "Unknown identifier `", name, "`")
34323432
scope::create_dependency(state.current_value(), scope::make_ident(name))
3433-
return null
3433+
return make_type_ref(name)
34343434
} else {
34353435
if value.modifier != parser::VarDecl::TYPE { return null }
34363436

@@ -3824,35 +3824,35 @@ def do_type_lookup(node: &parser::Node, state: &State, is_type: bool = false) ->
38243824

38253825
// Returns the common type of two arithmetic types
38263826
// byte -> ubyte -> short -> ushort -> int -> uint -> long -> ulong
3827-
export def common_type(a: TypeId, b: TypeId) -> TypeId {
3827+
export def common_type(a: &Type, b: &Type) -> TypeId {
38283828
if not a or not b { return 0 }
38293829

38303830
//TODO Should cause an error
38313831
//assert(is_arithmetic(a) and is_arithmetic(b))
38323832

38333833
if a.kind == TypeKind::FLOAT and (b.kind == TypeKind::WORD or b.kind == TypeKind::CHAR) {
3834-
return a
3834+
return a.id
38353835
} else if (a.kind == TypeKind::WORD or a.kind == TypeKind::CHAR) and b.kind == TypeKind::FLOAT {
3836-
return b
3836+
return b.id
38373837
} else if a.kind == TypeKind::BOOL and is_arithmetic(b) {
3838-
return a
3838+
return a.id
38393839
} else if b.kind == TypeKind::BOOL and is_arithmetic(a) {
3840-
return b
3840+
return b.id
38413841
}
38423842

38433843
if is_arithmetic(a) and is_arithmetic(b) {
3844-
let a_size = a.resolve().size
3845-
let b_size = b.resolve().size
3844+
let a_size = a.size
3845+
let b_size = b.size
38463846
if a_size == b_size {
3847-
if b.resolve().unsig {
3848-
return b
3847+
if b.unsig {
3848+
return b.id
38493849
} else {
3850-
return a
3850+
return a.id
38513851
}
38523852
} else if a_size > b_size {
3853-
return a
3853+
return a.id
38543854
} else {
3855-
return b
3855+
return b.id
38563856
}
38573857
}
38583858
return 0
@@ -6435,17 +6435,17 @@ def walk_MemberAccess_ucs(node: &parser::Node, state: &State) -> bool {
64356435
}
64366436
}
64376437
}
6438-
6439-
def resolve_member(tpe: &Type, name: String) -> &Type {
6438+
*/
6439+
def resolve_member(tpe: &Type, name: String) -> TypeId {
64406440
for var member in @tpe.fields {
64416441
if member.name {
64426442
if member.name == name {
6443-
lookup_struct_member(member)
6443+
//lookup_struct_member(member)
64446444
return member.tpe
64456445
}
64466446
} else {
64476447
var tpe = member.tpe
6448-
if member.is_embed and is_ref(member.tpe) {
6448+
if member.properties.is_embed and is_ref(member.tpe) {
64496449
tpe = member.tpe.tpe
64506450
}
64516451
let member = resolve_member(tpe, name)
@@ -6457,8 +6457,8 @@ def resolve_member(tpe: &Type, name: String) -> &Type {
64576457
return member.tpe
64586458
}
64596459
}
6460-
return null
6461-
}*/
6460+
return 0
6461+
}
64626462

64636463
def walk_MemberAccess(node: &parser::Node, state: &State) {
64646464
let left = node.value.bin_op.left
@@ -6519,15 +6519,15 @@ def walk_MemberAccess_aggregate(node: &parser::Node, ucs: bool, state: &State) -
65196519

65206520
if tpe.kind == TypeKind::STRUCT or tpe.kind == TypeKind::UNION {
65216521
let name = last_ident_to_str(right)
6522-
6523-
if not tpe {
6522+
let rtpe = resolve_member(tpe, name)
6523+
if not rtpe {
65246524
if ucs {
65256525
if walk_MemberAccess_ucs(node, state) { return true }
65266526
errors::errorn(node, "Unknown field `", name, "` on type ", debug::type_to_str(left.tpe))
65276527
}
65286528
return false
65296529
}
6530-
node.tpe = tpe
6530+
node.tpe = rtpe
65316531
} else if tpe.kind == TypeKind::ARRAY or tpe.kind == TypeKind::STATIC_ARRAY {
65326532
let name = last_ident_to_str(right)
65336533
if name == "size" {

0 commit comments

Comments
 (0)