@@ -622,7 +622,7 @@ impl<'context> Elaborator<'context> {
622622
623623 let length = stmt. expression ;
624624 let span = self . interner . expr_span ( & length) ;
625- let result = self . try_eval_array_length_id ( length, span) ;
625+ let result = try_eval_array_length_id ( self . interner , length, span) ;
626626
627627 match result. map ( |length| length. try_into ( ) ) {
628628 Ok ( Ok ( length_value) ) => return length_value,
@@ -633,88 +633,6 @@ impl<'context> Elaborator<'context> {
633633 0
634634 }
635635
636- fn try_eval_array_length_id (
637- & self ,
638- rhs : ExprId ,
639- span : Span ,
640- ) -> Result < u128 , Option < ResolverError > > {
641- // Arbitrary amount of recursive calls to try before giving up
642- let fuel = 100 ;
643- self . try_eval_array_length_id_with_fuel ( rhs, span, fuel)
644- }
645-
646- fn try_eval_array_length_id_with_fuel (
647- & self ,
648- rhs : ExprId ,
649- span : Span ,
650- fuel : u32 ,
651- ) -> Result < u128 , Option < ResolverError > > {
652- if fuel == 0 {
653- // If we reach here, it is likely from evaluating cyclic globals. We expect an error to
654- // be issued for them after name resolution so issue no error now.
655- return Err ( None ) ;
656- }
657-
658- match self . interner . expression ( & rhs) {
659- HirExpression :: Literal ( HirLiteral :: Integer ( int, false ) ) => {
660- int. try_into_u128 ( ) . ok_or ( Some ( ResolverError :: IntegerTooLarge { span } ) )
661- }
662- HirExpression :: Ident ( ident, _) => {
663- if let Some ( definition) = self . interner . try_definition ( ident. id ) {
664- match definition. kind {
665- DefinitionKind :: Global ( global_id) => {
666- let let_statement = self . interner . get_global_let_statement ( global_id) ;
667- if let Some ( let_statement) = let_statement {
668- let expression = let_statement. expression ;
669- self . try_eval_array_length_id_with_fuel ( expression, span, fuel - 1 )
670- } else {
671- Err ( Some ( ResolverError :: InvalidArrayLengthExpr { span } ) )
672- }
673- }
674- _ => Err ( Some ( ResolverError :: InvalidArrayLengthExpr { span } ) ) ,
675- }
676- } else {
677- Err ( Some ( ResolverError :: InvalidArrayLengthExpr { span } ) )
678- }
679- }
680- HirExpression :: Infix ( infix) => {
681- let lhs = self . try_eval_array_length_id_with_fuel ( infix. lhs , span, fuel - 1 ) ?;
682- let rhs = self . try_eval_array_length_id_with_fuel ( infix. rhs , span, fuel - 1 ) ?;
683-
684- match infix. operator . kind {
685- BinaryOpKind :: Add => Ok ( lhs + rhs) ,
686- BinaryOpKind :: Subtract => Ok ( lhs - rhs) ,
687- BinaryOpKind :: Multiply => Ok ( lhs * rhs) ,
688- BinaryOpKind :: Divide => Ok ( lhs / rhs) ,
689- BinaryOpKind :: Equal => Ok ( ( lhs == rhs) as u128 ) ,
690- BinaryOpKind :: NotEqual => Ok ( ( lhs != rhs) as u128 ) ,
691- BinaryOpKind :: Less => Ok ( ( lhs < rhs) as u128 ) ,
692- BinaryOpKind :: LessEqual => Ok ( ( lhs <= rhs) as u128 ) ,
693- BinaryOpKind :: Greater => Ok ( ( lhs > rhs) as u128 ) ,
694- BinaryOpKind :: GreaterEqual => Ok ( ( lhs >= rhs) as u128 ) ,
695- BinaryOpKind :: And => Ok ( lhs & rhs) ,
696- BinaryOpKind :: Or => Ok ( lhs | rhs) ,
697- BinaryOpKind :: Xor => Ok ( lhs ^ rhs) ,
698- BinaryOpKind :: ShiftRight => Ok ( lhs >> rhs) ,
699- BinaryOpKind :: ShiftLeft => Ok ( lhs << rhs) ,
700- BinaryOpKind :: Modulo => Ok ( lhs % rhs) ,
701- }
702- }
703- HirExpression :: Cast ( cast) => {
704- let lhs = self . try_eval_array_length_id_with_fuel ( cast. lhs , span, fuel - 1 ) ?;
705- let lhs_value = Value :: Field ( lhs. into ( ) ) ;
706- let evaluated_value =
707- Interpreter :: evaluate_cast_one_step ( & cast, rhs, lhs_value, self . interner )
708- . map_err ( |error| Some ( ResolverError :: ArrayLengthInterpreter { error } ) ) ?;
709-
710- evaluated_value
711- . to_u128 ( )
712- . ok_or_else ( || Some ( ResolverError :: InvalidArrayLengthExpr { span } ) )
713- }
714- _other => Err ( Some ( ResolverError :: InvalidArrayLengthExpr { span } ) ) ,
715- }
716- }
717-
718636 pub fn unify (
719637 & mut self ,
720638 actual : & Type ,
@@ -1851,6 +1769,88 @@ impl<'context> Elaborator<'context> {
18511769 }
18521770}
18531771
1772+ pub fn try_eval_array_length_id (
1773+ interner : & NodeInterner ,
1774+ rhs : ExprId ,
1775+ span : Span ,
1776+ ) -> Result < u128 , Option < ResolverError > > {
1777+ // Arbitrary amount of recursive calls to try before giving up
1778+ let fuel = 100 ;
1779+ try_eval_array_length_id_with_fuel ( interner, rhs, span, fuel)
1780+ }
1781+
1782+ fn try_eval_array_length_id_with_fuel (
1783+ interner : & NodeInterner ,
1784+ rhs : ExprId ,
1785+ span : Span ,
1786+ fuel : u32 ,
1787+ ) -> Result < u128 , Option < ResolverError > > {
1788+ if fuel == 0 {
1789+ // If we reach here, it is likely from evaluating cyclic globals. We expect an error to
1790+ // be issued for them after name resolution so issue no error now.
1791+ return Err ( None ) ;
1792+ }
1793+
1794+ match interner. expression ( & rhs) {
1795+ HirExpression :: Literal ( HirLiteral :: Integer ( int, false ) ) => {
1796+ int. try_into_u128 ( ) . ok_or ( Some ( ResolverError :: IntegerTooLarge { span } ) )
1797+ }
1798+ HirExpression :: Ident ( ident, _) => {
1799+ if let Some ( definition) = interner. try_definition ( ident. id ) {
1800+ match definition. kind {
1801+ DefinitionKind :: Global ( global_id) => {
1802+ let let_statement = interner. get_global_let_statement ( global_id) ;
1803+ if let Some ( let_statement) = let_statement {
1804+ let expression = let_statement. expression ;
1805+ try_eval_array_length_id_with_fuel ( interner, expression, span, fuel - 1 )
1806+ } else {
1807+ Err ( Some ( ResolverError :: InvalidArrayLengthExpr { span } ) )
1808+ }
1809+ }
1810+ _ => Err ( Some ( ResolverError :: InvalidArrayLengthExpr { span } ) ) ,
1811+ }
1812+ } else {
1813+ Err ( Some ( ResolverError :: InvalidArrayLengthExpr { span } ) )
1814+ }
1815+ }
1816+ HirExpression :: Infix ( infix) => {
1817+ let lhs = try_eval_array_length_id_with_fuel ( interner, infix. lhs , span, fuel - 1 ) ?;
1818+ let rhs = try_eval_array_length_id_with_fuel ( interner, infix. rhs , span, fuel - 1 ) ?;
1819+
1820+ match infix. operator . kind {
1821+ BinaryOpKind :: Add => Ok ( lhs + rhs) ,
1822+ BinaryOpKind :: Subtract => Ok ( lhs - rhs) ,
1823+ BinaryOpKind :: Multiply => Ok ( lhs * rhs) ,
1824+ BinaryOpKind :: Divide => Ok ( lhs / rhs) ,
1825+ BinaryOpKind :: Equal => Ok ( ( lhs == rhs) as u128 ) ,
1826+ BinaryOpKind :: NotEqual => Ok ( ( lhs != rhs) as u128 ) ,
1827+ BinaryOpKind :: Less => Ok ( ( lhs < rhs) as u128 ) ,
1828+ BinaryOpKind :: LessEqual => Ok ( ( lhs <= rhs) as u128 ) ,
1829+ BinaryOpKind :: Greater => Ok ( ( lhs > rhs) as u128 ) ,
1830+ BinaryOpKind :: GreaterEqual => Ok ( ( lhs >= rhs) as u128 ) ,
1831+ BinaryOpKind :: And => Ok ( lhs & rhs) ,
1832+ BinaryOpKind :: Or => Ok ( lhs | rhs) ,
1833+ BinaryOpKind :: Xor => Ok ( lhs ^ rhs) ,
1834+ BinaryOpKind :: ShiftRight => Ok ( lhs >> rhs) ,
1835+ BinaryOpKind :: ShiftLeft => Ok ( lhs << rhs) ,
1836+ BinaryOpKind :: Modulo => Ok ( lhs % rhs) ,
1837+ }
1838+ }
1839+ HirExpression :: Cast ( cast) => {
1840+ let lhs = try_eval_array_length_id_with_fuel ( interner, cast. lhs , span, fuel - 1 ) ?;
1841+ let lhs_value = Value :: Field ( lhs. into ( ) ) ;
1842+ let evaluated_value =
1843+ Interpreter :: evaluate_cast_one_step ( & cast, rhs, lhs_value, interner)
1844+ . map_err ( |error| Some ( ResolverError :: ArrayLengthInterpreter { error } ) ) ?;
1845+
1846+ evaluated_value
1847+ . to_u128 ( )
1848+ . ok_or_else ( || Some ( ResolverError :: InvalidArrayLengthExpr { span } ) )
1849+ }
1850+ _other => Err ( Some ( ResolverError :: InvalidArrayLengthExpr { span } ) ) ,
1851+ }
1852+ }
1853+
18541854/// Gives an error if a user tries to create a mutable reference
18551855/// to an immutable variable.
18561856fn verify_mutable_reference ( interner : & NodeInterner , rhs : ExprId ) -> Result < ( ) , ResolverError > {
0 commit comments