Parse error handling after a call/invoke
(&mut self)
| 1914 | |
| 1915 | // Parse error handling after a call/invoke |
| 1916 | fn parse_error_handling(&mut self) -> Option<ErrorHandler<'gc>> { |
| 1917 | let mut handler = None; |
| 1918 | if self.match_token(TokenType::Pipe) { |
| 1919 | self.consume( |
| 1920 | TokenType::Identifier, |
| 1921 | "Expect error variable name after '|'.", |
| 1922 | ); |
| 1923 | let error_var = self.previous; |
| 1924 | |
| 1925 | self.consume(TokenType::Pipe, "Expect closing '|' after error variable."); |
| 1926 | self.consume( |
| 1927 | TokenType::OpenBrace, |
| 1928 | "Expect '{' before error handler body.", |
| 1929 | ); |
| 1930 | |
| 1931 | let handler_body = self.block_expr(); |
| 1932 | |
| 1933 | handler = Some(ErrorHandler { |
| 1934 | error_var, |
| 1935 | handler_body, |
| 1936 | propagate: false, |
| 1937 | }); |
| 1938 | } else if self.match_token(TokenType::Question) { |
| 1939 | // Validate ? operator usage |
| 1940 | if !self.in_error_function() { |
| 1941 | self.error("Cannot use '?' operator in function that doesn't declare error types."); |
| 1942 | } else { |
| 1943 | // If we saw a ? but no handler, create an implicit propagation handler |
| 1944 | handler = Some(ErrorHandler { |
| 1945 | error_var: Token::default(), // Dummy token since we don't need a variable name |
| 1946 | handler_body: Vec::new(), // Empty body since we're just propagating |
| 1947 | propagate: true, |
| 1948 | }); |
| 1949 | } |
| 1950 | } |
| 1951 | |
| 1952 | handler |
| 1953 | } |
| 1954 | |
| 1955 | fn raise_statement(&mut self) -> Option<Stmt<'gc>> { |
| 1956 | if self.fn_type.is_lambda() { |
no test coverage detected