@@ -723,6 +723,14 @@ fn (mut p Parser) top_stmt() ast.Stmt {
723723 }
724724 }
725725 }
726+ .at {
727+ if p.peek_tok.kind == .lsbr {
728+ p.attributes ()
729+ continue
730+ } else {
731+ return p.error ('@[attr] expected' )
732+ }
733+ }
726734 .lsbr {
727735 // attrs are stored in `p.attrs`
728736 p.attributes ()
@@ -1769,11 +1777,20 @@ fn (mut p Parser) is_attributes() bool {
17691777
17701778// when is_top_stmt is true attrs are added to p.attrs
17711779fn (mut p Parser) attributes () {
1772- p.check (.lsbr)
1780+ mut is_at := false
1781+ if p.tok.kind == .lsbr {
1782+ // [attr]
1783+ p.check (.lsbr)
1784+ } else if p.tok.kind == .at {
1785+ // @[attr]
1786+ p.check (.at)
1787+ p.check (.lsbr)
1788+ is_at = true
1789+ }
17731790 mut has_ctdefine := false
17741791 for p.tok.kind != .rsbr {
17751792 start_pos := p.tok.pos ()
1776- attr := p.parse_attr ()
1793+ attr := p.parse_attr (is_at )
17771794 if p.attrs.contains (attr.name) && attr.name != 'wasm_export' {
17781795 p.error_with_pos ('duplicate attribute `${attr.name} `' , start_pos.extend (p.prev_tok.pos ()))
17791796 return
@@ -1809,7 +1826,7 @@ fn (mut p Parser) attributes() {
18091826 }
18101827}
18111828
1812- fn (mut p Parser) parse_attr () ast.Attr {
1829+ fn (mut p Parser) parse_attr (is_at bool ) ast.Attr {
18131830 mut kind := ast.AttrKind.plain
18141831 apos := p.prev_tok.pos ()
18151832 if p.tok.kind == .key_unsafe {
@@ -1882,6 +1899,7 @@ fn (mut p Parser) parse_attr() ast.Attr {
18821899 ct_expr: comptime_cond
18831900 ct_opt: comptime_cond_opt
18841901 pos: apos.extend (p.tok.pos ())
1902+ has_at: is_at
18851903 }
18861904}
18871905
@@ -3431,7 +3449,7 @@ fn (mut p Parser) parse_number_literal() ast.Expr {
34313449fn (mut p Parser) module_decl () ast.Module {
34323450 mut module_attrs := []ast.Attr{}
34333451 mut attrs_pos := p.tok.pos ()
3434- for p.tok.kind == .lsbr {
3452+ for p.tok.kind == .lsbr || p.tok. kind == .at {
34353453 p.attributes ()
34363454 }
34373455 module_attrs << p.attrs
@@ -3959,7 +3977,7 @@ fn (mut p Parser) enum_decl() ast.EnumDecl {
39593977 uses_exprs = true
39603978 }
39613979 mut attrs := []ast.Attr{}
3962- if p.tok.kind == .lsbr {
3980+ if p.tok.kind == .lsbr || p.tok. kind == .at {
39633981 p.attributes ()
39643982 attrs << p.attrs
39653983 enum_attrs[val] = attrs
0 commit comments