@@ -54,51 +54,52 @@ fn (mut c Checker) top_stmt(mut node ast.TopStmt) {
5454 c.var_decl (mut node)
5555 }
5656 ast.PropertyDecl {
57- if c.type_is_valid (node.typ) {
58- c.inside_property = true
57+ if ! c.type_is_valid (node.typ) {
58+ type_name := c.get_type_name (node.typ)
59+ c.error ("invalid type `${type_name} ` for property `${node.name} `" , node.pos)
60+ return
61+ }
5962
60- if node.expr ! is ast.EmptyExpr {
61- if ! node.expr.is_literal () {
62- c.error ("expression in object property can only be a literal" , node.pos)
63- }
63+ c.inside_property = true
6464
65- left_type := node.typ
66- mut right_type := c.expr (mut node.expr)
65+ if node.expr ! is ast.EmptyExpr {
66+ if ! node.expr.is_literal () {
67+ c.error ("expression in object property can only be a literal" , node.pos)
68+ }
6769
68- if c.valid_prop_type (left_type, right_type) {}
70+ left_type := node.typ
71+ mut right_type := c.expr (mut node.expr)
72+
73+ if c.valid_prop_type (left_type, right_type) {}
74+ else {
75+ mb_new_expr := c.compile_time_cast_to_type (node.expr, right_type, left_type)
76+ if new_expr := mb_new_expr {
77+ node.expr = new_expr
78+ }
6979 else {
70- mb_new_expr := c.compile_time_cast_to_type (node.expr, right_type, left_type)
71- if new_expr := mb_new_expr {
72- node.expr = new_expr
73- }
74- else {
75- ltype_name := c.get_type_name (left_type)
76- rtype_name := c.get_type_name (right_type)
77- c.error ("value with type `${rtype_name} ` cannot be assigned to a property with type `${ltype_name} `" , node.pos)
78- }
80+ ltype_name := c.get_type_name (left_type)
81+ rtype_name := c.get_type_name (right_type)
82+ c.error ("value with type `${rtype_name} ` cannot be assigned to a property with type `${ltype_name} `" , node.pos)
7983 }
8084 }
85+ }
8186
82- if mut node.read is ast.FnDecl {
83- c.top_stmt (mut & node.read)
84- }
87+ if mut node.read is ast.FnDecl {
88+ c.top_stmt (mut & node.read)
89+ }
8590
86- if mut node.write is ast.FnDecl {
87- c.top_stmt (mut & node.write)
88- }
91+ if mut node.write is ast.FnDecl {
92+ c.top_stmt (mut & node.write)
93+ }
8994
90- sym := c.table.get_type_symbol (c.cur_obj)
91- if t_prop := sym.find_property (node.name) {
92- if t_prop.pos.pos != node.pos.pos {
93- c.error ("property with this name already exists" , node.pos)
94- }
95+ sym := c.table.get_type_symbol (c.cur_obj)
96+ if t_prop := sym.find_property (node.name) {
97+ if t_prop.pos.pos != node.pos.pos {
98+ c.error ("property with this name already exists" , node.pos)
9599 }
96-
97- c.inside_property = false
98- }
99- else {
100- c.error ("invalid type in property declaration" , node.pos)
101100 }
101+
102+ c.inside_property = false
102103 }
103104 ast.Comment {}
104105 }
@@ -182,7 +183,7 @@ fn (mut c Checker) stmt(mut node ast.Stmt) {
182183 valid_obj_none_value := node.is_object_var && node.right is ast.NoneLiteral && (c.table.get_type_symbol (left_type).kind == .script || c.table.get_type_symbol (left_type).kind == .array)
183184
184185 if c.valid_type (left_type, right_type) || valid_obj_none_value {}
185- else if c.can_autocast (right_type, left_type) {
186+ else if c.type_is_valid (left_type) && c. type_is_valid (right_type) && c. can_autocast (right_type, left_type) {
186187 node.right = c.cast_to_type (node.right, right_type, left_type)
187188 right_type = left_type
188189 }
@@ -240,7 +241,7 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
240241
241242 if ! c.type_is_valid (param.typ) {
242243 type_name := c.get_type_name (param.typ)
243- c.error ("invalid type `${type_name} ` in function parameter " , node.pos)
244+ c.error ("invalid type `${type_name} ` for parameter # ${i + 1} ` ${param.name} ` in function ` ${node.name} ` " , node.pos)
244245 continue
245246 }
246247
0 commit comments