@@ -13,12 +13,14 @@ use super::tokens::{Kind::*, TokenStream};
1313use crate :: ast:: * ;
1414use crate :: data:: * ;
1515
16- pub fn parse_signature ( stream : & mut TokenStream ) -> ParseResult < Signature > {
17- stream. expect_kind ( LeftSquare ) ?;
16+ pub fn parse_signature ( stream : & mut TokenStream ) -> ParseResult < WithPos < Signature > > {
17+ let left_square = stream. expect_kind ( LeftSquare ) ?;
18+ let start_pos = left_square. pos ;
1819 let mut type_marks = Vec :: new ( ) ;
1920 let mut return_mark = None ;
2021 let mut errmsg = None ;
21- loop {
22+
23+ let pos = loop {
2224 let token = stream. peek_expect ( ) ?;
2325
2426 try_token_kind ! (
@@ -32,7 +34,7 @@ pub fn parse_signature(stream: &mut TokenStream) -> ParseResult<Signature> {
3234 sep_token,
3335 Comma => { } ,
3436 RightSquare => {
35- break ;
37+ break start_pos . combine ( & sep_token . pos ) ;
3638 } ,
3739 Return => {
3840 let new_return_mark = Some ( parse_selected_name( stream) ?) ;
@@ -55,19 +57,22 @@ pub fn parse_signature(stream: &mut TokenStream) -> ParseResult<Signature> {
5557 } ,
5658 RightSquare => {
5759 stream. move_after( & token) ;
58- break ;
60+ break start_pos . combine ( & token . pos ) ;
5961 }
6062 )
61- }
63+ } ;
64+
6265 if let Some ( diagnostic) = errmsg {
6366 // @TODO recoverable error should not return Err
6467 return Err ( diagnostic) ;
6568 }
6669
67- Ok ( match return_mark {
70+ let signature = match return_mark {
6871 Some ( return_mark) => Signature :: Function ( type_marks, return_mark) ,
6972 None => Signature :: Procedure ( type_marks) ,
70- } )
73+ } ;
74+
75+ Ok ( WithPos :: new ( signature, pos) )
7176}
7277
7378fn parse_designator ( stream : & mut TokenStream ) -> ParseResult < WithPos < SubprogramDesignator > > {
@@ -316,7 +321,10 @@ function foo(foo : natural) return lib.foo.natural;
316321 let code = Code :: new ( "[return bar.type_mark]" ) ;
317322 assert_eq ! (
318323 code. with_stream( parse_signature) ,
319- Signature :: Function ( vec![ ] , code. s1( "bar.type_mark" ) . selected_name( ) )
324+ WithPos :: new(
325+ Signature :: Function ( vec![ ] , code. s1( "bar.type_mark" ) . selected_name( ) ) ,
326+ code. pos( )
327+ )
320328 ) ;
321329 }
322330
@@ -325,9 +333,12 @@ function foo(foo : natural) return lib.foo.natural;
325333 let code = Code :: new ( "[foo.type_mark return bar.type_mark]" ) ;
326334 assert_eq ! (
327335 code. with_stream( parse_signature) ,
328- Signature :: Function (
329- vec![ code. s1( "foo.type_mark" ) . selected_name( ) ] ,
330- code. s1( "bar.type_mark" ) . selected_name( )
336+ WithPos :: new(
337+ Signature :: Function (
338+ vec![ code. s1( "foo.type_mark" ) . selected_name( ) ] ,
339+ code. s1( "bar.type_mark" ) . selected_name( )
340+ ) ,
341+ code. pos( )
331342 )
332343 ) ;
333344 }
@@ -337,7 +348,10 @@ function foo(foo : natural) return lib.foo.natural;
337348 let code = Code :: new ( "[foo.type_mark]" ) ;
338349 assert_eq ! (
339350 code. with_stream( parse_signature) ,
340- Signature :: Procedure ( vec![ code. s1( "foo.type_mark" ) . selected_name( ) ] )
351+ WithPos :: new(
352+ Signature :: Procedure ( vec![ code. s1( "foo.type_mark" ) . selected_name( ) ] ) ,
353+ code. pos( )
354+ )
341355 ) ;
342356 }
343357
@@ -346,12 +360,15 @@ function foo(foo : natural) return lib.foo.natural;
346360 let code = Code :: new ( "[foo.type_mark, foo2.type_mark return bar.type_mark]" ) ;
347361 assert_eq ! (
348362 code. with_stream( parse_signature) ,
349- Signature :: Function (
350- vec![
351- code. s1( "foo.type_mark" ) . selected_name( ) ,
352- code. s1( "foo2.type_mark" ) . selected_name( )
353- ] ,
354- code. s1( "bar.type_mark" ) . selected_name( )
363+ WithPos :: new(
364+ Signature :: Function (
365+ vec![
366+ code. s1( "foo.type_mark" ) . selected_name( ) ,
367+ code. s1( "foo2.type_mark" ) . selected_name( )
368+ ] ,
369+ code. s1( "bar.type_mark" ) . selected_name( )
370+ ) ,
371+ code. pos( )
355372 )
356373 ) ;
357374 }
0 commit comments