parser/checker: [ref_only] attribute
parent
3052266a40
commit
09f6cd6a75
|
@ -153,6 +153,7 @@ pub:
|
||||||
is_c bool
|
is_c bool
|
||||||
is_js bool
|
is_js bool
|
||||||
is_union bool
|
is_union bool
|
||||||
|
attr string
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct InterfaceDecl {
|
pub struct InterfaceDecl {
|
||||||
|
|
|
@ -232,6 +232,12 @@ pub fn (mut c Checker) struct_decl(decl ast.StructDecl) {
|
||||||
if sym.kind == .placeholder && !decl.is_c && !sym.name.starts_with('C.') {
|
if sym.kind == .placeholder && !decl.is_c && !sym.name.starts_with('C.') {
|
||||||
c.error('unknown type `$sym.name`', field.pos)
|
c.error('unknown type `$sym.name`', field.pos)
|
||||||
}
|
}
|
||||||
|
if sym.kind == .struct_ {
|
||||||
|
info:=sym.info as table.Struct
|
||||||
|
if info.is_ref_only && !field.typ.is_ptr() {
|
||||||
|
c.error('`$sym.name` type can only be used as a reference: `&$sym.name`', field.pos)
|
||||||
|
}
|
||||||
|
}
|
||||||
if field.has_default_expr {
|
if field.has_default_expr {
|
||||||
c.expected_type = field.typ
|
c.expected_type = field.typ
|
||||||
field_expr_type := c.expr(field.default_expr)
|
field_expr_type := c.expr(field.default_expr)
|
||||||
|
|
|
@ -166,6 +166,7 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
|
||||||
fields: fields
|
fields: fields
|
||||||
is_typedef: is_typedef
|
is_typedef: is_typedef
|
||||||
is_union: is_union
|
is_union: is_union
|
||||||
|
is_ref_only: p.attr == 'ref_only'
|
||||||
}
|
}
|
||||||
mod: p.mod
|
mod: p.mod
|
||||||
is_public: is_pub
|
is_public: is_pub
|
||||||
|
@ -193,6 +194,7 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
|
||||||
is_c: is_c
|
is_c: is_c
|
||||||
is_js: is_js
|
is_js: is_js
|
||||||
is_union: is_union
|
is_union: is_union
|
||||||
|
attr: p.attr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -534,6 +534,7 @@ pub mut:
|
||||||
fields []Field
|
fields []Field
|
||||||
is_typedef bool // C. [typedef]
|
is_typedef bool // C. [typedef]
|
||||||
is_union bool
|
is_union bool
|
||||||
|
is_ref_only bool
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Interface {
|
pub struct Interface {
|
||||||
|
@ -655,7 +656,7 @@ pub fn(t &Table) fn_to_str(func &Fn) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sb.write(')')
|
sb.write(')')
|
||||||
if func.return_type != table.void_type {
|
if func.return_type != void_type {
|
||||||
sb.write(' ${t.type_to_str(func.return_type)}')
|
sb.write(' ${t.type_to_str(func.return_type)}')
|
||||||
}
|
}
|
||||||
return sb.str()
|
return sb.str()
|
||||||
|
|
Loading…
Reference in New Issue