@@ -10,8 +10,8 @@ use super::{
10
10
11
11
use acvm:: { AcirField , FieldElement } ;
12
12
use ast:: {
13
- Identifier , ParsedBlock , ParsedFunction , ParsedInstruction , ParsedParameter , ParsedSsa ,
14
- ParsedValue ,
13
+ AssertMessage , Identifier , ParsedBlock , ParsedFunction , ParsedInstruction , ParsedParameter ,
14
+ ParsedSsa , ParsedValue ,
15
15
} ;
16
16
use lexer:: { Lexer , LexerError } ;
17
17
use noirc_errors:: Span ;
@@ -313,7 +313,20 @@ impl<'a> Parser<'a> {
313
313
let lhs = self . parse_value_or_error ( ) ?;
314
314
self . eat_or_error ( Token :: Equal ) ?;
315
315
let rhs = self . parse_value_or_error ( ) ?;
316
- Ok ( Some ( ParsedInstruction :: Constrain { lhs, rhs } ) )
316
+
317
+ let assert_message = if self . eat ( Token :: Comma ) ? {
318
+ if let Some ( str) = self . eat_str ( ) ? {
319
+ Some ( AssertMessage :: Static ( str) )
320
+ } else if self . eat_keyword ( Keyword :: Data ) ? {
321
+ Some ( AssertMessage :: Dynamic ( self . parse_comma_separated_values ( ) ?) )
322
+ } else {
323
+ return self . expected_string_or_data ( ) ;
324
+ }
325
+ } else {
326
+ None
327
+ } ;
328
+
329
+ Ok ( Some ( ParsedInstruction :: Constrain { lhs, rhs, assert_message } ) )
317
330
}
318
331
319
332
fn parse_decrement_rc ( & mut self ) -> ParseResult < Option < ParsedInstruction > > {
@@ -654,6 +667,10 @@ impl<'a> Parser<'a> {
654
667
return Ok ( Type :: Reference ( Arc :: new ( typ) ) ) ;
655
668
}
656
669
670
+ if self . eat_keyword ( Keyword :: Function ) ? {
671
+ return Ok ( Type :: Function ) ;
672
+ }
673
+
657
674
self . expected_type ( )
658
675
}
659
676
@@ -767,6 +784,18 @@ impl<'a> Parser<'a> {
767
784
}
768
785
}
769
786
787
+ fn eat_str ( & mut self ) -> ParseResult < Option < String > > {
788
+ if matches ! ( self . token. token( ) , Token :: Str ( ..) ) {
789
+ let token = self . bump ( ) ?;
790
+ match token. into_token ( ) {
791
+ Token :: Str ( string) => Ok ( Some ( string) ) ,
792
+ _ => unreachable ! ( ) ,
793
+ }
794
+ } else {
795
+ Ok ( None )
796
+ }
797
+ }
798
+
770
799
fn eat ( & mut self , token : Token ) -> ParseResult < bool > {
771
800
if self . token . token ( ) == & token {
772
801
self . bump ( ) ?;
@@ -812,6 +841,13 @@ impl<'a> Parser<'a> {
812
841
} )
813
842
}
814
843
844
+ fn expected_string_or_data < T > ( & mut self ) -> ParseResult < T > {
845
+ Err ( ParserError :: ExpectedStringOrData {
846
+ found : self . token . token ( ) . clone ( ) ,
847
+ span : self . token . to_span ( ) ,
848
+ } )
849
+ }
850
+
815
851
fn expected_identifier < T > ( & mut self ) -> ParseResult < T > {
816
852
Err ( ParserError :: ExpectedIdentifier {
817
853
found : self . token . token ( ) . clone ( ) ,
@@ -873,6 +909,8 @@ pub(crate) enum ParserError {
873
909
ExpectedType { found : Token , span : Span } ,
874
910
#[ error( "Expected an instruction or terminator, found '{found}'" ) ]
875
911
ExpectedInstructionOrTerminator { found : Token , span : Span } ,
912
+ #[ error( "Expected a string literal or 'data', found '{found}'" ) ]
913
+ ExpectedStringOrData { found : Token , span : Span } ,
876
914
#[ error( "Expected a value, found '{found}'" ) ]
877
915
ExpectedValue { found : Token , span : Span } ,
878
916
#[ error( "Multiple return values only allowed for call" ) ]
@@ -889,6 +927,7 @@ impl ParserError {
889
927
| ParserError :: ExpectedInt { span, .. }
890
928
| ParserError :: ExpectedType { span, .. }
891
929
| ParserError :: ExpectedInstructionOrTerminator { span, .. }
930
+ | ParserError :: ExpectedStringOrData { span, .. }
892
931
| ParserError :: ExpectedValue { span, .. } => * span,
893
932
ParserError :: MultipleReturnValuesOnlyAllowedForCall { second_target, .. } => {
894
933
second_target. span
0 commit comments