11use anyhow:: Result ;
2- use vim9_lexer:: { Token , TokenKind } ;
2+ use vim9_lexer:: { Span , Token , TokenKind } ;
33
4- use crate :: { Block , Body , ExCommand , Literal , Parser } ;
4+ use crate :: { Block , Body , ExCommand , Literal , Parser , TokenMeta } ;
55
66#[ derive( Debug , PartialEq , Clone ) ]
77pub struct AugroupCommand {
8- augroup : Token ,
8+ augroup : TokenMeta ,
99 pub augroup_name : Literal ,
10- augroup_eol : Token ,
10+ augroup_eol : TokenMeta ,
1111 pub body : Body ,
12- augroup_end : Token ,
13- augroup_end_name : Token ,
14- augroup_end_eol : Token ,
12+ augroup_end : TokenMeta ,
13+ augroup_end_name : TokenMeta ,
14+ augroup_end_eol : TokenMeta ,
1515}
1616
1717impl AugroupCommand {
18- pub fn parse ( parser : & mut Parser ) -> Result < ExCommand > {
18+ pub fn parse ( parser : & Parser ) -> Result < ExCommand > {
1919 Ok ( ExCommand :: Augroup ( AugroupCommand {
20- augroup : parser. expect_identifier_with_text ( "augroup" ) ?,
20+ augroup : parser. expect_identifier_with_text ( "augroup" ) ?. into ( ) ,
2121 augroup_name : parser
2222 . expect_token ( TokenKind :: Identifier ) ?
2323 . try_into ( ) ?,
2424 augroup_eol : parser. expect_eol ( ) ?,
2525 // TODO: This should be until augroup END, unless you can't have nested ones legally
2626 body : Body :: parse_until ( parser, "augroup" ) ?,
27- augroup_end : parser. expect_identifier_with_text ( "augroup" ) ?,
28- augroup_end_name : parser. expect_identifier_with_text ( "END" ) ?,
27+ augroup_end : parser. expect_identifier_with_text ( "augroup" ) ?. into ( ) ,
28+ augroup_end_name : parser. expect_identifier_with_text ( "END" ) ?. into ( ) ,
2929 augroup_end_eol : parser. expect_eol ( ) ?,
3030 } ) )
3131 }
3232}
3333
3434#[ derive( Debug , PartialEq , Clone ) ]
3535pub struct AutocmdCommand {
36- autocmd : Token ,
36+ autocmd : TokenMeta ,
3737 pub bang : bool ,
3838 pub events : Vec < Literal > ,
3939 pub pattern : AutocmdPattern ,
@@ -46,17 +46,16 @@ pub enum AutocmdPattern {
4646 Buffer ,
4747}
4848
49- fn tokens_are_neighbors ( left : & Token , right : & Token ) -> bool {
50- left. span . end_row == right. span . start_row
51- && left. span . end_col == right. span . start_col
49+ fn tokens_are_neighbors ( left : & Span , right : & Span ) -> bool {
50+ left. end_row == right. start_row && left. end_col == right. start_col
5251}
5352
5453impl AutocmdCommand {
55- pub fn parse ( parser : & mut Parser ) -> Result < ExCommand > {
54+ pub fn parse ( parser : & Parser ) -> Result < ExCommand > {
5655 Ok ( ExCommand :: Autocmd ( AutocmdCommand {
5756 // TODO: Accept au! for example
58- autocmd : parser. expect_identifier_with_text ( "autocmd" ) ?,
59- bang : if parser. current_token . kind == TokenKind :: Bang {
57+ autocmd : parser. expect_identifier_with_text ( "autocmd" ) ?. into ( ) ,
58+ bang : if parser. front_kind ( ) == TokenKind :: Bang {
6059 parser. next_token ( ) ;
6160 true
6261 } else {
@@ -67,7 +66,7 @@ impl AutocmdCommand {
6766
6867 loop {
6968 events. push ( parser. pop ( ) . try_into ( ) ?) ;
70- if parser. current_token . kind != TokenKind :: Comma {
69+ if parser. front_kind ( ) != TokenKind :: Comma {
7170 break ;
7271 }
7372
@@ -89,16 +88,16 @@ pub enum AutocmdBlock {
8988}
9089
9190impl AutocmdBlock {
92- pub fn parse ( parser : & mut Parser ) -> Result < AutocmdBlock > {
93- Ok ( match parser. current_token . kind {
91+ pub fn parse ( parser : & Parser ) -> Result < AutocmdBlock > {
92+ Ok ( match parser. front_kind ( ) {
9493 TokenKind :: LeftBrace => AutocmdBlock :: Block ( Block :: parse ( parser) ?) ,
9594 _ => AutocmdBlock :: Command ( parser. parse_command ( ) ?. into ( ) ) ,
9695 } )
9796 }
9897}
9998impl AutocmdPattern {
100- fn parse ( parser : & mut Parser ) -> Result < Self > {
101- Ok ( if parser. current_token . kind == TokenKind :: AngleLeft {
99+ fn parse ( parser : & Parser ) -> Result < Self > {
100+ Ok ( if parser. front_kind ( ) == TokenKind :: AngleLeft {
102101 parser. read_until ( |t| {
103102 matches ! ( t. kind, TokenKind :: AngleRight | TokenKind :: GreaterThan )
104103 } ) ;
@@ -121,7 +120,10 @@ impl AutocmdPattern {
121120 // Append the text of the token.
122121 text += tok. text . as_str ( ) ;
123122
124- if !tokens_are_neighbors ( & tok, & parser. current_token ) {
123+ if !tokens_are_neighbors (
124+ & tok. span ,
125+ & parser. front_ref ( ) . span ,
126+ ) {
125127 pattern. push ( std:: mem:: take ( & mut text) ) ;
126128 break pattern;
127129 }
0 commit comments