1+ use super :: * ;
2+
3+
4+ pub fn parse (
5+ report : & mut diagn:: Report ,
6+ walker : & mut syntax:: TokenWalker ,
7+ _header_span : diagn:: Span )
8+ -> Result < AstSymbol , ( ) >
9+ {
10+ let mut no_emit = false ;
11+
12+ if let Some ( _) = walker. maybe_expect ( syntax:: TokenKind :: ParenOpen )
13+ {
14+ let tk_attrb = walker. expect ( report, syntax:: TokenKind :: Identifier ) ?;
15+ let attrb = tk_attrb. excerpt . as_ref ( ) . unwrap ( ) ;
16+
17+ match attrb. as_ref ( )
18+ {
19+ "noemit" => no_emit = true ,
20+ _ =>
21+ {
22+ report. error_span (
23+ format ! ( "invalid attribute `{}`" , attrb) ,
24+ tk_attrb. span ) ;
25+
26+ return Err ( ( ) ) ;
27+ }
28+ }
29+
30+ walker. expect ( report, syntax:: TokenKind :: ParenClose ) ?;
31+ }
32+
33+
34+ let mut decl_span = diagn:: Span :: new_dummy ( ) ;
35+ let mut hierarchy_level = 0 ;
36+
37+ while let Some ( tk_dot) = walker. maybe_expect ( syntax:: TokenKind :: Dot )
38+ {
39+ hierarchy_level += 1 ;
40+ decl_span = decl_span. join ( tk_dot. span ) ;
41+ }
42+
43+ let tk_name = walker. expect ( report, syntax:: TokenKind :: Identifier ) ?;
44+ let name = tk_name. excerpt . clone ( ) . unwrap ( ) ;
45+ decl_span = decl_span. join ( tk_name. span ) ;
46+
47+
48+ walker. expect ( report, syntax:: TokenKind :: Equal ) ?;
49+
50+ let expr = expr:: parse ( report, walker) ?;
51+ walker. expect_linebreak ( report) ?;
52+
53+ Ok ( AstSymbol {
54+ decl_span,
55+ hierarchy_level,
56+ name,
57+ kind : AstSymbolKind :: Constant ( AstSymbolConstant {
58+ expr,
59+ } ) ,
60+ no_emit,
61+
62+ item_ref : None ,
63+ } )
64+ }
0 commit comments