@@ -622,7 +622,7 @@ impl<'context> Elaborator<'context> {
622
622
623
623
let length = stmt. expression ;
624
624
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) ;
626
626
627
627
match result. map ( |length| length. try_into ( ) ) {
628
628
Ok ( Ok ( length_value) ) => return length_value,
@@ -633,88 +633,6 @@ impl<'context> Elaborator<'context> {
633
633
0
634
634
}
635
635
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
-
718
636
pub fn unify (
719
637
& mut self ,
720
638
actual : & Type ,
@@ -1851,6 +1769,88 @@ impl<'context> Elaborator<'context> {
1851
1769
}
1852
1770
}
1853
1771
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
+
1854
1854
/// Gives an error if a user tries to create a mutable reference
1855
1855
/// to an immutable variable.
1856
1856
fn verify_mutable_reference ( interner : & NodeInterner , rhs : ExprId ) -> Result < ( ) , ResolverError > {
0 commit comments