@@ -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
64636463def 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